Skip to main content

属性:no_assign、no_assign_warning

语用 'no_assign' 如果将功能块的一个实例分配给同一功能块的另一个实例,则会导致显示编译器错误。如果功能块包含指针并且指针会导致问题,则通常应避免此类分配,因为在赋值期间它们也会被复制。

语用 'no_assign_warning' 结果与编译指示相同 'no_assign' 带有编译器警告而不是编译器错误。

句法

{attribute 'no_assign'}

插入位置:功能块声明部分的顶行。

281. 例子

分配包含指针的功能块实例。

在这个例子中,功能块实例的赋值会导致在执行过程中出现问题 fb_exit

VAR_GLOBAL
    inst1 : TestFB;
    awsBufferLogFile : ARRAY [0..9] OF WSTRING(66);(* Area: 0, Offset: 0x1304 (4868)*)
    LogFile : SEDL.LogRecord := (sFileName := 'LogFile.log', pBuffer := ADR(awsBufferLogFile), udiMaxEntriesFile := UDINT#10000, udiMaxBuffered := UDINT#10, uiLineSize := UINT#64, wsSep := " ", xCircular := TRUE, siDateFormat := SINT#0, siTimeFormat := SINT#0);
END_VAR

PROGRAM PLC_PRG
VAR
    inst2 : TestFB := inst1;
    LogFileNew
END_VAR

在这种情况下 LogRecord 管理一个指针列表,在以下情况下执行各种操作 fb_exit.由于分配导致问题,因为 fb_exit 将被执行两次。您应该通过添加属性来防止这种情况 'no_assign' 在功能块的声明中 测试FB

{attribute 'no_assign'}
FUNCTION_BLOCK TestFB
VAR_INPUT
...

然后显示以下编译器错误:

C0328: Assignment not allowed for type TestFB
C0328: Assignment not allowed for type LogRecord

如果语用 no_assign_warning 用于代替编译指示 no_assign 对于功能块 测试FB,那么 C0328 消息作为编译器警告发出,而不是编译器错误。