.
属性‘no_assign’, 属性‘no_assign_warning’
.
.

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

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

语法

{attribute 'no_assign'}

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

.

.例如

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

在此示例中,功能块实例的值分配将在执行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将执行两次。您应该通过在功能块TestFB的声明中添加属性'no_assign'来防止这种情况:

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

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

C0328: 类型TestFB不允许分配
C0328:不允许为LogRecord类型分配
 

如果使用功能块TestFB的编译指示no_assign_warning而不是杂注no_assign,则C0328消息将作为编译器警告而不是编译器错误发出。