Bezeichner für Variablen und Instanzen
Bei der Bezeichnung von Variablen und Instanzen beachten Sie die folgenden Punkte:
- Präfixe von Variablen- und Instanznamen werden kleingeschrieben.
- Das erste Zeichen nach dem Präfix wird großgeschrieben (Option Erstes Zeichen nach Präfix soll ein Großbuchstabe sein der Namenskonventionen vom Static Analysis aktivieren, siehe folgenden Hinweis zum Static Analysis).
Static Analysis:
Beachten Sie auch die Möglichkeit zur Überprüfung der Programmierkonventionen mit Hilfe von TE1200 PLC Static Analysis.
Präfixe:
1) Variablen elementarer und dynamischer Datentypen:
Typ | Präfix | Beschreibung | Deklarations-beispiel | Aufrufbeispiel | Static Analysis |
---|---|---|---|---|---|
SINT, USINT, | n | Integer, | nErrorID : UDINT; | nErrorID := 16#745; | NC0005-NC0016, NC0035, NC0037, NC0038, NC0160 |
BOOL, BIT | b | boolean (bit) | bConfigured |
| NC0003, NC0004 |
REAL, LREAL | f | float | fPosition |
| NC0017, NC0018 |
STRING | s | string | sNetID |
| NC0019 |
WSTRING | ws | wide string (unicode) | wsRouteName |
| NC0020 |
TIME, LTIME | t | time | tDelay |
| NC0021, NC0022 |
TIME_OF_DAY | td | time of day | tdClockTime |
| NC0025 |
DATE | d | date | dProductionStart |
| NC0023 |
DATE_AND_TIME | dt | date and time | dtProductionStart |
| NC0024 |
ARRAY[...] OF ... | a | array | aMessages |
| NC0030 |
POINTER TO ... | p | pointer | pData | pData := ADR(aBuffer); | NC0026 |
POINTER TO POINTER TO ... | pp | Verschachtelter Zeiger | ppData |
|
|
POINTER TO INTERFACE | pip | Zeiger auf eine Schnittstelle | pipCylinder |
|
|
REFERENCE TO ... 1) als Methodeneingang 2) in sonstigen Fällen | 1) entsprechend dem Basisdatentyp der Referenz 2) ref | Referenz | 1) nData (bei REFERENCE TO INT) 2) refSize | 1) SampleMethod(nData := <…>) 2) refSize REF= nSize; | NC0027 |
- Zeiger / Pointer:
- Typisierte Pointer aus Sicherheitsgründen untypisierten Pointern vorziehen.
- Pointer als POINTER TO <Datentyp> deklarieren, wobei der <Datentyp> dem Datentyp der Variablen entspricht, auf den der Pointer verweisen soll.
- Ein Pointer, der auf ein Array zeigen soll, als POINTER TO ARRAY[...] OF <Datentyp> deklarieren, wobei der <Datentyp> dem Datentyp des Arrays entspricht, auf das verwiesen werden soll.
- Ist der Datentyp der Variablen, auf die ein Pointer zeigen soll, unbekannt und damit untypisierbar, sollte er als POINTER TO BYTE (oder PVOID) deklariert werden. Eine Verwendung des Datentyps DWORD als Zeiger ist aus Gründen der 64bit-Kompatibilität nicht zulässig.
- Die Dereferenzierung eines Pointers erfolgt über den Inhaltsoperator '^'.
- Achten Sie besonders auf die Gültigkeit der Adresse, auf die ein Pointer zeigt.
Beispiel 1:
nSample : INT;
pSampleToInt : POINTER TO INT;
pSampleToInt := ADR(nSample)
pSampleToInt^ := 123; // Result: nSample = 123
Beispiel 2:
aSample : ARRAY[1..3] OF LREAL;
pSampleToArrayOfLreal : POINTER TO ARRAY[1..3] OF LREAL;
pSampleToArrayOfLreal := ADR(aSample);
pSampleToArrayOfLreal^[2] := 4.56; // Result: aSample[2] = 4.56
- Pointerarithmetiken / Pointervergleiche:
- Wenn möglich, verzichten Sie aus Sicherheitsgründen auf Pointerarithmetiken und die Anwendung von Vergleichsoperatoren auf Pointer (z. B. Inkrementierungen wie [pSampleToLreal := pSampleToLreal + SIZEOF(LREAL)] oder Pointervergleiche mittels >, >=, <, <=).
- Falls Sie auf diese Operationen nicht verzichten können, verwenden Sie sie höchstens innerhalb eines Arrays.
- Achten Sie dabei ist besonders darauf, dass die Pointer auf Elemente des gleichen Arrays zeigen und dass der Adressbereich des Arrays nicht verlassen wird.
2) Instanzen von Objekten und benutzerdefinierter Datentypen:
Instanzen von Funktionsbausteinen, die in der IEC61131-Norm definiert und von grundlegender Bedeutung sind (R_TRIG, TON...), besitzen kein anderes Präfix. Beispiel für eine korrekte Benennung:
fbAdsTimer : TON;
Typ | Präfix | Beschreibung | Deklarationsbeispiel | Aufrufbeispiel | Static Analysis |
---|---|---|---|---|---|
FUNCTION_BLOCK | fb | Instanz eines Funktions-bausteins | fbWritePersData : FB_WritePersistentData; | fbWritePersData(); | NC0031 |
STRUCT | st | Instanz einer Struktur | stBufferEntry : ST_BufferEntry; | stBufferEntry.nCounter := 5; | NC0032 |
ENUM | e | Instanz einer | eMachineState : E_MachineState; | eMachineState := E_MachineState.Stop; | NC0029 |
TYPE (Alias) | entsprechend dem internen Datentyp | Instanz eines Aliastyps | nNibble : T_Nibble; | nNibble := 16#1; | NC0033 Siehe auch: Platzhalter {datatype} |
INTERFACE | ip | Instanz einer Schnittstelle | ipCylinder : I_Cylinder; | ipCylinder := fbCylinderBase; | NC0036 |
UNION | u | Instanz einer Union | uCtrl : U_Control; | uCtrl.aRegister[1] := 16#02; | NC0034 |
3) Sonstiges:
Typ | Präfix | Beschreibung | Deklarationsbeispiel | Static Analysis |
---|---|---|---|---|
Verschachtelte Typen | Lediglich entsprechend dem äußersten Typ Ausnahme 1: 'pp' für POINTER TO POINTER TO Ausnahme 2: 'pip' für POINTER TO INTERFACE |
| pTelegramData : POINTER TO ARRAY[0..7] OF BYTE; | Option Rekursive Präfixe für kombinierbare Datentypen deaktivieren Siehe auch: Namenskonventionen (2) |
Lokale und globale Konstanten | c |
| VAR CONSTANT VAR_GLOBAL CONSTANT | NC0062, NC0070 |
Globale Variablen |
| Für globale Variablen gelten die gleichen Namensregeln. (Hängen Sie vor den Variablennamen kein zusätzliches zweites Präfix.) | VAR_GLOBAL | Option Namensraumpräfix mit Datentyppräfix kombinieren deaktivieren Siehe auch: Namenskonventionen (2) |
HRESULT | hr |
| hrErrorCode : HRESULT; | NC0160 |
PVOID | p | pointer | pData : PVOID; | NC0160 |
GUID |
| Für eine GUID wird kein Präfix vergeben. |
|
|
AT%I* | optional vor dem Datentyppräfix: I | allokierter Eingang | fActPos AT%I*: LREAL; |
|
AT%Q* | optional vor dem Datentyppräfix: O | allokierter Ausgang | fSetPos AT%Q*: LREAL; |
|
Allokierte Ein- bzw. Ausgänge können optional mit einem 'I' bzw. 'O' als zusätzliches Präfix vor dem Datentyppräfix versehen werden. Für Instanzen stellt es das einzige Präfix dar, das großgeschrieben wird. Halten Sie sich konsequent an die Entscheidung für oder gegen die Nutzung dieses optionalen Präfixes, sodass die Bezeichnung von allokierten Variablen projektweit einheitlich ist.