演算子:__ NEW
演算子は、IEC61131-3規格の拡張です。
The __NEW
演算子は、機能ブロック、ユーザー定義のデータ型、または標準型の配列をインスタンス化するために動的メモリを予約します。演算子は、一致する型付きポインターを返します。
要件:親アプリケーションのプロパティダイアログで、 アプリケーションビルドオプション タブ、 動的メモリ割り当てを使用する オプションが選択されています。
構文
<pointer name> := __NEW( <type> ( , <size> )? ); __DELETE( <pointer name> ); <type> : <function block> | <data unit type> | <standard data type>
オペレーターは、タイプのインスタンスを生成します <type>
そして、このインスタンスへのポインタを返します。次に、インスタンスの初期化が呼び出されます。もしも <type>
はスカラー標準データ型であり、オプションのオペランド <size>
も評価されます。次に、演算子はタイプの配列を生成します <standard data type>
とサイズ <size>
。メモリの割り当てに失敗した場合は、 __NEW
値を返します 0
。
割り当て内で演算子を使用する ":=
";それ以外の場合は、エラーメッセージが表示されます。
インスタンスがで動的に作成される関数ブロックまたはユーザー定義データ型 __NEW
固定メモリ領域を使用します。ここでは、オブジェクトをプラグマでマークする必要があります {attribute 'enable_dynamic_creation'}
。ライブラリの一部である機能ブロックには必要ありません。
ヒント
オンラインモードで機能ブロックのデータレイアウトを変更すると、後でオンライン変更を使用してログインを実行することはできません。これは、ファンクションブロックインスタンスのメモリ領域が無効になっているためです。関数ブロックに新しい変数を追加したり、既存の変数を削除したり、変数のデータ型を変更したりするときに、データレイアウトを変更します。
配列 (DWORD
)。
PROGRAM PLC_PRG VAR pdwScalar : POINTER TO DWORD; //Typed pointer xInit : BOOL := TRUE; xDelete : BOOL; END_VAR IF (xInit) THEN pdwScalar := __NEW(DWORD, 16); // Allocates memory (16 dwords) and assigns them to pointer pdwScalar END_IF IF (xDelete) THEN __DELETE(pdwScalar); // Frees memory of pointer END_IF
ファンクションブロック
{attribute 'enable_dynamic_creation'} FUNCTION_BLOCK FBComputeGamma VAR_INPUT iAlpha : INT; iBeta : INT; END_VAR VAR_OUTPUT iGamma : INT; END_VAR VAR END_VAR iGamma := iAlpha + iBeta; PROGRAM PLC_PRG VAR pComputeGamma : POINTER TO FBComputeGamma; // Typed pointer xInit : BOOL := TRUE; xDelete : BOOL; iResult : INT; END_VAR IF (xInit) THEN pComputeGamma := __NEW(FBComputeGamma); // Allocates memory xInit := FALSE; END_IF pComputeGamma^.iAlpha := (pComputeGamma^.iAlpha + 1)MOD 100; // Sets first input of pComputeGamma pComputeGamma^.iBeta := 10; // Sets second input of pComputeGamma pComputeGamma^(); // Calls the FB pComputeGamma is pointing to iResult := pComputeGamma^.iGamma; // Reads output of pComputeGamma IF (xDelete) THEN __DELETE(pComputeGamma); // Frees memory END_IF
ユーザー定義データ型(DUT)
{attribute 'enable_dynamic_creation'} TYPE ABCDATA : STRUCT iA, iB, iC, iD : INT; END_STRUCT END_TYPE PROGRAM PLC_PRG VAR pABCData : POINTER TO ABCDATA; // Typed pointer xInit : BOOL := TRUE; xDelete : BOOL; END_VAR IF (xInit) THEN pABCData := __NEW(ABCDATA); // Allocates memory xInit := FALSE; END_IF IF (xDelete) THEN __DELETE(pABCData); // Frees memory END_IF
アレイ(BYTE)
PROGRAM PLC_PRG VAR pbDataAlpha : POINTER TO BYTE; pbDataBeta : POINTER TO BYTE; xInit : BOOL := TRUE; xDelete : BOOL; usiCnt : USINT; bTestC: BYTE; END_VAR IF (xInit) THEN pbDataAlpha := __NEW(BYTE, 16); // Allocates 16 bytes for pbDataAlpha pbDataBeta := __NEW(BYTE); // Allocates memory for pbDataBeta xInit := FALSE; FOR usiCnt := 0 TO 15 DO pbDataAlpha[usiCnt] := usiCnt; // Writes to new array END_FOR pbDataBeta^:= 16#FF; // Writes to new data END_IF bTestC := pbDataAlpha[12]; // Reads new array by index access IF (xDelete) THEN // Frees memory __DELETE(pbDataAlpha); __DELETE(pbDataBeta); END_IF
重要
両方を呼び出す2つのタスクを同時に実行することはお勧めしません __NEW
オペレーター。セマフォ(SysSemEnter
)またはの同時呼び出しを防ぐための同等の手法 __NEW
。ただし、これにより、次の場合にジッターが高くなります。 __NEW
広く適用されます。
電話することをお勧めします __NEW
1つのタスクの演算子のみ。