Programmierung

In diesem Abschnitt der SPS-Programmierkonventionen werden die folgenden Themenpunkte behandelt.

Beachten Sie auch die Möglichkeit zur Überprüfung der Programmierkonventionen mit Hilfe von TE1200 PLC Static Analysis.

Allgemeines

Schleifen und Bedingungen

  1. CASE-Anweisung nur mit Enumerationsinstanz [++]
  2. Grenzen einer Schleife als Konstante deklarieren [+]
  3. In CASE-Anweisung alle Enumerationswerte der Enumerationsvariablen behandeln [+]
  4. IF-ELSIF-Anweisungen mit ELSE-Zweig [+]
  5. Reihenfolge der IF Bedingungen [+]

Fehlercodes

  1. Datentyp für Fehlercodes [++]
  2. Fehlerinformation an Funktionen und Methoden [+]
  3. Fehlerinformation an Funktionsbausteinen [+]

Lesbarkeit, Wartbarkeit

  1. Keine unbenutzten Deklarationen/Objekte oder unnützen Code [++]
  2. Keine „magischen Werte/magic numbers“ [+]
  3. Kein mehrfaches Nutzen gleicher Namen [+]
  4. Gleiche Notation in Deklaration und Implementierung [+]
  5. Leere Statements (;) vermeiden [+]
  6. Jede Zuweisung in separater Codezeile [+]

Bibliotheken

Entwicklung von Bibliotheken

  1. Bibliotheksnamen [++]
  2. Versionierung [++]
  3. Kapselung interner Typdefinitionen [+]
  4. Bezeichner in Bibliotheken [+]

Verwendung von Bibliotheken

  1. Bibliotheksverwendung [++]
  2. Versionsüberprüfung [++]
  3. Fixieren von Bibliotheksversionen [+]

DUTs

Implementierung von DUTs

  1. Attribute 'qualified_only' und 'strict' bei Enumeration verwenden [++]
  2. Bei Enumeration keinen, nur den ersten oder alle Werte initialisieren [+]

Verwendung von DUTs

  1. Enumerationsvariablen nur zugehörige Enumeratoren zuweisen [++]

POUs

Implementierung von Funktionen, Methoden, Aktionen

  1. Kein „Call by value“ von großen Parametern in Funktionen/Methoden [++]
  2. Keine großen Variablen in Funktionen/Methoden deklarieren [++]
  3. Keine Aktionen verwenden [+]
  4. Alle Parameter einer Funktion/Methode intern verwenden [+]
  5. Rückgabewert einer Funktion/Methode nur an einer Stelle zuweisen [+]
  6. Zugriff auf Methoden so weit wie möglich einschränken [+]
  7. Gruppierung von Parametern als Struktur [+]

Verwendung von Funktionen, Methoden

  1. Zurückgelieferte Fehlerinformationen einer POU auswerten [++]
  2. Rückgabewert einer Funktion/Methode verwenden [+]
  3. Funktionen/Methoden nicht in sich selbst aufrufen [+]

Implementierung von Funktionsbausteinen

  1. Online-Change-Fähigkeit sicherstellen [++]
  2. Einheitliche Schnittstelle bei einmaliger asynchroner Abarbeitung [+]
  3. Einheitliche Schnittstelle bei kontinuierlicher asynchroner Abarbeitung [+]
  4. Alle Parameter eines Funktionsbausteins intern verwenden [+]
  5. Gruppierung von Parametern als Struktur [+]

Verwendung von Funktionsbausteinen

  1. Funktionsbaustein-Instanzen nicht als VAR PERSISTENT deklarieren [++]
  2. Zurückgelieferte Fehlerinformationen einer POU auswerten [++]
  3. Auf lokale Variablen einer POU nicht von außen zugreifen [++]
  4. Keine direkte Zuweisung von Objekten [++]
  5. Keine temporären Funktionsbaustein-Instanzen [+]

Variablen

Allgemein

  1. Fließkommazahlen nicht auf Gleichheit bzw. Ungleichheit testen [++]
  2. Unerwünschte Ergebnisse mit Hilfe von explizitem Casten vermeiden [+]

Variablenkapselung

  1. Nicht veränderte Variablen als VAR CONSTANT deklarieren [+]
  2. Globalere Bezeichner nicht verschatten [+]
  3. ADS Zugriff einschränken [+]

Arrays

  1. Array-Grenzen über Konstanten definieren [++]
  2. Array-Untergrenze von 1 [+]

Pointer, Referenzen, Interfaces

  1. Temporäre Existenz von Pointern/Referenzen/Interfaces auf temporär existierende Objekte [++]
  2. Pointer/Referenzen jeden Zyklus neu setzen [++]
  3. Pointer/Referenzen/Interfaces vor jeder Verwendung prüfen [++]
  4. Referenzen gegenüber Pointern vorziehen [++]

Allokierte Variablen

  1. Keine direkte Adressierung verwenden [++]
  2. Mehrfache Schreibzugriffe auf Ausgänge vermeiden [++]
  3. Überlappende Speicherbereiche von Adressvariablen vermeiden [+]

Globale Variablen

  1. Attribut 'qualified_only' bei GVL verwenden [+]
  2. Globale Variablen mit Bedacht verwenden [+]

Strings

  1. Bezeichner für Größen- und Längenangaben [++]
  2. Empfohlene Default-Größe [+]
  3. Übergabe von großen Strings [+]
  4. Verarbeitung von großen Strings [+]

Laufzeitverhalten

Allgemein

  1. Division durch Null abfangen. [++]

Dynamischer Speicher

  1. Dynamische Speicherallokationen mit Bedacht durchführen [++]

Multiple Tasks

  1. Konkurrierende Zugriffe auf Speicherbereiche vermeiden [++]
  2. Konkurrierende Zugriffe auf Funktionsbausteine vermeiden [++]
  3. Globale Variablen mit Bedacht verwenden [+]