属性: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
2回実行されます。属性を追加してこれを防ぐ必要があります 'no_assign'
機能ブロックの宣言で TestFB:
{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
機能ブロック用 TestFB、 そうして C0328
メッセージは、コンパイラエラーとしてではなく、コンパイラ警告として発行されます。