演算子:__ DELETE
演算子は、IEC61131-3規格の拡張です。
重要
互換性のために、コンパイラのバージョンは3.3.2.0以上である必要があります。
オペレーターは、「__ NEW」オペレーターが動的に生成したインスタンスのメモリーを解放します。 The __DELETE 演算子には戻り値がなく、この演算の後、オペランドはゼロに設定されます。
要件: 動的メモリ割り当てを使用する オプションが選択されている アプリケーションビルドオプション アプリケーションのプロパティダイアログのタブ。
__DELETE (<pointer>)
重要
2つのタスクが同時に__DELETEを呼び出さないようにする必要があります。セマフォ(SysSemEnter)または同等のメソッドを使用して、__ DELETEの同時呼び出しを防止するか、1つのタスクでのみ__DELETEを使用します(推奨)。
セマフォ(SysSemEnter)を使用して、2つのタスクが同時にメモリを割り当てるのを防ぐことができます。結果として、 __DELETE より高いジッターを引き起こします。
もしも Pointer 関数ブロックを参照し、次に CODESYS 関連する呼び出し FB_EXIT ポインタがゼロに設定される前のメソッド。
例 150. 例
機能ブロック
FUNCTION_BLOCK FBDynamic VAR_INPUT in1, in2 : INT; END_VAR VAR_OUTPUT out : INT; END_VAR VAR test1 : INT := 1234; _inc : INT := 0; _dut : POINTER TO DUT; neu : BOOL; END_VAR out := in1 + in2;
方法 (FB_Exit)
METHOD FB_Exit : BOOL VAR_INPUT bInCopyCode : BOOL; END_VAR __Delete(_dut);
方法 (FB_Init)
METHOD FB_Init : BOOL
VAR_INPUT
bInitRetains : BOOL;
bInCopyCode : BOOL;
END_VAR
_dut := __NEW(DUT);
方法
METHOD INC : INT VAR_INPUT END_VAR _inc := _inc + 1; INC := _inc;
プログラム
PLC_PRG(PRG)
VAR
pFB : POINTER TO FBDynamic;
bInit: BOOL := TRUE;
bDelete: BOOL;
loc : INT;
END_VAR
IF (bInit) THEN
pFB := __NEW(FBDynamic);
bInit := FALSE;
END_IF
IF (pFB <> 0) THEN
pFB^(in1 := 1, in2 := loc, out => loc);
pFB^.INC();
END_IF
IF (bDelete) THEN
__DELETE(pFB);
END_IF