Dieser Operator wird in der Norm IEC 61131-3 nicht beschrieben.
Der Operator __NEW weist den Funktionsbausteininstanzen oder Arrays von Standarddatentypen Speicher zu. Der Operator gibt einen Zeiger auf das Objekt mit geeignetem Typ zurück. Wenn der Operator nicht in einer Zuweisung verwendet wird, wird eine Meldung ausgegeben.
Aktivieren Sie die Option Dynamische Speicherallozierung verwenden in der Ansicht Optionen Applikationserzeugung (Ansicht > Eigenschaften... > Optionen Applikationserzeugung), um den __NEW-Operator zu verwenden. Weitere Informationen finden Sie im Programmierhandbuch Ihrer Steuerung. für Informationen zur Verfügbarkeit der Optionen mit Ihrer Steuerung.
Wenn kein Speicher zugewiesen werden konnte, wird __NEW 0 ausgeben.
Zur Freigabe verwenden Sie __DELETE.
__NEW (<Typ>, [<Größe>]
Der Operator erstellt ein neues Objekt des spezifizierten Typs <type> und gibt einen Zeiger zu <type> zurück. Anschließend wird die Initialisierung der Instanz aufgerufen. Wenn 0 zurückgegeben wird, ist die Operation fehlgeschlagen.
HINWEIS: Verwenden Sie den exakten Datentyp des abgeleiteten Funktionsbausteins und nicht denjenigen des Basis-Funktionsbausteins. Verwenden Sie keine Variable vom Typ POINTER TO BaseFB. Das ist notwendig, wenn der Basis-Funktionsbaustein keine FB_Exit-Funktion implementiert. Bei der weiteren Verwendung von __DELETE(pBaseFB) wird FB_Exit dann nicht aufgerufen.
Wenn <type> skalar ist, muss der optionale Operand <length> zusätzlich festgelegt werden und der Operator erstellt ein Array an Skalartypen mit der Seitenlänge.
pScalarType := __New(ScalarType, length);
HINWEIS: Ein mit __NEW erstellter Funktionsbaustein verfügt über einen festen Speicherbereich. Das Datenlayout kann nicht über eine Online-Änderung geändert werden. Aus disesem Grund können keine neuen Variablen hinzugefügt oder gelöscht und keine Typen geändert werden.
Demzufolge sind nur Funktionsbausteine aus Bibliotheken (da diese unveränderlich sind) und Funktionsbausteine mit dem Attribut enable_dynamic_creation für den Operator __NEW zugelassen. Wenn ein Funktionsbaustein mit dieser Kennzeichnung geändert werden soll, so dass Copy-Code notwendig wird, wird eine Fehlermeldung ausgegeben.
HINWEIS: Der Code für die Speicherzuweisung muss wiedereintrittsfähig sein.
Ein Semaphor (SysSemEnter) wird verwendet, um zu verhindern, das 2 Tasks gleichzeitig versuchen, Speicher zuzuordnen. Deswegen kann eine extensive Verwendung von __New zu verstärktem Jitter führen.
Beispiel mit einem skalaren Typen:
TYPE DUT :
STRUCT
a,b,c,d,e,f : INT;
END_STRUCT
END_TYPE
PROGRAM PLC_PRG
VAR
pDut : POINTER TO DUT;
bInit: BOOL := TRUE;
bDelete: BOOL;
END_VAR
IF (bInit) THEN
pDut := __NEW(DUT);
bInit := FALSE;
END_IF
IF (bDelete) THEN
__DELETE(pDut);
END_IF
Beispiel mit einem Funktionsbaustein:
{attribute 'enable_dynamic_creation'}
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;
END_VAR
out := in1 + in2;
PROGRAM_PLC_PRG
VAR
pFB : POINTER TO FBDynamic;
loc : INT;
bInit: BOOL := TRUE;
bDelete: BOOL;
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
Beispiel mit einem Array:
PLC_PRG(PRG)
VAR
bInit: BOOL := TRUE;
bDelete: BOOL;
pArrayBytes : POINTER TO BYTE;
test: INT;
parr : POINTER TO BYTE;
END_VAR
IF (bInit) THEN
pArrayBytes := __NEW(BYTE, 25);
bInit := FALSE;
END_IF
IF (pArrayBytes <> 0) THEN
pArrayBytes[24] := 125;
test := pArrayBytes[24];
END_IF
IF (bDelete) THEN
__DELETE(pArrayBytes);
END_IF