4. Einstieg in das IEC-Programmiersystem CoDeSys - B.Eng ...
4. Einstieg in das IEC-Programmiersystem CoDeSys - B.Eng ...
4. Einstieg in das IEC-Programmiersystem CoDeSys - B.Eng ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Grundlagen der Automatisierungstechnik I<br />
<strong>4.</strong> <strong>E<strong>in</strong>stieg</strong> <strong>in</strong> <strong>das</strong> <strong>IEC</strong>-<strong>Programmiersystem</strong> <strong>CoDeSys</strong><br />
<strong>CoDeSys</strong>: Controller Development System (Entwicklungssystem für Automatisierungs-Systeme)<br />
<strong>4.</strong>1 Schlüsselworte und Bezeichner<br />
Schlüsselwörter s<strong>in</strong>d Zeichenkomb<strong>in</strong>ationen, die ke<strong>in</strong>e e<strong>in</strong>gebetteten Leerzeichen enthalten dürfen.<br />
Schlüsselwörter s<strong>in</strong>d festgelegt und dürfen für ke<strong>in</strong>en anderen Zweck (z.B. als Variablennamen!)<br />
benutzt werden. Schlüsselworte werden grundsätzlich mit Großbuchstaben geschrieben!<br />
Beispiele für Schlüsselworte: ACTION...END_ACTION ; ARRAY...OF ; AT<br />
Bezeichner können frei gewählt werden. Sie s<strong>in</strong>d e<strong>in</strong>e Folge von Buchstaben, Ziffern und<br />
Unterstrichzeichen ( _ ). Sie müssen mit e<strong>in</strong>em Buchstaben oder Unterstrichzeichen beg<strong>in</strong>nen.<br />
Mehrere voranstehende und mehrfach e<strong>in</strong>gebettete Unterstriche s<strong>in</strong>d unzulässig. Außerdem dürfen<br />
Bezeichner ke<strong>in</strong>e Leerstellen enthalten. Zum<strong>in</strong>dest sechs Zeichen müssen <strong>in</strong> sämtlichen Systemen<br />
unterstützt werden.<br />
Beispiel e<strong>in</strong>es Bezeichners: VENTIL_6<br />
-> hierzu Anhang: Schlüsselworte, Bezeichner und Literale<br />
<strong>4.</strong>2 Beschreibung der Struktur von Automatisierungssystemen<br />
Wie bereits <strong>in</strong> den Grundlagen Abschnitt 1.5.5 ausgeführt, gibt es <strong>in</strong> Automatisierungssystemen zu<br />
konfigurierende Elemente und zu programmierende Elemente.<br />
E<strong>in</strong> Softwaremodell nach <strong>IEC</strong> 61131-3 muss selbstverständlich Strukturen und Funktionen von<br />
Automatisierungssystemen über die Grenzen von E<strong>in</strong>-Prozessor-Programmen h<strong>in</strong>aus<br />
ermöglichen, beispielsweise <strong>das</strong> Multi-Task<strong>in</strong>g e<strong>in</strong>er CPU oder die Zusammenarbeit mehrerer CPU<br />
oder die Zusammenarbeit vernetzter Systeme.<br />
Dazu werden<br />
• die Ressourcen der Automatisierungssysteme per Software konfiguriert<br />
• die Programme <strong>in</strong> Programmorganisationse<strong>in</strong>heiten (POE's) gegliedert<br />
Die zu konfigurierenden Elemente s<strong>in</strong>d z.B. die Ressourcen, die Task's, globale Variablen, die über<br />
Resourcengrenzen wirken, Kommunikationspfade u.a. Die Begriffe zur Strukturierung der Software<br />
<strong>in</strong> Automatisierungssystemen zeigt nachfolgendes Schema.<br />
Konfigurationselemente<br />
Konfiguration<br />
Resourcen<br />
Task oder<br />
Laufzeitprogramm<br />
POE<br />
POE<br />
POE<br />
Gesamtsystem, z.B. mit 3 CPU<br />
Diese 3 CPU’s bilden die Resourcen des<br />
Systems<br />
E<strong>in</strong>zelne CPU<br />
Die Resourcen arbeiten im Gesamtsystem<br />
zusammen<br />
Lauffähiges Programm als E<strong>in</strong>heit oder aber <strong>in</strong><br />
Teile<strong>in</strong>heiten oder Task gegliedert<br />
Bauste<strong>in</strong>e der Programme, die den Resourcen<br />
oder Task’s von Resourcen zugeordnet s<strong>in</strong>d<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-1<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Wenn auf e<strong>in</strong>er Hardwareumgebung mehrere Programme unabhängig vone<strong>in</strong>ander und gleichzeitig<br />
laufen, muss den Programmen<br />
• e<strong>in</strong>e bestimmte Rechenzeit auf e<strong>in</strong>er bestimmten Hardware und / oder<br />
• e<strong>in</strong>e Priorität und e<strong>in</strong>e Startbed<strong>in</strong>gung (zyklisch oder Interrupt)<br />
zugeteilt werden.<br />
Dann müssen Variablen häufig von mehreren Programmen gleichzeitig genutzt werden können.<br />
Die notwendigen Informationen über die Systeme und ihr Zusammenwirken werden <strong>in</strong> e<strong>in</strong>e<br />
Konfiguration mit dem Schlüsselwort CONFIGURATION geschrieben. Nachfolgender Kasten zeigt<br />
e<strong>in</strong> formales Beispiel, wie solche Konfigurationen mit entsprechenden Schlüsselwörtern beschrieben<br />
werden.<br />
Wichtig <strong>in</strong> diesem Zusammenhang ist der Begriff „Laufzeitprogramm“. Darunter versteht man e<strong>in</strong><br />
Gesamtprogramm mit Laufzeit-Eigenschaften, bestehend aus sämtlichen benötigten POE's und allen<br />
Task. Mit dieser Def<strong>in</strong>ition ist e<strong>in</strong> Laufzeitprogramm e<strong>in</strong>e <strong>in</strong> sich abgeschlossene Programme<strong>in</strong>heit, die<br />
selbständig <strong>in</strong> e<strong>in</strong>er CPU ablaufen kann.<br />
E<strong>in</strong> Automatisierungssystem kann aus mehreren multitask-fähigen CPU's sowie Spezialkomponenten<br />
(-> Rechner-Ressourcen) bestehen.<br />
Variablen vom Typ ACCESS werden benutzt, um Kommunikationskanäle zwischen Ressourcen zu<br />
beschreiben.<br />
CONFIGURATION Autom_Qualitaetsüberwachung<br />
VAR_GLOBAL<br />
Auftrag:INT;<br />
Qualitätskennziffer:REAL;<br />
END_VAR<br />
RESSOURCE CPU_1<br />
TASK Task_1 (Intervall:=t#20s, PRIORITY:=5)<br />
TASK Task_2 (S<strong>in</strong>gle:=z2, PRORITY:=1)<br />
PROGRAMM Überwachung<br />
END_RESSOURCE<br />
RESOURCE CPU_2<br />
TASK Task_2 (S<strong>in</strong>gle:=z3, PRORITY:=2)<br />
PROGRAMM Auswertung<br />
PROGRAMM Störungsmeldung<br />
END_RESOURCE<br />
VAR_ACCESS<br />
QUALITAET: RESSOURCE CPU_ 1.%QW2 :WORD ;<br />
END_VAR<br />
END_CONFIGURATION<br />
Die Konfiguration ist der POE-Ebene grundsätzlich übergeordnet.<br />
Falls e<strong>in</strong>e Konfiguration nur e<strong>in</strong>e e<strong>in</strong>zige Ressource besitzt, kann man auf die Angabe derselben<br />
verzichten. Dies ist bei e<strong>in</strong>fachen Systemen der Normalfall! Die Konfigurationen größerer Systeme<br />
bleibt deshalb Aufgabe weiterführenden Lehrveranstaltungen.<br />
Achtung!<br />
Die Programmieroberfläche <strong>CoDeSys</strong> stellt Tools für nachfolgend farbig gekennzeichnete<br />
Aufgaben zur Verfügung. Sie beg<strong>in</strong>nen mit der Gestaltung e<strong>in</strong>es Projektes, erlauben aber mit<br />
den Software-Werkzeugen unter „Ressourcen“ auch e<strong>in</strong>e Reihe von Konfigurationen.<br />
Der hierarische Aufbau Konfiguration – Ressource – Laufzeitprogramm nach Bild 3-1 ist<br />
allerd<strong>in</strong>gs nicht erkennbar, zumal der Begriff Ressourcen hier im S<strong>in</strong>ne von „verfügbaren<br />
Werkzeugen“ für Konfigurationen verwendet wird.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-2<br />
Autor: Dr. Becker 03_2008
Konfiguration 1<br />
Projekt<br />
Objekte<br />
Bauste<strong>in</strong>e Datentypen<br />
Programmorganisa-<br />
tionse<strong>in</strong>heiten POE<br />
POE FC<br />
POE<br />
Programm<br />
POE FB<br />
Grundlagen der Automatisierungstechnik I<br />
Automatisierungssystem<br />
Konfig. 2<br />
Konfig. 3<br />
Konfig. n<br />
Projekt 1 Projekt 2 Projekt n<br />
Bibliotheken <br />
Visualisiesierungen<br />
Bild 4-1: Das <strong>Programmiersystem</strong>s <strong>CoDeSys</strong> bietet<br />
u.a. auch Tools für die Konfiguration von Automatisierungssystemen,<br />
der Begriff Ressourcen wird<br />
jedoch <strong>in</strong> anderer Bedeutung benutzt!<br />
Resourcen zum Konfigurieren und<br />
Organisieren des Projektes<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-3<br />
Autor: Dr. Becker 03_2008
<strong>4.</strong>3 Programmorganisationse<strong>in</strong>heiten (POE)<br />
<strong>4.</strong>3.1 Übersicht<br />
Grundlagen der Automatisierungstechnik I<br />
• Zur Strukturierung e<strong>in</strong>es Anwenderprogramms stehen nach <strong>IEC</strong> 61131-3 drei unterschiedliche<br />
Organisationse<strong>in</strong>heiten mit speziellen Eigenschaften zur Verfügung:<br />
Programme (Schlüsselwort PROGRAM)<br />
Funktionen (Schlüsselwort FUNCTION) und<br />
Funktionsblöcke (Schlüsselwort FUNCTION_BLOCK)<br />
• E<strong>in</strong> Programm ist allgeme<strong>in</strong> e<strong>in</strong> zusammenhängender Teil e<strong>in</strong>es Anwenderprogramms, der im<br />
gesamten Projekt bekannt ist.<br />
Das Betriebssystem organisiert die zyklische Bearbeitung des „Haupt“-Programms mit dem<br />
Schlüsselwort PLC_PRG. Alle anderen POE und damit auch alle anderen Programme müssen für<br />
die zyklische Bearbeitung <strong>in</strong> der POE PLC_PRG oder <strong>in</strong> anderen bereits aufgerufenen POE<br />
aufgerufen werden. E<strong>in</strong> Aufruf <strong>in</strong> e<strong>in</strong>er Funktion ist allerd<strong>in</strong>gs nicht möglich, wohl aber <strong>in</strong> e<strong>in</strong>em<br />
Funktionsblock. Programme s<strong>in</strong>d parametrierbar.<br />
Gegenüber der Funktion kann e<strong>in</strong> Programm bei der Ausführung e<strong>in</strong>en oder mehrere Werte<br />
liefern. Von e<strong>in</strong>er Ausführung bis zur nächsten Ausführung bleiben alle Werte erhalten.<br />
Gegenüber e<strong>in</strong>em Funktionsblock zeichnet sich e<strong>in</strong> Programm wie folgt aus: Werden bei e<strong>in</strong>em<br />
Aufruf e<strong>in</strong>es Programms Werte geändert, so stehen die Änderungen für den nächsten Aufruf zur<br />
Verfügung, auch wenn e<strong>in</strong>e andere POE <strong>das</strong> Programm aufruft. Beim Funktionsblock dagegen<br />
werden Änderungen nur <strong>in</strong> der jeweiligen Instanz wirksam, nicht aber <strong>in</strong> anderen Instanzen!<br />
• Funktionen können nur für „Sofortlogik“ e<strong>in</strong>gesetzt werden, d.h. für die direkte logische<br />
Verarbeitung von Signalen. Innere Werte können nicht gespeichert werden. Sie können wie e<strong>in</strong><br />
Operator benutzt werden. Grundsätzlich können Funktionen nur e<strong>in</strong> Datenelement – den<br />
Rückgabewert – liefern.<br />
Bei der Deklaration der Funktion und der Name des Rückgabewert und se<strong>in</strong> Datentyp festgelegt.<br />
Der Rückgabewert ersetzt den Funktionsaufruf und wird wie e<strong>in</strong>e Ausgabevariable benutzt. Der<br />
Aufruf mit dem Befehl CAL ist nicht möglich.<br />
Typische Funktionen wie Rechen- oder Umwandlungsoperationen stehen als Standard-<br />
funktionen <strong>in</strong> den <strong>Programmiersystem</strong>en zur Verfügung<br />
Funktionen s<strong>in</strong>d nur mit E<strong>in</strong>gangsvariablen parametrierbar. Ausgangsvariablen s<strong>in</strong>d nicht erlaubt.<br />
• Funktionsbauste<strong>in</strong>e (Funktionsblocks) können mehrere Ausgangsvariablen besitzen und für<br />
gleiche E<strong>in</strong>gangswerte durchaus unterschiedliche Ausgangswerte zulassen. Das ist möglich, weil<br />
sie auch <strong>in</strong>terne Variablen besitzen.<br />
Typische Funktionsbauste<strong>in</strong>e wie Zähler, Zeitgeber, Bistabile Elemente, Trigger stehen als<br />
Standard-FB <strong>in</strong> den Bibliotheken der <strong>Programmiersystem</strong>e zur Verfügung. Häufig benötigte<br />
Programmteile kann der Anwender selbst als Funktionsbauste<strong>in</strong> def<strong>in</strong>ieren.<br />
Funktionsbauste<strong>in</strong>e s<strong>in</strong>d parametrierbar, wobei E<strong>in</strong>gangs-, Ausgangs- und <strong>in</strong>nere Variablen<br />
benutzt werden können.<br />
Der Aufruf von Funktionsbauste<strong>in</strong>en von Programmen und anderen FB’s aus erfolgt durch ihre<br />
Instanzierung. Die Instanz ist vergleichbar mit e<strong>in</strong>er Kopie des deklarierten FB für e<strong>in</strong>en<br />
speziellen Anwendungsfall. In der Deklaration wird die Instanz mit Ihrem Typ vere<strong>in</strong>bart. Damit<br />
wird für jede Instanz der notwendige Speicherbereich zur Verfügung gestellt.<br />
Zwischen den Aufrufen des Bauste<strong>in</strong>s werden die Daten gespeichert werden. Diese Tatsache<br />
wird landläufig als „Gedächtnis“ des FB beschrieben.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-4<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
An dieser Stelle wird nachfolgend e<strong>in</strong>e Übersicht aus dem Standardwerk von ...<br />
Karl-He<strong>in</strong>z John und Michael Tiegelkamp: SPS-Programmierung mit <strong>IEC</strong> 61131-3 Konzepte und<br />
Programmiersprachen, Anforderungen an <strong>Programmiersystem</strong>e, Entscheidungshilfen 3. Auflage<br />
Spr<strong>in</strong>ger Verlag 2000<br />
...über die Eigenschaften und Möglichkeiten der POE gegeben. Die E<strong>in</strong>zelheiten dazu werden <strong>in</strong> den<br />
nachfolgenden Abschnitten ausgeführt. Nicht jedes <strong>Programmiersystem</strong> realisiert alle diese<br />
Grundeigenschaften <strong>in</strong> gleichem Maße!<br />
Konzept<br />
E<strong>in</strong>gangsparameter<br />
VAR_INPUT<br />
Ausgangsparameter<br />
VAR_OUTPUT<br />
E<strong>in</strong>-Ausgangsparameter<br />
VAR_IN_OUT<br />
Funktionswert<br />
(Rückgabewert)<br />
Aufruf von Funktionen<br />
Aufruf von<br />
Funktionsbauste<strong>in</strong>en<br />
Aufruf von Programmen<br />
Deklaration globaler<br />
Variablen VAR_GLOBAL<br />
Zugriff auf externe<br />
Variablen<br />
VAR_EXTERNAL<br />
Deklaration direkt<br />
dargestellter Variablen<br />
Deklaration lokaler<br />
Variablen VAR<br />
Deklaration e<strong>in</strong>er FB-<br />
Instanz<br />
Flankenerkennung<br />
verwendbar<br />
Verwendung von EN/ENO<br />
Pufferung von lokalen und<br />
Ausgangsdaten<br />
Indirekter FB-Aufruf<br />
Verwendung von<br />
Funktionswerten als<br />
E<strong>in</strong>gangsparameter<br />
Verwendung von FB-<br />
Instanzen als<br />
E<strong>in</strong>gangsparameter<br />
Rekursiver Aufruf<br />
Funktion Funktionsbauste<strong>in</strong><br />
Programm<br />
ja ja ja<br />
ne<strong>in</strong> ja ja<br />
ne<strong>in</strong> ja ja<br />
ja ne<strong>in</strong> ne<strong>in</strong><br />
ja ja ja<br />
ne<strong>in</strong> ja ja<br />
ne<strong>in</strong> ne<strong>in</strong> ne<strong>in</strong><br />
ne<strong>in</strong> ne<strong>in</strong> ja<br />
ne<strong>in</strong> ja ja<br />
ne<strong>in</strong> ne<strong>in</strong>, bei FB’s nur <strong>in</strong><br />
VAR_EXTERNAL<br />
ja<br />
ja ja ja<br />
ne<strong>in</strong> ja ja<br />
ne<strong>in</strong> ja ja<br />
ja ja ne<strong>in</strong><br />
ne<strong>in</strong> ja ja<br />
ne<strong>in</strong> ja ja<br />
ja ja ja<br />
ja ja ja<br />
ne<strong>in</strong> ne<strong>in</strong> ne<strong>in</strong><br />
Übersicht aus Karl-He<strong>in</strong>z John und Michael Tiegelkamp: SPS Programmierung nach <strong>IEC</strong> 61131-3<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-5<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Nachfolgendes Schema zeigt <strong>das</strong> Wesen der zyklischen Programmbearbeitung mit den POE<br />
PROGRAM, FUNCTION und FUNKTION_BLOCK<br />
PLC_PRG<br />
CAL InstanzA1<br />
CAL InstanzA2<br />
LD ........<br />
FUNCTION_1....<br />
CAL PROGRAM_A<br />
CAL PROGRAM_A<br />
InstanzA2<br />
Rückgabewert<br />
InstanzA1<br />
FUNCTION_BLOCK_A<br />
CAL InstanzB1<br />
FUNCTION_BLOCK_A<br />
CAL InstanzB1<br />
FUNCTION_1<br />
PROGRAM_A<br />
InstanzB1<br />
FUNCTION_BLOCK_B<br />
Deklarationen:<br />
InstanzA1:FUNCTION_BLOCK_A;<br />
InstanzA2:FUNCTION_BLOCK_A;<br />
InstanzB1:FUNCTION_BLOCK_B;<br />
Für alle drei Typen von POE sieht <strong>IEC</strong> 61131-3 grundsätzlich zwei Teile vor, die mit Programmkopf<br />
(Header) und Programm-Rumpf (Body) bezeichnet werden. Für <strong>das</strong> Ausführen beider Teile s<strong>in</strong>d<br />
exakte Regeln zu beachten!<br />
Der Programm-Kopf enthält Deklarationen (und Konfigurationen).<br />
Der Programm-Rumpf enthält <strong>das</strong> eigentliche Programm.<br />
Zu Beg<strong>in</strong>n jedes Programms bzw. jeder Programmorganisationse<strong>in</strong>heit (POE) s<strong>in</strong>d alle benutzten<br />
Variablen im Programmkopf e<strong>in</strong>deutig zu deklarieren! Dies ist e<strong>in</strong> deutliches Kennzeichen von <strong>IEC</strong>konformen<br />
Programmen und sollte nicht unterlaufen werden! Mit der Deklaration der Variablen<br />
wird der erforderliche Platz für alle Daten im Datenspeicher des Automatisierungsgerätes reserviert,<br />
oder es werden e<strong>in</strong>e Menge von E<strong>in</strong>- oder Ausgangsparametern für die Schnittstellen der POE<br />
zue<strong>in</strong>ander festgelegt.<br />
Die Norm def<strong>in</strong>iert die Variablen als „Mittel zur Identifizierung von Datenobjekten, deren Inhalt<br />
sich ändern darf, d.h. Daten, die mit E<strong>in</strong>gängen, Ausgängen oder Speicherplätzen der SPS<br />
verbunden s<strong>in</strong>d.“<br />
Das Programm selbst wird ohne Bezug auf die Hardware – d.h. ohne Bezug auf E<strong>in</strong>gänge, Ausgänge<br />
oder spezielle Datenbereiche – geschrieben. Nur im Deklarationsteil werden Variablen bei Bedarf „auf<br />
Adressen gelegt“, an besten nur im Hauptprogramm PLC_PRG. E<strong>in</strong>e Änderung der Verdrahtung hat<br />
dann ke<strong>in</strong>en E<strong>in</strong>fluss auf <strong>das</strong> Programm, sondern lediglich auf den Deklarationsteil<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-6<br />
Autor: Dr. Becker 03_2008
<strong>4.</strong>3.2 Regeln für die Variablendeklaration<br />
Grundlagen der Automatisierungstechnik I<br />
Nachfolgender Kasten zeigt alle Schlüsselworte für die Variablendeklaration.<br />
Schlüssselwort Anwendung<br />
VAR lokal <strong>in</strong>nerhalb der POE<br />
VAR_INPUT von außen kommend (gelesen), <strong>in</strong> der POE nicht änderbar<br />
VAR_OUTPUT von der POE nach außen geliefert (geschrieben)<br />
VAR_IN_OUT von außen kommend, kann <strong>in</strong>nerhalb der POE geändert werden<br />
VAR_GLOBAL über alle POE e<strong>in</strong>es Projektes gültig<br />
VAR_EXTERNAL von e<strong>in</strong>er Konfiguration geliefert und <strong>in</strong>nerhalb der POE änderbar<br />
VAR_END Ende e<strong>in</strong>es Variablenblockes<br />
RETAIN Remanente Daten<br />
PERSISTENT Nullspannungssicher gepuffert<br />
AT (%Adresse) Zuweisung des Speicherortes (-> “Legen auf Adresse”)<br />
Jede Variablendeklaration wird <strong>in</strong> Blöcke geschrieben, die durch die Schlüsselworte VAR und<br />
END_VAR begrenzt werden. Die Reihenfolge der Blöcke spielt ke<strong>in</strong>e Rolle.<br />
Bei der Variablendeklaration wird der Name der Variablen mit e<strong>in</strong>em Datentyp verbunden.<br />
Der Name oder Bezeichner ist im Rahmen der zugelassenen Zeichen frei wählbar. Es ist s<strong>in</strong>nvoll,<br />
prozessverständliche Namen zu wählen! Groß- und Kle<strong>in</strong>schreibung werden nicht unterschieden<br />
und s<strong>in</strong>d deshalb ohne Belang.<br />
M<strong>in</strong>destangaben e<strong>in</strong>er Variablendeklaration:<br />
Name : Datentyp ; Beispiel: Teilezahl:INT;<br />
Erläuterung zu diesem Beispiel:<br />
Mit der Deklaration Teilezahl:INT; wird für die Variable mit dem Namen „Teilezahl“ e<strong>in</strong> Speicherraum<br />
von 16 Bit reserviert. Der 16-Bit-Inhalt des Wortes im Datenspeicher wird dann als Ganzzahl<br />
<strong>in</strong>terpretiert.<br />
Durch Optionen können zusätzliche Festlegungen getroffen werden wie Legen auf Adresse und<br />
Vorgabe e<strong>in</strong>es Anfangwertes (Initialwertes). Die Initialisierung erfolgt durch Vorgabe von<br />
Anfangswerten mit dem Zeichen := .<br />
Mögliche Optionen:<br />
Name : Datentyp := Initialwert ; zusätzliche Angabe e<strong>in</strong>es Anfangwertes<br />
Name AT Adresse : Datentyp ; Mit Schlüsselwort AT wird Variable auf bestimmte<br />
Adresse gelegt, zumeist auf E<strong>in</strong>gänge oder Ausgänge<br />
(im Ausnahmefall auf Merker)<br />
Name AT Adresse : Datentyp := Initialwert ; Maximaldeklaration<br />
Beispiele: Sensoren_0_5 AT %IB4:Byte;<br />
Meldung AT %QX0.2:BOOL :=FALSE;<br />
Wert:REAL:=0.23;<br />
Werden ke<strong>in</strong>e Anfangswerte vorgegeben, so starten die Variablen mit e<strong>in</strong>em vordef<strong>in</strong>ierten Wert, der<br />
überwiegend Null zum Inhalt hat.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-7<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Bei der Variablendeklaration werden weiter auch der Wirkungsbereich (global oder lokal) und weitere<br />
Eigenschaften (wie nullspannungsfest u.a.) festgelegt.<br />
Dazu wird <strong>das</strong> Schlüsselwort VAR ergänzt. Beispiele s<strong>in</strong>d VAR_GOBAL, VAR_RETAIN u.a.<br />
Beispiele:<br />
In die Variablendeklaration können Konstanten e<strong>in</strong>bezogen werden. Die Norm spricht von Typed<br />
Literals. Konstanten werden mit dem Schlüsselwort CONSTANT gekennzeichnet. Sie können lokal<br />
für e<strong>in</strong>e POE oder global für alle POE deklariert werden.<br />
Beispiele:<br />
Durch Benutzung des Schlüsselwortes RETAIN werden remanente Daten erzeugt. Solche Variablen<br />
behalten beim Aus- und E<strong>in</strong>schalten der Steuerung oder Onl<strong>in</strong>e-Reset ihre Werte, d.h. bei erneutem<br />
Start wird mit den gespeicherten aktuellen Werten weitergearbeitet.<br />
Dagegen werden alle anderen Variablen <strong>in</strong> diesem Fall neu <strong>in</strong>itialisiert, entweder mit ihren Standard-<br />
Initialisierungswerten (zumeist Inhalt Null) oder nach Vorgabe der Deklaration.<br />
Beispiele:<br />
VAR<br />
Summand_1:INT:=200;<br />
Summand_2:INT;<br />
Summe:INT;<br />
Anzeige AT %QX0.1:BOOL;<br />
Stoerung AT %IX2.3:BOOL;<br />
Wartezeit:TIME:=5s;<br />
END_VAR<br />
VAR CONSTANT<br />
Divisor:INT:=20;<br />
Zeitdifferenz:TIME:=T#12h;<br />
END_VAR<br />
Nutzen Sie die Auflistung möglicher Konstanten unter<br />
Index-Stichwort „Konstanten“ der Onl<strong>in</strong>e-Hilfe <strong>CoDeSys</strong><br />
VAR RETAIN<br />
Teilezaehler:INT;<br />
Endtemperatur:REAL;<br />
END_VAR<br />
VAR_GLOBAL<br />
BCD_Schalter_1 AT %IW 2:WORD;<br />
Ventile_1-16 AT %QW12:WORD;<br />
Temperatur_A:REAL;<br />
Fehlerquote:REAL;<br />
Teilezahl:INT;<br />
END_VAR<br />
VAR_GLOBAL CONSTANT<br />
Immer_1:BOOL:=TRUE;<br />
Multiplikator_A:RAL:=3.14;<br />
E<strong>in</strong>trag:STRING:=’€’;<br />
END_VAR<br />
VAR_GLOBAL RETAIN<br />
Produktion:DINT;<br />
Restzeit:TIME;<br />
END_VAR<br />
Nicht remanent s<strong>in</strong>d RETAIN-Variablen allerd<strong>in</strong>gs bei bestimmten (systemabhängigen) Befehlen wie<br />
„Reset auf Ursprung“ oder erneutem Download des Programms.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-8<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Für solche Probleme sieht die Norm weiter <strong>das</strong> Schlüsselwort PERSISTENT vor.<br />
Nachfolgende Tabelle zeigt <strong>das</strong> Verhalten der Variablen RETAIN und PERSISTENT im System<br />
<strong>CoDeSys</strong>. Für VAR RETAIN PERSISTENT kann auch geschrieben werden VAR PERSISTENT<br />
RETAIN<br />
Beispiel:<br />
Onl<strong>in</strong>e-Befehl VAR VAR VAR VAR RETAIN<br />
RETAIN PERSISTENT PERSISTENT<br />
RESET neu <strong>in</strong>itial. remanent neu <strong>in</strong>itial. remanent<br />
RESET KALT neu <strong>in</strong>itial. neu <strong>in</strong>itial. neu <strong>in</strong>itial. neu <strong>in</strong>itial.<br />
RESET URSPRUNG neu <strong>in</strong>itial. neu <strong>in</strong>itial. neu <strong>in</strong>itial. neu <strong>in</strong>itial.<br />
DOWNLOAD neu <strong>in</strong>itial. neu <strong>in</strong>itial. remanent remanent<br />
ONLINE CHANGE remanent remanent remanent remanent<br />
ONLINE CHANGE bedeutet die Funktion, bei laufender Steuerung Änderungen des<br />
Programms vorzunehmen.<br />
VAR RETAIN PERSISTENT<br />
Betriebsstundenzähler:TIME;<br />
Sollwert:REAL;<br />
END_VAR<br />
Achtung! Im System <strong>CoDeSys</strong> gilt h<strong>in</strong>sichtlich Wirkung und Speicherplatzbedarf:<br />
Wenn e<strong>in</strong>e lokale Variable <strong>in</strong> e<strong>in</strong>em Programm als RETAIN deklariert ist, wird genau<br />
diese Variable im RETAIN-Bereich gespeichert (wie e<strong>in</strong>e globale RETAIN-Variable).<br />
Wenn e<strong>in</strong>e lokale Variable <strong>in</strong> e<strong>in</strong>em Funktionsblock als RETAIN deklariert ist, wird<br />
die komplette Instanz dieses Funktionsblocks im RETAIN-Bereich gespeichert (alle<br />
Daten des Bauste<strong>in</strong>s), wobei jedoch nur die deklarierte RETAIN-Variable als solche<br />
behandelt wird.<br />
Wenn e<strong>in</strong>e lokale Variable <strong>in</strong> e<strong>in</strong>er Funktion als RETAIN deklariert ist, hat dies ke<strong>in</strong>e<br />
Auswirkung. Die Variable wird nicht im Reta<strong>in</strong>-Bereich gespeichert! Wird e<strong>in</strong>e lokale<br />
Variable <strong>in</strong> e<strong>in</strong>er Funktion als PERSISTENT deklariert, bleibt dies ebenfalls ohne<br />
Wirkung!<br />
<strong>4.</strong>3.3 Direkt dargestellte Variablen („Legen auf Adressen“)<br />
Bestimmte Variablen erhalten ihre Inhalte von E<strong>in</strong>gangskartenbaugruppen oder schreiben ihre Werte<br />
<strong>in</strong> Ausgangskartenbaugruppen.<br />
In Sonderfällen möchten Anwender den Wert von Variablen <strong>in</strong> Datenspeicherbereiche schreiben, die<br />
sie selbst verwalten wollen.<br />
In diesen Fällen werden die Variablen mit dem Schlüsselwort AT auf Bit-, Byte, Wort- oder<br />
Doppelwortadressen gelegt. Die Kennungen dieser Speichergrößen und der Speicherorte s<strong>in</strong>d<br />
nachfolgend dargestellt. Grundsätzlich werden Adressen durch <strong>das</strong> Zeichen % gekennzeichnet.<br />
Bit: Kennung: X<br />
Byte: Kennung: B<br />
Wort: Kennung: W<br />
Doppelwort: Kennung: DW (32 Bit)<br />
Langwort: Kennung: L (62 Bit)<br />
E<strong>in</strong>gang: Kennung: I (Input)<br />
Ausgang: Kennung: Q (Quit)<br />
Merker: Kennung: M (nur <strong>in</strong> Ausnahme-<br />
fällen anwenden!)<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-9<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Die Adressierung erfolgt mit Bit- Byte- und Wortadressen (siehe Grundlagen Abschnitt 1.5.3).<br />
Zur Problematik von Variablen und Symbole siehe Abschnitt <strong>4.</strong>3.5.<br />
Werden Merker benutzt, so werden die Daten selbstätig <strong>in</strong> e<strong>in</strong>en nullspannungsfesten RETAIN-<br />
Speicher geschrieben. Das Wort Merker fungiert hier wie e<strong>in</strong> Schlüsselwort.<br />
Achtung! Um unkontrollierte Überschreibungen zu vermeiden, sollten Merker und<br />
VAR_RETAIN niemals gleichzeitig benutzt werden!<br />
Achtung! Nur Variable und Globale Variable - nicht aber VAR_INPUT und VAR_OUTPUT –<br />
dürfen auf Adressen gelegt werden.<br />
<strong>4.</strong>3.4 Parameterübergabe an POE und parametrierbare Bauste<strong>in</strong>e<br />
Für die Übergabe von Daten an POE und für die Ausgabe von Daten aus POE sieht <strong>IEC</strong> 1131-3<br />
nachfolgende spezielle Variablen vor, die auch als Parameter bezeichnet werden:<br />
Variablen Typ Funktion der Variablen<br />
VAR_INPUT Mit diesen Variablen erhält die POE E<strong>in</strong>gangs<strong>in</strong>formationen<br />
VAR_OUTPUT Mit diesen Variablen gibt die POE Ausgangs<strong>in</strong>formationen zurück<br />
VAR_IN_OUT Mit diesen Variablen erhält die POE E<strong>in</strong>gangs<strong>in</strong>formationen und gibt<br />
diese verändert zurück<br />
In Funktionen gibt es abweichend nur Parameter vom Typ VAR_INPUT.<br />
Durch Anwendung solcher Variablen entstehen parametrierbare Bauste<strong>in</strong>e. Das s<strong>in</strong>d allgeme<strong>in</strong><br />
formulierte Programmteile, die ihre konkrete Funktion erst beim Aufruf im Hauptprogramm durch<br />
Übergabe konkreter, d.h. aktueller Parameter erlangen.<br />
Die Variablen der Typen VAR_INPUT, VAR_OUTPUT und VAR_IN_OUT stellen somit die<br />
Schnittstelle e<strong>in</strong>er POE zu anderen POE dar.<br />
Die Verwendung parametrierbarer POE ist e<strong>in</strong> wesentliches Element von <strong>IEC</strong> 1131-3. Das Verfahren<br />
erlaubt den E<strong>in</strong>satz wiederverwendbarer Programme <strong>in</strong> Form selbst geschriebener POE und<br />
vielfältiger Biblioteken. Bibliotheken gehören zum <strong>Programmiersystem</strong>. Von Grundsatz her s<strong>in</strong>d alle<br />
Bibliotheksbauste<strong>in</strong>e parametrierbare POE.<br />
Schnittstellen<br />
E<strong>in</strong>-<br />
gangs-<br />
daten<br />
VAR_INPUT<br />
..........<br />
..........<br />
..........<br />
parametrierbare POE<br />
VAR_IN_OUT VAR_OUTPUT<br />
.......... ..........<br />
.......... ..........<br />
.......... ...........<br />
Aus-<br />
gangs-<br />
daten<br />
Wird die Abarbeitung e<strong>in</strong>es Programms nicht durch Task organisiert, muss <strong>das</strong> Projekt den Bauste<strong>in</strong><br />
PLC-PRG enthalten (im System Simatic S5 / S7 der Organisationsbauste<strong>in</strong> OB1). E<strong>in</strong> vom Umfang<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-10<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
her begrenztes Programm kann durchaus alle<strong>in</strong> im Bauste<strong>in</strong> PLC_PRG ohne Verzweigungen zu<br />
anderen Bauste<strong>in</strong>en niedergeschrieben werden. E<strong>in</strong> solches Programm bezeichnet man als l<strong>in</strong>eares<br />
Programm.<br />
In POE gegliederte Programme s<strong>in</strong>d gegenüber l<strong>in</strong>earen Programmen übersichtlicher. Bei<br />
Änderungen müssen nur bestimmte POE berücksichtigt werden.<br />
In der Automatisierungstechnik müssen oftmals gleichartige Programmteile mehrfach angewendet<br />
werden. Strukturiert man mit parametrierbaren POE, dann können durch Export- / Import-Funktionen<br />
Programmteile <strong>in</strong> anderen Projekten wiederwendet werden oder aber mehrmals im gleichen Projekt.<br />
In Fachkreisen spricht man erst bei Anwendung parametrierbarer POE von strukturierten<br />
Programmen.<br />
L<strong>in</strong>eares Programm Gegliedertes Programm Strukturiertes Programm<br />
PLC_PRG<br />
Messung 1<br />
Auswertung 1<br />
Meldung 1<br />
Messung 2<br />
Auswertung 2<br />
Meldung 2<br />
Messung 3<br />
Auswertung 3<br />
Meldung 3<br />
PLC_PRG<br />
Aufruf POE<br />
Messung 1<br />
Aufruf POE<br />
Auswertung1<br />
Aufruf POE<br />
Meldung 1<br />
Aufruf POE<br />
Messung 2<br />
Aufruf POE<br />
Auswertung2<br />
Aufruf POE<br />
Meldung 2<br />
Aufruf POE<br />
Messung 3<br />
Aufruf POE<br />
Auswertung3<br />
Aufruf POE<br />
Meldung 3<br />
<strong>4.</strong>3.5 Variablen und Symbolik<br />
POE<br />
Messung 1<br />
POE<br />
Auswertung 1<br />
POE<br />
Meldung 1<br />
POE<br />
Messung 2<br />
POE<br />
Auswertung 2<br />
POE<br />
Meldung 2<br />
POE<br />
Messung 3<br />
POE<br />
Auswertung 3<br />
POE<br />
Meldung 3<br />
OB 1<br />
Aufruf Messung<br />
für Messstelle 1<br />
Aufruf Auswertg.<br />
für Messstelle 1<br />
Aufruf Meldung<br />
für Messstelle 1<br />
Aufruf Messung<br />
für Messstelle 2<br />
Aufruf Auswertg.<br />
für Messstelle 2<br />
Aufruf Meldung<br />
für Messstelle 2<br />
Aufruf Messung<br />
für Messstelle 3<br />
Aufruf Auswertg.<br />
für Messstelle 3<br />
Aufruf Meldung<br />
für Messstelle 3<br />
jeweilige<br />
Parameter-<br />
übergabe<br />
paramerierbare<br />
POE Messung<br />
parametrierbare<br />
POE Auswertung<br />
parametrierbare<br />
POE Meldung<br />
E<strong>in</strong>ige <strong>Programmiersystem</strong>e ermöglichen zur besseren Lesbarkeit von Programmen für die direkt<br />
adressierten Operanden symbolische Namen zu verwenden. Diese werden kurz Symbole genannt.<br />
Dazu gehört Step7 des Automatisierungssystems Siemens Simatic S7 und ebenso der Vorgänger<br />
Step5. Für die vom Anwender zu adressierenden Operanden im Merkerbereich, im Bereich der<br />
globalen Datenbauste<strong>in</strong>e, im Prozessabbild der E<strong>in</strong>gänge (PAE) und Ausgänge (PAA) sowie für<br />
Peripheriebereiche und für Timer und Zähler werden hier <strong>in</strong> e<strong>in</strong>er Symboltabelle frei wählbare<br />
Symbole verwaltet. Bei der Programmierung kann der Anwender entscheiden, ob er <strong>das</strong> Programm<br />
mit absoluten Operanden, mit symbolischen Operanden oder <strong>in</strong> der Option „mit Symbol<strong>in</strong>formation“<br />
mit beiden betrachten und bearbeiten will. Da alle diese Operanden die Funktion globaler Variablen<br />
haben, stehen Symbole grundsätzlich für globale Variablen.<br />
Symbole werden bei Step7 mit doppeltem Hochkomma gekennzeichnet. Für Symboltabellen wird<br />
auch der Begriff Zuordnungstabellen benutzt.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-11<br />
Autor: Dr. Becker 03_2008
Beispiele für Step7:<br />
Grundlagen der Automatisierungstechnik I<br />
Operand Symbol<br />
M100.0 “Steuerung_e<strong>in</strong>geschaltet“<br />
DB5.DBW12 “Sollstueckzahl“<br />
E10.3 “T_Antrieb_e<strong>in</strong>“<br />
A2.7 “LED_Anrieb2“<br />
PEW304 “Temperatur“<br />
T12 “Z_Ueberwachung“<br />
Z1 “Teilezeaehler“<br />
Symbole dürfen nicht mit den Bezeichnern von Variablen verwechselt werden! H<strong>in</strong>ter jedem<br />
Symbol liegt e<strong>in</strong>e vom Anwender festgelegte Adresse, während h<strong>in</strong>ter Variablen nur im Sonderfall<br />
beim Legen auf Adressen mit Schlüsselwort AT e<strong>in</strong> Hardwarebezug besteht!<br />
Bei Programmen nach <strong>IEC</strong> 61131 erhöht die grundsätzliche Verwendung von Variablen die Flexibilität<br />
e<strong>in</strong>es Programms, denn solange die Anb<strong>in</strong>dung an die Peripherie noch nicht festgelegt ist, ist e<strong>in</strong><br />
Programm universeller e<strong>in</strong>setzbar.<br />
Die erforderliche Adressierung sollte immer zum spätest möglichen Zeitpunkt und <strong>in</strong> e<strong>in</strong>er möglichst<br />
hohen Ebene, bei großen Projekten <strong>in</strong> e<strong>in</strong>er Konfiguration oder Ressource festgelegt werden.<br />
Es ist zumeist ausreichend, für den direkten Zugriff auf die Peripherie alle<strong>in</strong> <strong>in</strong> der POE PLC_PRG mit<br />
absoluten Adressen zu arbeiten. In Funktionen und Funktionsbauste<strong>in</strong>en ist die Verwendung von<br />
absoluten Adressen grundsätzlich zu vermeiden!<br />
<strong>4.</strong>3.6 Zusammenfassung: Wo werden welche Variablen deklariert?<br />
Variablendeklaration mit Schlüsselwort ....<br />
VAR Diese Variablen gelten nur <strong>in</strong> der POE, <strong>in</strong> der sie deklariert wurden. Es s<strong>in</strong>d lokale<br />
Variablen.<br />
VAR_GLOBAL Diese Variablen gelten für alle POE im Gesamtprogramm. Es s<strong>in</strong>d globale<br />
Variablen. Sie s<strong>in</strong>d von allen POE's lesbar und änderbar.<br />
Globale Variablen werden vorrangig für die Adressierung der Peripherie<br />
verwendet.<br />
VAR_INPUT dienen zur Parameterübergabe beim Aufruf e<strong>in</strong>er Funktion, e<strong>in</strong>es Funktionsbauste<strong>in</strong>s<br />
oder e<strong>in</strong>es Programms.<br />
Diese Variablen können <strong>in</strong> diesen POE abgefragt werden. In der graphischen<br />
Darstellung stehen diese Variablen auf der l<strong>in</strong>ken Seite des FB/FUN-Symbols. Es<br />
können beim Aufruf nur Werte mit dem angegebenen Datentyp übergeben werden.<br />
VAR_OUTPUT s<strong>in</strong>d die Ausgangsvariablen e<strong>in</strong>es Funktionsbauste<strong>in</strong>s oder e<strong>in</strong>es Programms.<br />
Hier stehen die Ergebnisse im angegebenen Datentyp für die Verwendung <strong>in</strong><br />
anderen POE bereit.<br />
In der graphischen Darstellung stehen diese Variablen auf der rechten Seite des<br />
FB/FUN-Symbols.<br />
Bei e<strong>in</strong>er Funktion wird <strong>das</strong> Ergebnis als Rückgabewert auf dem Funktionsnamen<br />
abgelegt. Es wird also ke<strong>in</strong> VAR_OUTPUT benötigt.<br />
VAR_IN_OUT Diese Variablen wirken bei FB und Programm wie VAR_INPUT, sie können aber <strong>in</strong><br />
der POE geschrieben und verändert ausgegeben werden.<br />
In Funktionen s<strong>in</strong>d diese Variablen nicht zulässig.<br />
In der graphischen Darstellung stehen diese Variablen auf der l<strong>in</strong>ken Seite des<br />
FB/FUN-Symbols.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-12<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
VAR_EXTERNAL E<strong>in</strong>e globale Variable aus der Konfiguration kann dann <strong>in</strong> e<strong>in</strong>em Element<br />
dieser Konfiguration benutzt werden, wenn sie <strong>in</strong> dem Element zusätzlich als<br />
VAR_EXTERNAL def<strong>in</strong>iert wird.<br />
VAR_ACCESS Mit diesen Kommunikationsvariablen werden Zugriffspfade für die<br />
Kommunikation def<strong>in</strong>iert.<br />
Achtung! Var_IN_OUT und VAR_EXTERNAL können nicht mit Anfangswerten <strong>in</strong>itialisiert<br />
werden<br />
H<strong>in</strong>weis zu H<strong>in</strong>sichtlich der Datenhaltung bestehen deutliche Unterschiede zwischen der Norm<br />
Step7: <strong>IEC</strong> 61131-3 und Step7 (hierzu auch Abschnitt 3.5)<br />
Bei konventioneller Arbeit mit Step7 schreibt man Daten <strong>in</strong> Merker und <strong>in</strong> Daten-<br />
elemente der Datenbauste<strong>in</strong>e. Beide Bereiche s<strong>in</strong>d globale Daten und müssen vom<br />
Anwender selbst adressiert werden, was e<strong>in</strong>e nicht zu unterschätzende Fehlerquelle<br />
ist!! Die Fehlerhäufigkeit beim Arbeiten mit Merkern und Elementen von Datenbau-<br />
ste<strong>in</strong>en kann durch Verwendung von Symbolen deutlich gesenkt werden!<br />
Das ändert aber nichts an der Notwendigkeit, <strong>das</strong>s der Programmierer die Speicher-<br />
zellen selbst adressieren muss! Bei Step7 steht h<strong>in</strong>ter jedem Symbol e<strong>in</strong>e Adresse<br />
(siehe Abschnitt 3.5)<br />
Dagegen adressieren <strong>Programmiersystem</strong>e wie <strong>CoDeSys</strong> bei der Variablen-<br />
deklaration die Speicher selbst.<br />
Dieses Verfahren erfolgt nun wiederum auch bei Step7, wenn man lokale Variablen<br />
Daten <strong>in</strong> der Deklarationstabelle der Funktionen (FC) und Funktionsbauste<strong>in</strong>e (FB)<br />
verwendet.<br />
FC erlauben neben den Parametern IN, OUT und IN_OUT nur lokale Variable vom<br />
Typ TEMP (temporäre Variable).<br />
E<strong>in</strong>e temporäre Variable dient als Zwischenspeicher („Schmierzettel“), um Werte<br />
<strong>in</strong>nerhalb e<strong>in</strong>es Bauste<strong>in</strong>s im Programmablauf „von oben nach unten“ weiter zu<br />
geben (Pr<strong>in</strong>zip: erst schreiben, dann lesen!) Die Information der TEMP- Variablen<br />
steht nach e<strong>in</strong>em Programmzyklus nicht mehr zur Verfügung.<br />
FB erlauben neben den Parametern IN, OUT und IN_OUT sowie lokalen temporären<br />
Variablen auch lokale statische Variablen (Typ STAT). Diese werden im Instanzdatenbauste<strong>in</strong><br />
verwaltet, so <strong>das</strong>s der Bauste<strong>in</strong> über e<strong>in</strong> „Gedächtnis“ verfügt. Die Daten<br />
bleiben solange erhalten, bis sie mit neuen Werte überschrieben werden, auch über<br />
Zyklen und Bauste<strong>in</strong>aufrufe.<br />
Bild 4-2: Deklaration lokaler Variablen <strong>in</strong> Step7: Die Funktion erlaubt neben den Parametern IN, OUT<br />
und IN_OUT nur temporäre Variable.<br />
Deklariert wurden im Bild die Variablen „Stopp:BOOL“ und „Anzeige:WORD“.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-13<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Bild 4-3: Deklaration lokaler Variablen <strong>in</strong> Step7: Der Funktionsbauste<strong>in</strong> erlaubt neben den Parametern<br />
IN, OUT und IN_OUT temporäre und statische Variable.<br />
Deklariert wurden im Bild die statischen Variablen „Gutteile:INT“ und „Zaehler_Null:BOOL“<br />
und die temporäre Variable “Stopp:BOOL”.<br />
Details der Variablendeklaration <strong>in</strong> Step7 – Funktionen und – Funktionsbauste<strong>in</strong>en werden <strong>in</strong> den<br />
Abschnitten 8 und 9 behandelt.<br />
<strong>4.</strong>4 Datenformate<br />
<strong>IEC</strong> 61131-3 def<strong>in</strong>iert elementare und zusammengesetzte Datentypen. Zusammengesetzte Datentypen<br />
wie ARRAY und STRUCT sowie spezielle User def<strong>in</strong>ed Typs (UDT) werden im Abschnitt 14<br />
behandelt.<br />
Mit dem Schlüsselwort ANY_ fasst man die elementaren Datentypen <strong>in</strong> fünf Gruppen zusammen:<br />
- Bitfolgen: ANY_BIT<br />
- Alle Zahlen: ANY_NUM<br />
- Ganzzahlen mit und ohne Vorzeichen: ANY_INT<br />
- Gleitpunktzahlen: ANY_REAL<br />
- Datum, Zeitpunkt: ANY_DATE<br />
- Zeichenfolge, Zeitdauer ANY (allgeme<strong>in</strong>ste Vorgabe)<br />
ANY<br />
ANY_BIT ANY_NUM ANY_DATE<br />
ANY_INT ANY_REAL<br />
BOOL<br />
BYTE<br />
WORD<br />
DWORD<br />
LWORD<br />
INT<br />
SINT<br />
DINT<br />
LINT<br />
Bedeutung der Schlüsselworte:<br />
UINT<br />
USINT<br />
UDINT<br />
ULINT<br />
REAL<br />
LREAL<br />
DATE<br />
TIME_OF_DAY<br />
DATE_AND_TIME<br />
DWORD: Double Word: Doppelwort<br />
LWORD: Long Word: Langwort<br />
INT: Integer: Ganzzahl<br />
SINT: Short Integer: kurze Ganzzahl<br />
DINT: Double lnteger: Doppelte Ganzzahl<br />
LINT: Long Integer: Lange Ganzzahl<br />
UINT: Unsigned Integer: Ganzzahl ohne Vorzeichen (0..+65 535)<br />
USINT: Unsigned Short Integer: kurze Ganzzahl ohne Vorzeichen (0..+255)<br />
UDINT: Unsigned Double Int: Doppelte Ganzzahl ohne Vorzeichen (0..+2 32 -1)<br />
ULINT: Unsigned Long Integer: Langzahl ohne Vorzeichen (0..+2 64 -1<br />
REAL: Real: Gleitpunktzahl<br />
LREAL: Long Real: Lange Gleitpunktzahl<br />
TIME<br />
STRING<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-14<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Nicht alle Hersteller unterstützen alle Datentypen. Nachfolgende elementare Datenformate bilden <strong>das</strong><br />
unverzichtbare Grundgerüst der Variablendeklaration.<br />
Schlüsselwort Datentyp Größe Schreibweise / Wertebereiche<br />
Bit-Datentypen<br />
BOOL<br />
BYTE<br />
WORD<br />
DWORD<br />
LWORD<br />
CHAR<br />
Arithmetische Typen<br />
INT<br />
DINT<br />
REAL<br />
Zeittypen<br />
TIME<br />
TIME OF DAY<br />
DATE<br />
DATE_AND_TIME<br />
S5TIME<br />
Erläuterungen zu den Datentypen für Zeit und Datum<br />
Datentyp Schlüsselwort Interne Wertung<br />
Zeitdauer TIME Zeitdauer <strong>in</strong> Millisekunden<br />
Tageszeit TIME_OF_DAY oder TOD Zeit im Millisekunden ab<br />
00:00Uhr<br />
Datum DATE Zeit <strong>in</strong> Sekunden ab 01.01.1970<br />
Datum und Uhrzeit<br />
(Zeitstempel)<br />
Boolesche Variable<br />
8 Bit-Folge oder 2 Hex-Zahlen<br />
16 Bit-Folge oder 4 Hex-Zahlen<br />
32 Bit-Folge oder 8 Hex-Zahlen<br />
64 Bit-Folge oder 16 Hex-Zahlen<br />
ASCII-Zeichen<br />
Ganze Zahlen (Festpunktzahlen)<br />
Ganze Zahlen (Festpunktzahlen)<br />
Reelle Zahlen (Gleitpunktzahlen)<br />
Zeitdauer (<strong>IEC</strong>)<br />
Uhrzeit (Tageszeit)<br />
Datum<br />
Zeitstempel: Datum und Uhrzeit<br />
Zeitdauer (S5-Format, nur bei<br />
Step7)<br />
1 Bit<br />
8 Bit<br />
16 Bit<br />
32 Bit<br />
64 Bit<br />
8 Bit<br />
16 Bit<br />
32 Bit<br />
32 Bit<br />
32 Bit<br />
32 Bit<br />
32 Bit<br />
32 Bit<br />
16 Bit<br />
00:00 Uhr<br />
DATE_AND_TIME oder DT Zeit <strong>in</strong> Sekunden ab 01.01.1970<br />
00:00 Uhr<br />
TIME: Zeitbasis ist die Millisekunde. Jede andere Zeitangabe wird <strong>in</strong>tern <strong>in</strong> e<strong>in</strong>e Anzahl von<br />
Millisekunden umgerechnet. Die Gesamtzahl von Millisekunden steht dualcodiert <strong>in</strong> e<strong>in</strong>em<br />
32 Bit breiten Doppelwort (DWORD). Der größtmögliche Dezimalwert e<strong>in</strong>es Doppelwortes ist<br />
<strong>4.</strong>29<strong>4.</strong>967.295.<br />
Werden größere Werte vorgegeben, meldet <strong>das</strong> System <strong>CoDeSys</strong> den Fehler „Überlauf <strong>in</strong><br />
Zeitkonstante“. Es ist aber zu beachten, <strong>das</strong>s die Datenbreite <strong>in</strong> unterschiedlichen<br />
<strong>Programmiersystem</strong>en auch systemabhängig se<strong>in</strong> kann.<br />
TOD: Auch wenn die Tageszeit im „Klartext“ e<strong>in</strong>getragen werden kann, so wird sie <strong>in</strong>tern doch als<br />
Anzahl der Millisekunden ab 00:00 Uhr gewertet.<br />
DATE: Auch hier wird die Angabe <strong>in</strong> „Klartext“ <strong>in</strong>tern <strong>in</strong> e<strong>in</strong>e Anzahl von Sekunden ab dem<br />
festgelegten Zeitpunkt 01.01.1970 00:00 Uhr umgerechnet.<br />
DT: ebenfalls Umrechnung <strong>in</strong> die Anzahl von Sekunden ab dem festgelegten Zeitpunkt<br />
01.01.1970 00:00 Uhr<br />
• Intern werden alle Zeitdaten-Typen wie DWORD behandelt!<br />
FALSE (0) , TRUE (1)<br />
B#16#00...FF<br />
W#16#0000...FFFF<br />
DW#16#0000_0000...FFFF_FFFF<br />
LW#16#0...FFFF_FFFF_FFFF_FFFF<br />
‘ X‘ , ‘ +‘, ‘ &‘<br />
-32768 .... +32767 (0...65535)<br />
L# -2 147 483 648 ... 2 147 483 647<br />
Beispiel: 63<strong>4.</strong>57 oder 6.3457e+02<br />
TIME# -24d20h31m<strong>in</strong> ... + 24d20h31m<strong>in</strong><br />
TOD# 23:59:59.9<br />
DATE#1990-01-01<br />
DT#2007-02-04-10:15:30<br />
S5T# 0ms... 9990s<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-15<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Erläuterungen zu den Datentypen INT, DINT und REAL<br />
• Die Inhalte von Ganzahlen im Umfang von Byte, Wort und Doppelwort können im Dezimal-Code,<br />
Dual-Code oder Hexadezimal-Code angegeben werden.<br />
• Das Automatisierungsgerät arbeitet grundsätzlich nur auf Basis des Dualcodes. Aus ihm werden<br />
alle anderen Codes abgeleitet. Diese s<strong>in</strong>d zumeist für Darstellungen am Bildschirm oder <strong>in</strong><br />
Geräten erforderlich.<br />
• Im Hexa-Code wird jeweils e<strong>in</strong>e Tetrade (4 Bit) zu e<strong>in</strong>er Hexaziffer zusammengefasst.<br />
• Bei INT-Datentypen gilt: Das höchstwertige Bit enthält <strong>das</strong> Vorzeichen:<br />
Wert 0 = positiv, Wert 1 = negativ<br />
• Negative Zahlen werden im Zweierkomplement angegeben. Zweierkomplemente ermittelt man<br />
durch Umkehr aller Bitwerte und Addition e<strong>in</strong>es Bitwertes, wobei Überträge zu berücksichtigen<br />
s<strong>in</strong>d.<br />
• REAL werden nicht mit Komma, sondern mit Punkt e<strong>in</strong>gegeben<br />
Beispiele:<br />
Dezimalzahl 662, darstellbar als INT := 662, 2# 0000_0001_0100_1010 oder W#16# 0296<br />
Bit 15<br />
Dual: 2# 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 Hex: W#16# 0 2 9 6<br />
+2 9<br />
2 7<br />
+2 4<br />
Bit 0<br />
+2 2 +2 1<br />
+ 662<br />
Die Hexaziffern für die Darstellung von vier Bit:<br />
+6x16 0 = 6<br />
+9x16 1 =144<br />
+2x16 2 = 512<br />
Tetrade Dezimal Hex-Ziffer Tetrade Dezimal Hex-Ziffer<br />
0000 0 0 1000 8 8<br />
0001 1 1 1001 9 9<br />
0010 2 2 1010 10 A<br />
0011 3 3 1011 11 B<br />
0100 4 4 1100 12 C<br />
0101 5 5 1101 13 D<br />
0110 6 6 1110 14 E<br />
0111 7 7 1111 15 F<br />
Beispiel: 2# 1110_1010_0001_1000_1111_0111_1011_1001<br />
DW#16# E A 1 8 F 7 B 9<br />
Dezimal: 3 927 504 825<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-16<br />
Autor: Dr. Becker 03_2008<br />
662
Grundlagen der Automatisierungstechnik I<br />
Um sowohl sehr kle<strong>in</strong>e Kommazahlen wie z.B. 0.000000000000342 als auch große Kommazahlen<br />
wie z.B.1233231456. 012 mit 32 Bit verschlüsseln zu können, wird bei REAL <strong>das</strong> Pr<strong>in</strong>zip des<br />
gleitenden Kommas benutzt. Intern wird dazu die exponentielle Darstellung der Zahlen und e<strong>in</strong>e<br />
festgelegte Anzahl Bits jeweils für Mantisse und für Exponent verwendet (Bild 4-4).<br />
Bild 4-4: Pr<strong>in</strong>zip der Verschlüsselung von 32 Bit-Gleitpunktzahlen<br />
B<strong>in</strong>är codierte Dezimalzahlen und BCD-Code<br />
Zifferncodierschalter und 7-Segment-Anzeigen enthalten Codewandler, die e<strong>in</strong>e Tetrade <strong>in</strong> e<strong>in</strong>e<br />
Dezimalziffer wandeln. Grundlage für die Darstellung e<strong>in</strong>er Dezimalziffer durch vier Bit ist der<br />
Dualcode.<br />
Der BCD Code ist e<strong>in</strong> Code, bei dem e<strong>in</strong>e Dezimalzahl nicht als Ganzes <strong>in</strong> den Dualcode<br />
überführt wird, sondern jede e<strong>in</strong>zelne Dezimalziffer für sich.<br />
Dezimalziffer Dualcode der Hexacode<br />
Dezimalziffer = BCD<br />
0 2# 0000 16# 0<br />
1 2# 0001 16# 1<br />
2 2# 0010 16# 2<br />
3 2# 0011 16# 3<br />
4 2# 0100 16# 4<br />
5 2# 0101 16# 5<br />
6 2# 0110 16# 6<br />
7 2# 0111 16# 7<br />
8 2# 1000 16# 8<br />
9 2# 1001 16# 9<br />
Weiter<br />
verfügbare<br />
Tetraden<br />
2# 1010<br />
2# 1011<br />
2# 1100<br />
2# 1101<br />
In BCD<br />
nicht<br />
erlaubt!<br />
16# A<br />
16# B<br />
16# C<br />
16# D<br />
2# 1110 16# E<br />
2# 1111 16# F<br />
Bildquelle: Siemens AG Lehrgang SPS-Techniker<br />
Erkenntnis:<br />
Im Bereich der Dezimalziffern 0..9<br />
s<strong>in</strong>d BCD- und Hexacode formal gleich.<br />
Die Hexa-Ziffern A..F s<strong>in</strong>d im BCD-Code<br />
nicht erlaubt!<br />
Bei SimaticS7 wirken fehlerhafte BCD-<br />
Tetraden, die zu Ziffern A..F führen<br />
würden, als Stopp-Fehler!)<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-17<br />
Autor: Dr. Becker 03_2008
Beispiel:<br />
6 2 9 1<br />
0 I I 0 0 0 I 0 I 0 0 I 0 0 0 I<br />
Grundlagen der Automatisierungstechnik I<br />
Bei den speziellen Simatic S5–Timern und -Zählern – die auch <strong>in</strong> Step7 weiter verwendet werden -,<br />
liefern die Ausgänge „DEZ“ Inhalte im BCD-Code. Die Ausgänge „DUAL“ liefern die gleichen Inhalte<br />
im Dualcode.<br />
Z5<br />
T10<br />
S_EVERZ<br />
S DUAL<br />
TW DEZ<br />
R Q<br />
Codewandler<br />
Codewandler<br />
So wie zunehmend Codierschalter und 7-Segment-Anzeigen durch Touch Panels ersetzt werden,<br />
verliert der BCD-Code an Bedeutung.<br />
• BCD-Datentypen und Zählerdatentypen s<strong>in</strong>d <strong>in</strong> <strong>IEC</strong> 61131-3 nicht explizit def<strong>in</strong>iert!<br />
An dieser Stelle sei auf Möglichkeiten der Konvertierung von Datenformaten nach <strong>IEC</strong> 61131-3<br />
verwiesen. Konvertierungen benötigt man bei der Weiterverarbeitung von Daten, wenn formale<br />
Typkonflikte auftreten. Mit e<strong>in</strong>er Konvertierung TIME_TO_DWORD ist es beispielsweise möglich,<br />
e<strong>in</strong>en allgeme<strong>in</strong>en Wert TIME <strong>in</strong> e<strong>in</strong>en Dezimalwert von Millisekunden zu überführen.<br />
Datenkonvertierung wird im Abschnitt 7 behandelt.<br />
• Ansprechen e<strong>in</strong>zelner Bit’s <strong>in</strong> Variablen:<br />
In <strong>Programmiersystem</strong>en nach <strong>IEC</strong> 61131-3 ist es sehr e<strong>in</strong>fach, e<strong>in</strong>zelne Bit’s <strong>in</strong> Variablen der Typen<br />
BYTE, WORD, DWORD, LWORD anzusprechen: Man benutzt dazu den Bezeichner und – getrennt<br />
durch e<strong>in</strong>en Punkt – die Bitadresse.<br />
Beispiel: Wortvariable:WORD;<br />
Zugriff auf Bit 0 .. 15: Wortvariable.0 ... Wortvariable.15<br />
BCD-Code,<br />
dargestellt durch vier Tetraden:<br />
0 I I 0_0 0 I 0_I 0 0 I_0 0 0 I<br />
Im Gegensatz dazu ist der Dualcode<br />
von 6291:<br />
Zaehler<br />
2# 0 0 0 I_I 00 0_I 0 0 I_ 0 0 I I<br />
S DUAL<br />
Restzeit im BCD-Code ZW DEZ<br />
Zaehlerwert im BCD-Code<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-18<br />
Autor: Dr. Becker 03_2008<br />
ZV<br />
ZR<br />
R Q
<strong>4.</strong>5 Die Verwendung von Bibliotheken<br />
Grundlagen der Automatisierungstechnik I<br />
E<strong>in</strong>e Vielzahl oft benötigter Funktionen wie z.B. Timer (Zeitglieder), Counter (Zähler), Flankenauswertung<br />
(Trigger) oder RS-Flip-Flop (Bistabile Kippstufen) liegt als fertiges Programmelement <strong>in</strong><br />
Bibliotheken bereit. Der Form nach s<strong>in</strong>d es parametrierbare Bauste<strong>in</strong>e, die ihre aktuellen Variablen<br />
durch Parameterübergabe mit Variablen der Typen VAR_INPUT, VAR_OUTPUT und VAR_IN_OUT<br />
erhalten.<br />
Die wichtigste Bibliothek ist die Standardbibliothek (Standard Library), die nach <strong>IEC</strong> 1131-3 allen<br />
<strong>Programmiersystem</strong>en beigefügt werden muss.<br />
Im <strong>Programmiersystem</strong> <strong>CoDeSys</strong> ist diese Bibliothek bereits <strong>in</strong> alle Projekte e<strong>in</strong>gebunden, so <strong>das</strong>s<br />
ihre Programmelemente als Standard-Funktionsblöcke genutzt werden können.<br />
Bild 4-5 zeigt e<strong>in</strong>en solchen Fall: In dem <strong>in</strong> der graphischen Sprache FUP geschriebenen Programm<br />
wird e<strong>in</strong>e positive Flankenauswertung benötigt. Nach E<strong>in</strong>fügen e<strong>in</strong>es Blockes <strong>in</strong> <strong>das</strong> Programm wird<br />
entweder <strong>das</strong> richtige Schlüsselwort e<strong>in</strong>getragen (<strong>in</strong> diesem Falle R_TRIG), oder es wird mit Hilfe der<br />
E<strong>in</strong>fügetaste F2 aus dem Angebot der Standard-Funktionsbauste<strong>in</strong>e ausgewählt.<br />
Deklaration der<br />
Instanz von R-TRIG<br />
Bild 4-5 : Die Verwendung von Funktionsbauste<strong>in</strong>en der Standard-Bibliothek<br />
Da Funktionsbauste<strong>in</strong>e (FB) pr<strong>in</strong>zipiell <strong>in</strong>stanziert werden müssen, trifft dies auch für FB’s aus der<br />
Standardbibliothek zu. Sie erhalten e<strong>in</strong>en Namen (den Instanznamen oder e<strong>in</strong>facher „die Instanz“) und<br />
werden mit diesem Namen im Programmkopf nach dem Schema deklariert (im Beispiel<br />
Up_Trig1:R_TRIG;).<br />
Schreibt man selbst FB’s, so würden diese im obigen Menu unter „Def<strong>in</strong>ierte Funktionsblöcke“<br />
ersche<strong>in</strong>en. Ausführlich wird die Arbeit mit FB’s und ihre Instanzierung <strong>in</strong> Abschnitt 9 beschrieben.<br />
Neben der Standardbibliothek gibt es e<strong>in</strong>e Vielzahl weiterer Bibliotheken. Sie stehen auf Homepages<br />
von Software-Entwicklern (z.B. www.3S-Software.com ) oder Hardware-Anbietern (z.B.<br />
www.wago.com) bereit. S<strong>in</strong>d die Files auf dem Rechner vorhanden, werden sie bei Bedarf <strong>in</strong> <strong>das</strong><br />
Projekt e<strong>in</strong>gefügt. Danach können ihre Bauste<strong>in</strong>e genutzt werden.<br />
Bild 4-6 zeigt die Vorgehensweise bei <strong>CoDeSys</strong>: In der Mitte s<strong>in</strong>d die standardmäßig vorhandenen<br />
Bibliotheken sichtbar, rechts verfügbare Zusatzbibliotheken. Mit den Menu’s ->Fenster -> Bibliotheksverwaltung<br />
und -> E<strong>in</strong>fügen -> Neue Bibliothek kann man aus diesem Fenster auswählen und<br />
e<strong>in</strong>fügen.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-19<br />
Autor: Dr. Becker 03_2008
Bild 4-6: E<strong>in</strong>fügen zusätzlicher<br />
Bibliotheken <strong>in</strong> e<strong>in</strong><br />
Projekt unter <strong>CoDeSys</strong><br />
<strong>4.</strong>6 Onl<strong>in</strong>e-Hilfe als Lehrmittel<br />
Grundlagen der Automatisierungstechnik I<br />
Standard<br />
Zusatz<br />
Das beste Lehrbuch für <strong>das</strong> System <strong>CoDeSys</strong> ist die Onl<strong>in</strong>e-Hilfe. Bild 4-7 zeigt die Übersicht der<br />
Themen und als Beispiel Erläuterungen zum Befehl CAL.<br />
Bild 4-7: Übersicht der Themen <strong>in</strong> der Onl<strong>in</strong>e Hilfe<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-20<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Die Onl<strong>in</strong>e-Hilfe ist unverzichtbarer Bestandteil zeitgemäßer <strong>Programmiersystem</strong>e. Beim Programmieren<br />
kann nach dem Markieren fraglicher Blöcke mit der Taste F1 konkrete Hilfe abgerufen werden.<br />
(Beispiel Bild 4-8: Hilfe zum Counter Typ CTUD). Sehr praktikabel ist die Auswahlliste verwandter<br />
Themen am oberen Bildrand (Bild 4-9).<br />
Bild 4-8: Onl<strong>in</strong>e Hilfe zum Counter<br />
CTUD mit Taste F1<br />
Bild 4-9: Benutzung der oben sichtbaren Auswahlliste für artverwandte Themen <strong>in</strong> der Onl<strong>in</strong>e Hilfe<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-21<br />
Autor: Dr. Becker 03_2008
<strong>4.</strong>7 Integrierte Visualisierung<br />
Grundlagen der Automatisierungstechnik I<br />
Geme<strong>in</strong>sam mit der Simulation der Programme ist auch die <strong>in</strong> <strong>CoDeSys</strong> <strong>in</strong>tegrierte Visualisierung sehr<br />
hilfreich für den Lernenden. Mit e<strong>in</strong>er im Vergleich zu großen Visualisierungstools schnell erstellten<br />
e<strong>in</strong>fachen Visualisierung können bequem Programme getestet werden, ohne auf Hardware<br />
angewiesen zu se<strong>in</strong>! E<strong>in</strong>zelheiten zur Visualisierung s<strong>in</strong>d Folge 12 der „Praktischen E<strong>in</strong>führung <strong>in</strong><br />
<strong>CoDeSys</strong>“ zu entnehmen.<br />
-> Praktische E<strong>in</strong>führung <strong>in</strong> <strong>CoDeSys</strong> Folge 12<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-22<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
<strong>4.</strong>8 Anhang: Bezeichner, Literale und Schlüsselworte der Norm <strong>IEC</strong> 61131-3<br />
Bezeichner und Literale:<br />
Bezeichner dienen <strong>in</strong> den Programmiersprachen zur Darstellung von Objekten wie z. B. Variablen<br />
oder Funktionen.<br />
Sie s<strong>in</strong>d e<strong>in</strong>e Folge von Buchstaben, Ziffern und Unterstrichzeichen ( _ ). Zum<strong>in</strong>dest sechs Zeichen<br />
müssen <strong>in</strong> sämtlichen Systemen unterstützt werden.<br />
Bezeichner müssen mit e<strong>in</strong>em Buchstaben oder mit e<strong>in</strong>em Unterstrichzeichen beg<strong>in</strong>nen. Mehrere<br />
voranstehende und mehrfach e<strong>in</strong>gebettete Unterstriche s<strong>in</strong>d unzulässig. Außerdem dürfen Bezeichner<br />
ke<strong>in</strong>e Leerstellen enthalten.<br />
Beispiele für Bezeichner:<br />
START STOP VENTIL_6 VENT_E_7 _16E8 WELLE1 _WELLE<br />
E<strong>in</strong> Literal ist <strong>in</strong> den Programmiersprachen e<strong>in</strong>e zulässige Zeichenfolge zur Darstellung e<strong>in</strong>es<br />
bestimmten Inhaltes von Objekten, z.B. e<strong>in</strong>es aktuellen Wertes e<strong>in</strong>es Datentyps.<br />
Der Begriff basiert auf lat: litera = Buchstabe.<br />
Beispiel für e<strong>in</strong> Literal (hier speziell zulässig für den Datentyp mit Bezeichner DATE): D#1996-04-6<br />
Schlüsselwörter (alphabetisch geordnet)<br />
Hierunter werden spezielle reservierte Worte (bzw. spezielle Zeichenkomb<strong>in</strong>ationen) verstanden, die<br />
im Quelltext von Programmiersprachen e<strong>in</strong>en speziellen Auftrag auslösen oder e<strong>in</strong>e bestimmte<br />
Funktion haben.<br />
Schlüsselworte dürfen ke<strong>in</strong>e e<strong>in</strong>gebetteten Leerzeichen enthalten und für ke<strong>in</strong>en anderen Zweck wie<br />
z.B. als Namen für Variablen (!), POE oder Projekte verwendet werden.<br />
ACTION...END_ACTION<br />
ARRAY...OF<br />
AT<br />
CASE...OF...ELSE...END_CASE<br />
CONFIGURATION...END_CONFIGURATION<br />
CONSTANT<br />
EN ENO<br />
EXIT<br />
FALSE<br />
F_EDGE<br />
FOR…TO…BY…DO…END_FOR<br />
FUNCTION…END_FUNCTION<br />
FUNCTION_BLOCK…END_FUNCTION_BLOCK<br />
IF…THEN…ELSIF…ELSE…END_IF<br />
INITIAL_STEP…END_STEP<br />
PROGRAM…WITH…<br />
PROGRAM…END_PROGRAM<br />
R_EDGIE<br />
READ_ONLY<br />
READ_WRITE<br />
REPEAT…UNTIL…END_REPEAT<br />
RESOURCE…ON…END_RESOURCE<br />
RETAIN<br />
RETURN<br />
STEP…END_STEP<br />
STRUCT…END_STRUCT<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-23<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
TASK<br />
TRANSITION…FROM…TO…END_TRANSITION<br />
TRUE<br />
TYPE…END_TYPE<br />
VAR…END_VAR<br />
VAR_INPUT…END_VAR<br />
VAR_OUTPUT…END_VAR<br />
VAR_IN_OUT…END_VAR<br />
VAR_EXTERNAL…END_VAR<br />
VAR_ACCESS…END_VAR<br />
VAR_GLOBAL…END_VAR<br />
WHILE…DO…END_WHILE<br />
WITH<br />
Beispiele für numerische ganzzahlige und reelle Literale:<br />
-5 +96 628_26 Ganzzahlige Literale; Unterstrichzeichen zwischen<br />
den Ziffern dürfen nicht signifikant se<strong>in</strong><br />
-5,0 0.123 12.56 Reelle Literale<br />
6.2E – 4 bzw. 6.2e – 4<br />
-2.6E + 3 bzw. – 2,6e + 3<br />
12.0E3 bzw. 12.0e3<br />
Reelle Literale mit Exponent<br />
2#1010_1010 Literal zur Basis 2<br />
8#156 Literal zur Basis 8<br />
16#FF Literal zur Basis 16<br />
0 1 Boolesche Null und E<strong>in</strong>s<br />
FALSE TRUE Boolesche FALSE und TRUE<br />
Beispiele für Zeichenfolge-Literale:<br />
Folge von Null oder mehr Zeichen, die <strong>in</strong> e<strong>in</strong>fache Anführungszeichen (') e<strong>in</strong>geschlossen ist.<br />
“ Leere Zeichenfolge mit der Länge Null<br />
'X' Zeichenfolge mit der Länge E<strong>in</strong>s, mit Zeichen X<br />
' ' Zeichenfolge der Länge E<strong>in</strong>s, mit Leerzeichen<br />
'$“ Zeichenfolge der Länge E<strong>in</strong>s, mit Anführungszeichen<br />
'$$6.00' Zeichenfolge der Länge Fünf, $6.00<br />
$$ Dollar-Zeichen $<br />
$' Anführungszeichen<br />
$L bzw. $1 Zeilenvorschub<br />
$N bzw. §n Neue Zeile<br />
$P bzw. §p Neue Seite<br />
$R bzw. $r Wagenrücklauf<br />
Beispiele für Zeit-Literale:<br />
• Zeitdauer<br />
Daten für Zeitdauer müssen l<strong>in</strong>ks durch <strong>das</strong> Schlüsselwort T#, TIME#, t# oder time#<br />
begrenzt werden. Unterstrichzeichen können die E<strong>in</strong>heiten von Zeitdauer-Literalen trennen.<br />
T#80ms T#30.8s T#9.5m T#20.6h<br />
t#30h26m t#7d16h12m13s<br />
TIME#2.5h time#2.5h<br />
T#16h_12m_18s T#16h_12m_18s<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-24<br />
Autor: Dr. Becker 03_2008
• Datum und Tageszeit<br />
Grundlagen der Automatisierungstechnik I<br />
DATE# bzw. D# Datum<br />
TIME_OF_DAY# bzw: TOD# Tageszeit<br />
DATE_AND_TIME# bzw: DT# Datum und Zeit<br />
Date#1996-04-6<br />
D#1996-04-6<br />
d#1996-04-6<br />
TIME_OF_DAY#17 : 19 : 40.12<br />
TOD#17 : 19 : 40.12<br />
DATE_AND_TIME#1996-04-12-17 : 26 : 45.16<br />
dt#1996-04-12-17 : 26 : 45.16<br />
Schlüsselworte für Standard-Operatoren<br />
• Boolesche Operatoren<br />
Operator Parameter Kommentar<br />
AND & ANY_BIT Und-Funktion<br />
OR ANY_BIT ODER-Funktion<br />
NOT ANY_BIT NICHT-Funktion, Negation<br />
XOR ANY_BIT XOR-Funktion, Antivalenz<br />
• Arithmetische Operatoren<br />
Operator E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
ADD+ ANY_NUM ANY_NUM Addition<br />
SUB- ANY_NUM ANY_NUM Subtraktion<br />
MUL* ANY_NUM ANY_NUM Multiplikation<br />
DIV / ANY_NUM ANY_NUM Division; bei<br />
ANY_INT ganzzahlige<br />
Division<br />
MOD ANY_INT ANY_INT Modulo (Rest bei ganzzahliger<br />
Division)<br />
EXPT** Basis:<br />
ANY_REAL<br />
Exponent:<br />
ANY_NUM<br />
ANY_REAL Potenzrechnung<br />
MOVE := ANY_NUM ANY_NUM Zuweisung<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-25<br />
Autor: Dr. Becker 03_2008
• Vergleichsoperationen<br />
Grundlagen der Automatisierungstechnik I<br />
Operator E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
GT > ANY_BIT<br />
ANY_NUM<br />
STRING<br />
TIME<br />
ANY_DATE<br />
BOOL größer als<br />
GE >= ANY_BIT<br />
ANY_NUM<br />
STRING<br />
TIME<br />
ANY_DATE<br />
BOOL größer oder gleich<br />
LE >= ANY_BIT<br />
ANY_NUM<br />
STRING<br />
TIME<br />
ANY_DATE<br />
BOOL kle<strong>in</strong>er oder gleich<br />
LT< ANY_BIT<br />
ANY_NUM<br />
STRING<br />
TIME<br />
ANY_DATE<br />
BOOL kle<strong>in</strong>er<br />
EQ= ANY_BIT<br />
ANY_NUM<br />
STRING<br />
TIME<br />
ANY_DATE<br />
BOOL gleich<br />
NE ANY_BIT<br />
ANY_NUM<br />
STRING<br />
TIME<br />
ANY_DATE<br />
BOOL ungleich<br />
• Bitmanipulation<br />
Funktion E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
SHL IN:<br />
ANY_BIT<br />
N:<br />
ANY_INT<br />
SHR IN:<br />
ANY_BIT<br />
N:<br />
ANY_INT<br />
ROL IN:<br />
ANY_BIT<br />
N:<br />
ANY_INT<br />
ROR IN:<br />
ANY_BIT<br />
N:<br />
ANY_INT<br />
ANY_BIT L<strong>in</strong>ks schieben von<br />
IN um N Bit<br />
ANY_BIT Rechts schieben von<br />
IN um N Bit<br />
ANY_BIT Rotation l<strong>in</strong>ks von<br />
IN um N Bit im Kreis<br />
ANY_BIT Rotation rechts von<br />
IN um N Bit im Kreis<br />
Beispiel X :=SHL (IN :=WERT, N :=3); 00010101 vor SHL... 10101000 nach SHL...<br />
Drei Stellen nach l<strong>in</strong>ks, rechts werden Nullen nachgezogen.<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-26<br />
Autor: Dr. Becker 03_2008
• Typumwandlung<br />
Grundlagen der Automatisierungstechnik I<br />
Funktion E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
*_TO_** ANY_NUM ANY_NUM Numerische Typen wer-<br />
den <strong>in</strong>e<strong>in</strong>ander<br />
umgewandelt<br />
*E<strong>in</strong>gangsdatentyp<br />
**Ausgangsdatentyp<br />
Beispiel<br />
X :=INT_TO_REAL;<br />
TRUNC ANY_REAL ANY_INT Nachkommastellen<br />
werden abgeschnitten<br />
Beispiel<br />
X :=TRUNC (Y);<br />
BCD_TO_* ANY_BIT ANY_INT *Datentyp<br />
Daten der ANY_BIT-<br />
Gruppe im BCD-Format<br />
werden <strong>in</strong> <strong>das</strong> ANY_INT-<br />
Format umgewandelt<br />
Beispiel<br />
X :=BCD_TO INT (Y);<br />
*_TO_BCD ANY_INT ANY_BIT *Datentyp<br />
• Numerische Funktionen<br />
Daten im ANY_INT-<br />
Format werden <strong>in</strong> <strong>das</strong><br />
BCD-Format umge-<br />
wandelt<br />
Beispiel<br />
X :=INT_TO_BCD (Y);<br />
Funktion E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
ABS ANY_NUM ANY_NUM Absolutwert<br />
SQRT ANY_REAL ANY_REAL Quadratwurzel<br />
LN ANY_REAL ANY_REAL Logarithmus, natürlicher<br />
LOG ANY_REAL ANY_REAL Logarithmus, Basis 10<br />
EXP ANY_REAL ANY_REAL Exponentialfunktion (e)<br />
SIN ANY_REAL ANY_REAL S<strong>in</strong>usfunktion (Bogenmaß)<br />
COS ANY_REAL ANY_REAL Cos<strong>in</strong>usfunktion (Bogenmaß)<br />
TAN ANY_REAL ANY_REAL Tangensfunktion (Bogenm.)<br />
ASIN ANY_REAL ANY_REAL Arcus-S<strong>in</strong>usfunktion<br />
ACOS ANY_REAL ANY_REAL Arcus-Cos<strong>in</strong>usfunktion<br />
ATAN ANY_REAL ANY_REAL Arcus-Tangensfunktion<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-27<br />
Autor: Dr. Becker 03_2008
• Auswahlfunktion<br />
Grundlagen der Automatisierungstechnik I<br />
Funktion E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
SEL G : BOOL<br />
INO : ANY<br />
ANY B<strong>in</strong>äre Auswahl<br />
IN1: ANY<br />
OUT :=IN0, wenn G = 0<br />
OUT :=IN1, wenn G = 2<br />
MAX ANY_BIT<br />
ANY_NUM<br />
STRING<br />
ANY_DATE<br />
TIME<br />
MIN ANY_BIT<br />
ANY_NUM<br />
STRING<br />
ANY_DATE<br />
TIME<br />
LIMIT MIN, IN, MX:<br />
ANY_BIT<br />
ANY_NUM<br />
STRING<br />
ANY_DATE<br />
TIME<br />
MUX K : ANY_INT<br />
andere:<br />
ANY<br />
ANY_BIT<br />
ANY_NUM<br />
STRING<br />
ANY_DATE<br />
TIME<br />
ANY_BIT<br />
ANY_NUM<br />
STRING<br />
ANY_DATE<br />
TIME<br />
ANY_BIT<br />
ANY_NUM<br />
STRING<br />
ANY_DATE<br />
TIME<br />
Beispiel<br />
X :=SEL (G :=0, IN0 := Y, IN1 = 3);<br />
Maximum-Funktion<br />
ANY Multiplexer<br />
OUT := MAX (IN1, IN2, …)<br />
Beispiel<br />
X :=MAX (Y, Z);<br />
M<strong>in</strong>imum-Funktion<br />
OUT :=MIN (IN1, IN2, …);<br />
Beispiel<br />
X :=MIN (Y, Z);<br />
Begrenzer<br />
OUT :=MIN (MAX (IN, MN,) MX)<br />
Beispiel<br />
X :=LIMIT (IN := Y ;MN :=0, MX :=3);<br />
Wählt e<strong>in</strong>en von N E<strong>in</strong>gängen aus,<br />
abhängig vom E<strong>in</strong>gang K<br />
Beispiel<br />
X :=MUX (K :=0, IN0 :=A, IN1 = B, IN2<br />
= C);<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-28<br />
Autor: Dr. Becker 03_2008
• Funktionen für Zeichenfolgen<br />
Grundlagen der Automatisierungstechnik I<br />
Funktion E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
LEN STRING INT Länge e<strong>in</strong>er Zeichenfolge<br />
LEFT IN: STRING<br />
L:ANY_INT<br />
RIGHT IN: STRING<br />
L:ANY_INT<br />
MID IN: STRING<br />
L:ANY_INT<br />
X :=LEN ('WORT');<br />
X :=4<br />
Beispiel<br />
L l<strong>in</strong>ksstehende Zeichen von IN<br />
STRING<br />
Beispiel<br />
X :=LEFT (IN := 'WORT',L :=3);<br />
X :=WOR<br />
STRING L rechtsdrehende Zeichen von IN<br />
Beispiel<br />
X :=RIGHT (IN := 'WORT',L :=3);<br />
X :=ORT<br />
STRING L Zeichen von IN, beg<strong>in</strong>nend mit dem P-ten Zeichen<br />
Beispiel<br />
X :=MID (IN := 'WORT',L=2, P=2);<br />
X :=OR<br />
CONCAT STRING STRING Ane<strong>in</strong>anderreihung von Zeichenfolgen<br />
X :=CONCAT ('WO', 'RT');<br />
INSERT IN1, IN2:<br />
STRING<br />
P: ANY_INT<br />
DELETE IN:STRING<br />
L, P: ANY_INT<br />
REPLACE IN1:, IN2:<br />
STRING<br />
L, P:<br />
ANY_INT<br />
FIND IN1, IN2:<br />
STRING<br />
X :=WORT<br />
STRING Fügt IN2 <strong>in</strong> IN1 nach der P-ten Zeichenposition e<strong>in</strong>.<br />
Beispiel<br />
X :=INSERT (IN1 :=HER, IN2 :=MA, P :=2);<br />
X :=HEMAR<br />
STRING Löscht L Zeichen von IN, beg<strong>in</strong>nend mit der P-ten<br />
Position.<br />
Beispiel<br />
X :=DELETE (IN := 'WORT', L :=1, P :=2);<br />
X :=WRT<br />
STRING Ersetzt L Zeichen von IN1 durch IN2, beg<strong>in</strong>nend ab der<br />
P-ten Zeichenposition.<br />
Beispiel<br />
X :=REPLACE (IN1 := 'WORT', IN2 := 'T', L := 1, P :=2);<br />
X :=WTRT<br />
INT Ermittelt wird die Zeichenposition des Anfangs für <strong>das</strong><br />
erste Auftreten von IN2 <strong>in</strong> IN1.<br />
Wenn ke<strong>in</strong> Auftreten von IN2 gefunden wird, ist <strong>das</strong><br />
Ergebnis Null.<br />
Beispiel<br />
X :=FIND (IN1 := 'WORT', IN2 := 'RT');<br />
X :=3<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-29<br />
Autor: Dr. Becker 03_2008
Grundlagen der Automatisierungstechnik I<br />
Schlüsselworte für Standard-Funktionsbauste<strong>in</strong>e<br />
• Bistabile Elemente<br />
Funktionsbauste<strong>in</strong> E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
SR S1, R:<br />
Q1:<br />
Speicher mit vorrangigem Setzen<br />
BOOL<br />
BOOL<br />
RS S, R1:<br />
Q1:<br />
Speicher mit vorrangigem Rücksetzen<br />
BOOL<br />
BOOL<br />
• Flankenerkennung<br />
Funktionsbauste<strong>in</strong> E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
R_TRIG CLK:<br />
Q:<br />
Bei steigender Flanke an CLK ist Q TRUE.<br />
BOOL<br />
BOOL<br />
F_TRIG CLK:<br />
Q:<br />
Bei fallender Flanke an CLK ist Q TRUE.<br />
BOOL<br />
BOOL<br />
• Timer<br />
Funktionsbauste<strong>in</strong> E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
TON IN : BOOL<br />
PT : TIME<br />
TOF IN : BOOL<br />
PT : TIME<br />
TP IN : BOOL<br />
PT : TIME<br />
RTC IN : BOOL<br />
PDT: DATE<br />
Q: BOOL<br />
ET: TIME<br />
Q: BOOL<br />
ET: TIME<br />
Q: BOOL<br />
ET: TIME<br />
Q: BOOL<br />
CDT: DATE<br />
E<strong>in</strong>schaltverzögerung<br />
IN: steigende Flanke startet Zeitglied<br />
PT: Verzögerungsdauer<br />
Q: wenn Zeit abgelaufen, TRUE<br />
ET: momentan verstrichene Verzögerung<br />
Ausschaltverzögerung,<br />
sonst wie TON<br />
Impulszeit,<br />
sonst wie TON<br />
1) Wenn an IN e<strong>in</strong>e steigende Flanke erkannt wird, wird die Uhrzeit gesetzt.<br />
Sie läuft ab, solange IN TRUE ist.<br />
Echtzeituhr 1)<br />
IN: steigende Flanke, Datum und Uhrzeit<br />
Werden geladen<br />
PDT: Vore<strong>in</strong>stellung von Datum und Uhrzeit<br />
CDT: laufendes Datum und laufende Uhrzeit<br />
Q: wie EN<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-30<br />
Autor: Dr. Becker 03_2008
• Zähler<br />
Grundlagen der Automatisierungstechnik I<br />
Funktionsbauste<strong>in</strong> E<strong>in</strong>g.-Parameter Ausg.-Parameter Kommentar<br />
CTU CU: R_TRIG<br />
(BOOL)<br />
R: BOOL<br />
PV: INT<br />
CTD CU: R_TRIG<br />
(BOOL)<br />
LD: BOOL<br />
PV: INT<br />
CTUD CU, CD:<br />
R_TRIG<br />
(BOOL)<br />
R, LD: BOOL<br />
PV: INT<br />
Q: BOOL<br />
ET: TIME<br />
Q: BOOL<br />
ET: TIME<br />
QU, QD: BOOL<br />
CV: INT<br />
Vorwärtszähler, Aufwärtszähler<br />
Zähler zählt von Null bis PV.<br />
CU: Zähle<strong>in</strong>gang (steigende Flanke)<br />
PV: Sollwert des Zählers<br />
R: Reset (CV auf 0)<br />
Q: Wenn PV erreicht, dann Q TRUE<br />
Rückwertszähler, Abwärtszähler<br />
Zähler zählt von PV bis Null.<br />
CD: Zähle<strong>in</strong>gang (steigende Flanke)<br />
PV: Sollwert des Zählers<br />
LD: Initialisierung von CV auf PV<br />
Q: Wenn PV = 0, dann Q TRUE<br />
CV: aktueller Zählwert<br />
Vorwärts-/Rückwärtszähler,<br />
Aufwärts/Abwärtszähler<br />
QU: Wenn CV Maximalwert erreicht hat, TRUE<br />
QD: Wenn CV M<strong>in</strong>imalwert erreicht hat, TRUE,<br />
sonst wie CTU und CTD<br />
Grundlagen der Automatisierungstechnik I: <strong>4.</strong> <strong>Programmiersystem</strong> <strong>CoDeSys</strong> Seite 4-31<br />
Autor: Dr. Becker 03_2008