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 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 メッセージは、コンパイラエラーとしてではなく、コンパイラ警告として発行されます。