Skip to main content

演算子:__ 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'}。ライブラリの一部である機能ブロックには必要ありません。

ヒント

オンラインモードで機能ブロックのデータレイアウトを変更すると、後でオンライン変更を使用してログインを実行することはできません。これは、ファンクションブロックインスタンスのメモリ領域が無効になっているためです。関数ブロックに新しい変数を追加したり、既存の変数を削除したり、変数のデータ型を変更したりするときに、データレイアウトを変更します。

150.

配列 (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つのタスクの演算子のみ。