演算子:__ 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つのタスクの演算子のみ。