__NEW
Dieser Operator wird in der Norm IEC 61131-3 nicht beschrieben.
Der Operator __NEW
weist den Funktionsbausteininstanzen, benutzerdefinierten Datentypen oder Arrays von Standarddatentypen dynamischen 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 SoMMenu/index.htm ( ), 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
.
<pointer name> := __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.
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 <size>
zusätzlich festgelegt werden und der Operator erstellt ein Array an Skalartypen mit der Seitenlänge.
pScalarType := __New(ScalarType, length);
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.
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:
{attribute 'enable_dynamic_creation'}
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
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);
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