属性: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
消息作为编译器警告发出,而不是编译器错误。