Home > IEC 61131-3 > IEC 61131-3: Coding Guidelines

IEC 61131-3: Coding Guidelines

Der Wunsch, die Qualität von Software zu erhöhen, ist sehr wahrscheinlich nur unwesentlich jünger als die Softwareentwicklung an sich. Gerade bei großen Projekten mit mehreren Entwicklern, sollte zu Beginn ein Regelwerk festgelegt werden, welches die Richtlinien für die Softwareentwicklung definiert. Erfreulicherweise hat die PLCopen vor einiger Zeit einen Entwurf speziell für die IEC 61131-3 veröffentlicht.

Die meisten Entwickler haben sicher schon die Situation erlebt, sich in ein Programm einzuarbeiten, dass man selber nicht geschrieben hat. Sehr schnell stellt man fest, dass jeder seinen eigenen ‘Programmierstil’ benutzt. Diese Unterschiede können dazu führen, das die Einarbeitung erschwert und somit zeitaufwendiger und fehleranfälliger wird. Aus diesem Grund definieren Firmen sehr häufig eigene Richtlinien für die Entwicklung von Software. Der Quellcode wirkt dadurch sauberer und homogener und kann somit leichter gewartet, erweitert und getestet werden kann. Außerdem können neue Kollegen schneller in ein Entwicklungsteam integriert werden.

Zu den Programmiersprachen wie Java, C++ oder C# existieren entsprechende Richtlinien schon länger. Diese werden i.d.R. von den Entwicklern anerkannt oder sind sogar Bestandteil der Ausbildung.

Der aktuelle Entwurf der PLCopen bietet speziell für die IEC 61131-3 ein firmenübergreifendes Regelwerk, das ein breites Spektrum an Aspekten berücksichtigt. So wurden auch Punkte aufgenommen, die den Quelltext besser portierbarer machen. Gerade hardwarenahe Programmierung (z.B. Pointer Arithmetic oder feste Adressen) kann ein späteres Übertragen auf eine andere Steuerungsplattform erschweren oder zu Fehlern im Programmablauf führen. Jede Regel besitzt eine eindeutige Kennung. In vielen Fällen erklären Beispiele den Hintergrund der jeweiligen Regel.

Derzeit sind über 60 Regeln definiert, die in 5 Kategorien aufgeteilt worden sind:

Naming Rules (N) Deklaration von Variablen, Tasks, Funktionsblöcke, Funktionen, Datentypen und Namespaces.
Comment Rules (C) Gestaltungshinweise zu Kommentaren.
Coding Practice (CP) allgemeine Hinweise zum Codieren.
Languages (L) Besonderheiten zu den einzelnen Darstellungsarten der IEC 61131-3.
Vendor Specific Extensions (E) Erweiterungen, die nicht zum Spektrum der IEC 61131-3 gehören.

Die Regeln sind nicht als Vorgabe zu sehen, sondern mehr als Vorschlag. Auch erheben diese keinen Anspruch auf Vollständigkeit. Es kann durchaus sinnvoll sein, bestimmte Regeln nicht zu berücksichtigen oder durch Weitere zu ergänzen.

Einigen Regeln würde ich persönlich nicht uneingeschränkt zustimmen. Als Beispiel ist die Regel L17 zu nennen. Diese besagt, dass IF-Anweisungen immer einen ELSE-Bereich haben sollten, auch dann, wenn diese leer sind.

Auch konnte ich einen (kleinen) Widerspruch zweier Regeln feststellen. Die Regel L10 verbietet die Anweisungen CONTINUE und EXIT. Bei den Regeln L12 und CP9 kommt EXIT allerdings bei den Beispielen zum Einsatz.

Manche Punkte sind auch als Ergänzung zur IEC 61131-3 zu sehen. So lässt die IEC 61131-3 es offen, ob die Zählvariable einer FOR-Schleife nach Beendigung der Schleife weiter benutzt werden darf. Die Regel L13 sagt hier ganz klar, dass die Zählvariable nicht weiter zu benutzen ist. Je nach Implementierung des Compilers kann das Verhalten des Programms unterschiedlich ausfallen.

So konnte ich aber auch beim Durchlesen der Coding Gudelines einiges Neues entdecken. Die Regel CP8 hat mich auf eine Besonderheit hingewiesen: Die Ungenauigkeiten von Fließkommazahlen muss bei einem Vergleich berücksichtigt werden. Ansonsten können Programmbereiche entstehen, die nur schwer zu warten sind. Hier ein Beispiel:

Picture01

Obwohl die beiden Variablen scheinbar den Wert 0.1 besitzen, ist die Bedingung nicht erfüllt. Die Variable bResult wird nicht auf TRUE gesetzt. Diese liegt in der unterschiedlichen Ungenauigkeit der Datentypen REAL und LREAL. Den Wert 0.1 kann keine der beiden Variablen exakt abbilden (nur Näherungswerte) und diese Näherungswerte sind eben unterschiedlich. Ein einfaches Beispiel verdeutlicht diese Ungenauigkeiten:

Picture04

100 * 0.1 ergibt eben nicht, wie erwartet, 10.0, sondern Werte die etwas größer oder kleiner sind.

Die Regel CP8 empfiehlt deshalb auf einen Wertebereich und nicht einen exakten Vergleich zu prüfen:

Picture02

Aber auch beim Vergleichen von Integer-Zahlen kann es, je nach Implementierung des Compilers, zu ‘bösen’ Überraschungen kommen.

Picture03

Die Variablen diValue und udiValue haben auf den ersten Blick unterschiedliche Werte. Da aber bei dem Vergleich eine implizite Typkonvertierung stattfindet und die Werte das gleiche Bitmuster haben, erhalten beide Variablen die gleiche Wertigkeit. Die Bedingung ist erfüllt und bResult wird auf TRUE gesetzt. Aktuelle IEC 61131-3 Compiler sollten dieses erkennen und eine Warnung ausgeben.

Die Coding Guidelines sind aus meiner Sicht sowohl für den Anfänger, als auch für den erfahrenden Programmierer eine gute Informationsquelle. Entwicklungsteams können diese als Grundlage für die eigenen Programmierrichtlinien nutzen und entsprechend ergänzen oder auch Regeln ausklammern.

Die PLCopen hat in ihrem Newsletter vom Dezember 2015 weitere Guidlines angekündigt. Folgende Themen sind geplant:

  • Dokumentation
  • OOP
  • Softwareentwicklungsprozess
  • Softwarequalität

Die aktuellen Coding Gudielines können über die Homepage der PLCopen angefordert werden (www.PLCopen.org).

Wer sich tiefer mit diesem Thema beschäftigen möchte, dem kann ich die folgenden Bücher empfehlen:

Clean Code von Robert C. Martin

Code Complete von Steve McConnel

Beide Bücher beziehen sich mehr auf Java sind aber in vielen Bereichen auch auf die IEC 61131-3 anwendbar.

Advertisements
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: