如果将一个功能块实例分配给另一个相同功能块实例,pragma'no_assign'
会导致编译器显示错误。如果功能块中包含指针,则通常应避免此类赋值,因为在赋值过程中,指针也会被复制,从而导致问题。
pragma'no_assign_warning'
的结果与 pragma'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: Assignment not allowed for type TestFB C0328: Assignment not allowed for type LogRecord
如果在功能块“TestFB ”中使用了 pragma no_assign_warning
而不是 pragma no_assign
,那么 C0328
消息将作为编译器警告发出,而不是作为编译器错误发出。