1. SPS / Kontaktplan Konzepte

ClassicLadder ist eine Art Programmiersprache, die ursprünglich auf industriellen SPS implementiert wurde (sie wird Kontaktplan Programmierung genannt, engl. der Ähnlichkeit zu Leitern halber ladder programming) . Sie basiert auf dem Konzept der Relaiskontakte und -spulen und kann verwendet werden, um logische Prüfungen und Funktionen auf eine Weise zu konstruieren, die vielen Systemintegratoren vertraut ist. Der Kontaktplan besteht aus Sprossen, die sich verzweigen können, und ähnelt einem elektrischen Schaltkreis. Es ist wichtig zu wissen, wie Kontaktplanprogramme bei der Ausführung ausgewertet werden.

Entsprechend unserer Gewohnheiten würden wir erwarten, dass jede Zeile von links nach rechts ausgewertet wird, dann die nächste Zeile nach unten usw., aber in der Kontaktplanlogik funktioniert das nicht so. In der Kontaktplanlogik werden die Kontaktsprossen 3 Mal "gescannt", um den Zustand der Ausgänge zu ändern.

  • die Eingänge werden gelesen und aktualisiert

  • die Logik wird abgeleitet

  • die Ausgänge (engl. outputs) werden gesetzt

Dies kann zunächst verwirrend sein, wenn der Ausgang einer Zeile durch den Eingang eines anderen Rings gelesen wird. Es wird eine Abfrage geben, bevor der zweite Eingang wahr wird, nachdem der Ausgang gesetzt wurde.

Ein weiteres Problem bei der Kontaktplanprogrammierung ist die "Last One Wins"-Regel. Wenn Sie denselben Ausgang an verschiedenen Stellen Ihres Kontaktplans haben, wird der Zustand des letzten Ausgangs derjenige sein, auf den der Ausgang eingestellt ist.

2. Sprachen

Die gebräuchlichste Sprache bei der Arbeit mit ClassicLadder ist der "Kontaktplan" (engl. ladder). ClassicLadder unterstützt auch Ablaufpläne (Grafcet).

3. Komponenten

ClassicLadder besteht aus zwei Komponenten.

  • Das Echtzeit-Modul classicladder_rt

  • Das Nicht-Echtzeit-Modul (einschließlich einer grafischen Benutzeroberfläche) classicladder

3.1. Dateien

Normalerweise werden klassische Kontaktplan-Komponenten in der Datei custom.hal platziert, wenn Sie mit einer von StepConf generierten Konfiguration arbeiten. Diese dürfen nicht in der Datei custom_postgui.hal platziert werden, da sonst das Kontaktplan-Editor-Menü ausgegraut wird.

Anmerkung
Kontaktplan-Dateien (.clp) dürfen keine Leerzeichen im Namen enthalten.

3.2. Echtzeit-Modul

Das Laden des ClassicLadder-Echtzeitmoduls (classicladder_rt) ist aus einer HAL-Datei oder direkt mit einem halcmd-Befehl möglich. Die erste Zeile lädt das ClassicLadder-Modul in Echtzeit. Die zweite Zeile fügt die Funktion classicladder.0.refresh in den Servo-Thread ein. Diese Zeile bewirkt, dass ClassicLadder mit der Rate des Servo-Threads aktualisiert wird.

loadrt classicladder_rt
addf classicladder.0.refresh servo-thread

Die Geschwindigkeit des Threads, in dem ClassicLadder läuft, wirkt sich direkt auf die Reaktionsfähigkeit auf Eingaben und Ausgaben aus. Wenn Sie einen Schalter schneller ein- und ausschalten können, als ClassicLadder ihn wahrnehmen kann, müssen Sie den Thread möglicherweise beschleunigen. Die schnellste Zeit, in der ClassicLadder die Sprossen aktualisieren kann, ist eine Millisekunde. Sie können ihn in einen schnelleren Thread setzen, aber er wird nicht schneller aktualisieren. Wenn Sie einen langsameren Thread als eine Millisekunde verwenden, wird ClassicLadder die Sprossen langsamer aktualisieren. Die aktuelle Abfragezeit wird in der Abschnittsanzeige angezeigt, sie wird auf Mikrosekunden gerundet. Wenn die Abfragezeit länger als eine Millisekunde ist, sollten Sie den Kontaktplan verkürzen oder in einen langsameren Thread einfügen.

3.3. Variablen

Es ist möglich, die Anzahl der einzelnen Arten von Kontaktplanobjekten beim Laden des ClassicLadder Echtzeitmoduls zu konfigurieren. Wenn Sie die Anzahl der Kontaktplanobjekte nicht konfigurieren, verwendet ClassicLadder die Standardwerte.

Tabelle 1. Standard-Variablenzahl
Objektname Variablenname Standardwert

Anzahl der Sprossen

(numRungs)

100

Anzahl der Bits

(numBits)

20

Anzahl der Wortvariablen

(numWords)

20

Anzahl der Timer

(numTimers)

10

Anzahl der Timer IEC

(numTimersIec)

10

Anzahl der Monostabilen

(numMonostables)

10

Anzahl der Zähler

(numCounters)

10

Anzahl der Bitpins der HAL-Eingänge

(numPhysInputs)

15

Anzahl der HAL-Ausgangsbit-Pins

(numPhysOutputs)

15

Anzahl der arithmetischen Ausdrücke

(numArithmExpr)

50

Anzahl der Abschnitte

(numSections)

10

Anzahl der Symbole

(numSymbols)

Auto

Anzahl der S32-Eingänge

(numS32in)

10

Anzahl der S32-Ausgänge

(numS32out)

10

Anzahl der Float-Eingänge

(numFloatIn)

10

Anzahl der Float-Ausgänge

(numFloatOut)

10

Objekte von größtem Interesse sind numPhysInputs, numPhysOutputs, numS32in und numS32out.

Das Ändern dieser Zahlen ändert die Anzahl der verfügbaren HAL-Bit-Pins. numPhysInputs und numPhysOutputs steuern, wie viele HAL-Bit-Pins (ein/aus) verfügbar sind. numS32in und numS32out steuern, wie viele HAL-Pins für ganze Zahlen mit Vorzeichen (+- Ganzzahlbereich) verfügbar sind.

Zum Beispiel (Sie brauchen nicht alle, nur einige wenige zu ändern):

loadrt classicladder_rt numRungs=12 numBits=100 numWords=10
numTimers=10 numMonostables=10 numCounters=10 numPhysInputs=10
numPhysOutputs=10 numArithmExpr=100 numSections=4 numSymbols=200
numS32in=5 numS32out=5

Um die Standardanzahl von Objekten zu laden:

loadrt classicladder_rt

4. Laden des ClassicLadder Nicht-Echtzeit-Moduls

ClassicLadder-HAL-Befehle müssen ausgeführt werden, bevor die GUI geladen wird, sonst funktioniert der Menüpunkt Kontaktplan-Editor nicht. Wenn Sie den Stepper Config Wizard verwendet haben, platzieren Sie alle ClassicLadder-HAL-Befehle in der Datei custom.hal.

Diese Zeile lädt das Nicht-Echtzeit-Modul:

loadusr classicladder
Anmerkung
Es kann nur eine .clp-Datei geladen werden. Wenn Sie Ihren Kontaktplan unterteilen müssen, dann verwenden Sie Abschnitte.

Um eine Kontaktplan-Datei zu laden:

loadusr classicladder myladder.clp

ClassicLadder Lade-Optionen

  • --nogui' - (lädt ohne den Kontaktplan-Editor) wird normalerweise verwendet, wenn die Fehlersuche beendet ist.

  • --modbus_port=port - (lädt die Modbus-Portnummer)

  • --modmaster - (initialisiert den MODBUS-Master) sollte das Kontaktplanprogramm zur gleichen Zeit laden oder der TCP-Port ist Standard.

  • --modslave - (initialisiert MODBUS-Slave) nur TCP

Zur Verwendung von ClassicLadder mit HAL ohne EMC:

loadusr -w classicladder

Die Option -w weist HAL an, die HAL-Umgebung nicht zu schließen, bevor Classic Ladder beendet ist.

Wenn Sie zuerst ein Kontaktplanprogramm mit der Option --nogui laden und dann ClassicLadder erneut ohne Optionen laden, zeigt die GUI das zuletzt geladene Kontaktplanprogramm an.

In AXIS können Sie die GUI über Datei/Kontaktplan-Editor… laden.

5. ClassicLadder GUI

Wenn Sie ClassicLadder mit der GUI laden, werden zwei Fenster angezeigt: Abschnittsanzeige und Abschnittsmanager.

5.1. Sektions-Manager

Wenn Sie ClassicLadder zum ersten Mal starten, sehen Sie ein leeres Fenster des Abschnittsmanagers.

Sections Manager Standardfenster
Abbildung 1. Sections Manager Standardfenster

In diesem Fenster können Sie Abschnitte benennen, erstellen oder löschen und auswählen, welche Sprache der Abschnitt verwendet. Auf diese Weise benennen Sie auch ein Unterprogramm für Aufrufspulen (engl. call coils).

5.2. Abschnittsanzeige

Wenn Sie ClassicLadder zum ersten Mal starten, sehen Sie ein leeres Abschnittsanzeigefenster. Es wird eine leere Sprosse angezeigt.

Standardfenster der Abschnittsanzeige
Abbildung 2. Standardfenster der Abschnittsanzeige

Die meisten Buttons sind selbsterklärend:

Die Button Vars dient zur Anzeige von Variablen. Sie können sie umschalten, um das eine, das andere, beide oder keines der Fenster anzuzeigen.

Der Button Config wird für Modbus verwendet und zeigt die maximale Anzahl von Kontaktplanelementen an, die mit dem Echtzeitmodul geladen wurden.

Der Button Symbole zeigt eine editierbare Liste von Symbolen für die Variablen an (Hinweis: Sie können die Eingänge, Ausgänge, Spulen usw. benennen).

Mit der Schaltfläche Beenden wird das Nicht-Echtzeitprogramm, d. h. Modbus und das Display, beendet. Das Echtzeit-Kontaktplanprogramm wird weiterhin im Hintergrund ausgeführt.

Über das Kontrollkästchen oben rechts können Sie auswählen, ob Variablennamen oder Symbolnamen angezeigt werden

Vielleicht fällt Ihnen auf, dass unter der Anzeige des Kontaktplanprogramms eine Zeile mit der Aufschrift "Projekt konnte nicht geladen werden…" zu sehen ist. Das ist die Statusleiste, die Ihnen Informationen über Elemente des Kontaktplanprogramms gibt, auf die Sie im Anzeigefenster klicken. In dieser Statuszeile werden nun die HAL-Signalnamen für die Variablen %I, %Q und das erste %W (in einer Gleichung) angezeigt. Möglicherweise sehen Sie einige lustige Bezeichnungen, wie (103) in den Sprossen. Dies wird (absichtlich) aufgrund eines alten Fehlers angezeigt - beim Löschen von Elementen löschten ältere Versionen manchmal das Objekt nicht mit dem richtigen Code. Vielleicht haben Sie bemerkt, dass die lange horizontale Verbindungstaste in älteren Versionen manchmal nicht funktionierte. Das lag daran, dass das Programm nach dem freien Code suchte, aber etwas anderes fand. Die Zahl in den Klammern ist der nicht erkannte Code. Das Kontaktplanprogramm funktioniert trotzdem, löschen Sie die Codes mit dem Editor und speichern Sie das Programm.

5.3. Die Variablenfenster

Dies sind zwei Variablenfenster: das Bitstatus-Fenster (boolesch) und das Watch-Fenster (vorzeichenbehaftete Ganzzahl). Die Schaltfläche "Variablen" befindet sich im Fenster "Abschnittsanzeige". Wechseln Sie mit dem Button "Variablen" die Anzeige, um das eine, das andere, beide oder keines der Variablenfenster anzuzeigen.

Bit-Status-Fenster
Abbildung 3. Bit-Status-Fenster

Im Bitstatusfenster werden einige der booleschen Variablen (ein/aus) angezeigt. Beachten Sie, dass alle Variablen mit dem %-Vorzeichen beginnen. Die %I-Variablen stellen HAL-Eingangsbit-Pins dar. Der %Q steht für die Relaisspule und die HAL-Ausgangsbitpins. Das %B steht für eine interne Relaisspule oder einen internen Kontakt. In den drei Bearbeitungsbereichen oben können Sie auswählen, welche 15 Variablen in jeder Spalte angezeigt werden. Wenn beispielsweise die Spalte %B Variable 15 Einträge hoch wäre und Sie oben in der Spalte 5 eingegeben haben, werden die Variablen %B5 bis %B19 angezeigt. Mit den Kontrollkästchen können Sie %B-Variablen manuell festlegen und deaktivieren, solange das Leiterprogramm sie nicht als Ausgaben festlegt. Alle Bits, die vom Programm als Ausgaben festgelegt werden, wenn ClassicLadder ausgeführt wird, können nicht geändert werden und werden als aktiviert angezeigt, wenn sie aktiviert sind, und als deaktiviert, wenn sie deaktiviert sind.

Schaufenster
Abbildung 4. Schaufenster

Das Watch Window zeigt den Status der Variablen an. Das Eingabefeld daneben zeigt die in der Variablen gespeicherte Zahl an, und in der Dropdown-Box daneben können Sie wählen, ob die Zahl in Hex, Dezimal oder Binär angezeigt werden soll. Wenn im Symbole-Fenster Symbolnamen für die angezeigten Wortvariablen definiert sind und das Kontrollkästchen "Symbole anzeigen" im Fenster "Abschnitt anzeigen" aktiviert ist, werden die Symbolnamen angezeigt. Um die angezeigte Variable zu ändern, geben Sie die Variablennummer ein, z. B. %W2 (wenn das Kontrollkästchen "Symbole anzeigen" nicht aktiviert ist), oder geben Sie den Symbolnamen (wenn das Kontrollkästchen "Symbole anzeigen" aktiviert ist) über eine bestehende Variablennummer/einen bestehenden Variablennamen ein und drücken Sie die Eingabetaste.

5.4. Symbol-Fenster

Fenster mit Symbolnamen
Abbildung 5. Fenster mit Symbolnamen

Dies ist eine Liste von "Symbol"-Namen, die anstelle von Variablennamen im Schnittfenster angezeigt werden sollen, wenn das Kontrollkästchen "Symbole anzeigen" aktiviert ist. Sie fügen den Variablennamen (denken Sie an das %-Symbol und Großbuchstaben), den Symbolnamen. Wenn an die Variable ein HAL-Signal angeschlossen werden kann (%I, %Q und %W - wenn Sie den s32-Pin mit dem Echtzeitmodul geladen haben), wird im Kommentarbereich der Name des aktuellen HAL-Signals oder das Fehlen eines solchen angezeigt. Symbolnamen sollten zur besseren Darstellung kurz gehalten werden. Denken Sie daran, dass Sie die längeren HAL-Signalnamen der Variablen %I, %Q und %W anzeigen lassen können, indem Sie sie im Abschnittsfenster anklicken. Auf diese Weise sollte man in der Lage sein, den Überblick darüber zu behalten, womit das Kontaktplanprogramm verbunden ist!

5.5. Das Editor-Fenster

Editor-Fenster
Abbildung 6. Editor-Fenster
  • Hinzufügen (engl. add) - fügt eine Sprosse nach der ausgewählten Sprosse hinzu

  • Einfügen (engl. insert) - fügt eine Sprosse vor der ausgewählten Sprosse ein

  • Löschen (engl. delete) - löscht die ausgewählte Sprosse

  • Bearbeiten (engl. modify) - öffnet die ausgewählte Sprosse zur Bearbeitung

Beginnend mit dem Bild oben links:

  • Objektauswahl, Radiergummi

  • N.O. (engl. kurz für normally open)-Eingang, N.C. (engl. für normally closed)-Eingang, Eingang mit steigender Flanke, Eingang mit fallender Flanke

  • Horizontale Verbindung, Vertikale Verbindung, Lange Horizontale Verbindung

  • Timer IEC-Block, Zähler (engl. counter-)block, Vergleichsvariable

  • Alter Timer-Block, alter monostabiler Block (diese wurden durch den IEC-Timer ersetzt)

  • SPULEN (engl. coils) - N.O. Ausgang, N.C. Ausgang, den Ausgang setzen, Ausgang zurücksetzen

  • Jump Coil, Call Coil, Variable Zuweisung

Eine kurze Beschreibung der einzelnen Buttons:

  • Selector - ermöglicht es Ihnen, vorhandene Objekte auszuwählen und die Informationen zu ändern.

  • Radiergummi (engl. eraser) - löscht ein Objekt.

  • N.O. Contact - erzeugt einen normalerweise offenen Kontakt. Es kann sich um einen externen HAL-Pin (%I) Eingangskontakt, einen internen Bitspulenkontakt (%B) oder einen externen Spulenkontakt (%Q) handeln. Der HAL-Pin-Eingangskontakt wird geschlossen, wenn der HAL-Pin true ist. Die Spulenkontakte werden geschlossen, wenn die entsprechende Spule aktiv ist (%Q2-Kontakt schließt sich, wenn %Q2-Spule aktiv ist).

  • N.C. Kontakt - erstellt einen normalerweise geschlossenen Kontakt. Es ist das gleiche wie der N.O. Kontakt, außer dass der Kontakt offen ist, wenn der HAL-Pin wahr ist oder die Spule aktiv ist.

  • Rising Edge Contact - erzeugt einen Kontakt, der geschlossen wird, wenn der HAL-Pin von False auf True oder die Spule von nicht-aktiv auf aktiv wechselt.

  • Falling Edge Contact - erzeugt einen Kontakt, der geschlossen wird, wenn der HAL-Pin von true nach false oder die Spule von aktiv zu not wechselt.

  • Horizontale Verbindung - erzeugt eine horizontale Verbindung zu Objekten.

  • Vertikale Verbindung - erzeugt eine vertikale Verbindung zu horizontalen Linien.

  • Horizontal Running Connection - erstellt eine horizontale Verbindung zwischen zwei Objekten und ist eine schnelle Möglichkeit, Objekte zu verbinden, die mehr als einen Block voneinander entfernt sind.

  • IEC Timer - erstellt einen Timer und ersetzt den Timer.

  • Timer - erstellt ein Timer-Modul (veraltet, verwenden Sie stattdessen IEC-Timer).

  • Monostabil - erstellt ein monostabiles One-Shot-Modul

  • Counter - erstellt ein Zählermodul.

  • Compare - erstellt einen Vergleichsblock, um Variablen mit Werten oder anderen Variablen zu vergleichen, z.B. %W1<=5 oder %W1=%W2. Der Vergleich kann nicht auf der rechten Seite der Abschnittsanzeige platziert werden.

  • Variablenzuweisung (engl. variable assignment) - erstellt einen Zuweisungsblock, damit Sie Variablen Werte zuweisen können, z.B. %W2=7 oder %W1=%W2. ASSIGNMENT-Funktionen können nur auf der rechten Seite der Abschnittsanzeige platziert werden.

5.6. Konfigurationsfenster

Das Konfigurationsfenster zeigt den aktuellen Projektstatus und enthält die Registerkarten für die Modbus-Einrichtung.

Konfigurationsfenster
Abbildung 7. Konfigurationsfenster

6. SPS Objekte

6.1. KONTAKTE

Stellen Schalter oder Relaiskontakte dar. Sie werden durch den ihnen zugewiesenen variablen Buchstaben und die Nummer gesteuert.

Der variable Buchstabe kann B, I oder Q sein und die Nummer kann bis zu einer dreistelligen Zahl sein, z. B. %I2, %Q3 oder %B123. Die Variable I wird durch einen HAL-Eingangsstift mit einer entsprechenden Nummer gesteuert. Die Variable B ist für interne Kontakte und wird von einer B-Spule mit einer entsprechenden Nummer gesteuert. Die Variable Q wird durch eine Q-Spule mit der entsprechenden Nummer gesteuert (wie ein Relais mit mehreren Kontakten). Wenn z. B. der HAL-Pin classicladder.0.in-00 auf true steht, ist der Schließerkontakt %I0 eingeschaltet (geschlossen, true, wie auch immer Sie es nennen wollen). Wenn die Spule %B7 "erregt" ist (ein, wahr, usw.), dann wäre der Schließerkontakt %B7 eingeschaltet. Wenn die Spule %Q1 "erregt" ist, wäre der Schließer %Q1 eingeschaltet (und der HAL-Pin classicladder.0.out-01 wäre wahr).

  • N.O. Contact' - Normally Open Contact (Schließer) Ist die Variable mit false belegt, dann ist der Schalter aus.

  • N.C. Contact - Normally Closed Contact (Normalerweise geschlossen) Ist die Variable auf false gesetzt, so ist der Schalter eingeschaltet.

  • Rising Edge Contact - Wenn die Variable von false in true wechselt, wird der Schalter gepulst.

  • Falling Edge Contact - Wenn die Variable von true zu false wechselt, wird der Schalter gepulst eingeschaltet.

6.2. IEC-TIMER

Stellt neue Countdown-Timer dar. IEC-Timer ersetzen Timer und Monoflops.

IEC Timer haben 2 Kontakte.

  • I - Eingabekontakt

  • Q - Ausgangskontakt

Es gibt drei Modi - TON, TOF, TP.

  • TON - Wenn die Timer-Eingabe wahr ist, beginnt der Countdown und wird fortgesetzt, solange die Eingabe wahr bleibt. Nachdem der Countdown abgeschlossen ist und solange die Timer-Eingabe noch wahr, ist die Ausgabe wahr.

  • TOF - Wenn die Timereingabe true ist, wird die Ausgabe auf true gesetzt. Wenn die Eingabe false ist, zählt der Timer herunter und setzt die Ausgabe auf false.

  • TP - Wenn der Timer-Eingang auf wahr gepulst oder wahr gehalten wird, setzt der Timer den Ausgang auf wahr, bis der Timer herunterzählt. (einmalig)

Die Zeitintervalle können in Vielfachen von 100 ms, Sekunden oder Minuten eingestellt werden.

Es gibt auch Variablen für IEC-Timer, die in Vergleichs- oder Betriebsblöcken gelesen und/oder beschrieben werden können.

  • %TMxxx.Q - Timer beendet (Boolesch, Lesen/Schreiben)

  • %TMxxx.P - Timer-Voreinstellung (Lesen/Schreiben)

  • %TMxxx.V - Timer-Wert (lesender Schreibvorgang)

6.3. ZEITGLIEDER (engl. timers)

Repräsentiert Countdown-Timer. Dies ist veraltet und wird durch IEC Timers ersetzt.

Timer haben 4 Kontakte.

  • E - aktivieren (engl. enable) (Eingang) startet den Timer, wenn wahr, setzt zurück, wenn er falsch wird

  • C - Steuerung (engl. control) (Eingang) muss eingeschaltet sein, damit der Timer läuft (normalerweise mit E verbinden)

  • D - fertig (engl. done) (Ausgang) wahr, wenn der Timer abläuft und solange E wahr bleibt

  • R - läuft (engl. running) (Ausgang) true, wenn Timer läuft

Die Basis des Timers kann ein Vielfaches von Millisekunden, Sekunden oder Minuten sein.

Es gibt auch Variablen für Zeitgeber, die in Vergleichs- oder Operationsblöcken gelesen und/oder beschrieben werden können.

  • %Txx.R - Timer xx läuft (boolesch, nur Lesen)

  • %Txx.D - Timer xx fertig (Boolesch, nur lesbar)

  • %Txx.V - Timer xx aktueller Wert (Ganzzahl, nur lesbar)

  • %Txx.P - Timer xx voreingestellt (Ganzzahl, lesen oder schreiben)

6.4. KIPPSTUFEN (engl. monostables)

Repräsentieren die ursprünglichen One-Shot-Timer. Dies ist jetzt veraltet und wird durch IEC-Timer ersetzt.

Monostabile haben 2 Kontakte, I und R.

  • I - Eingang (Eingang) startet den Mono-Timer.

  • R - Running (Ausgang) ist wahr, während der Timer läuft.

Der I-Kontakt reagiert auf eine steigende Flanke, d.h. er startet den Timer nur, wenn er von false auf true (oder von off auf on) wechselt. Während der Timer läuft, kann sich der I-Kontakt ändern, ohne dass dies Auswirkungen auf den laufenden Timer hat. R wird wahr und bleibt wahr, bis der Timer auf Null gezählt hat. Die Basis des Timers kann ein Vielfaches von Millisekunden, Sekunden oder Minuten sein.

Es gibt auch Variablen für Kippstufen, die in Vergleichs- oder Operationsblöcken gelesen und/oder beschrieben werden können.

  • %Mxx.R - Kippstufe xx läuft (boolesch, nur lesbar)

  • %Mxx.V - Monostabiler xx aktueller Wert (ganze Zahl, schreibgeschützt)

  • %Mxx.P - Monostabile xx-Voreinstellung (Ganzzahl, Lesen oder Schreiben)

6.5. ZÄHLER (engl. counters)

Aufwärts-/Abwärtszähler darstellen.

Es gibt 7 Kontakte:

  • R - reset (Eingabe) setzt die Anzahl auf 0 zurück.

  • P - Voreinstellung (engl. preset) (Eingabe) setzt den Zähler auf die im Bearbeitungsmenü zugewiesene Voreinstellungsnummer.

  • U - Aufwärtszählung (Eingabe) fügt der Zählung eins hinzu.

  • D - Abwärtszählung (Eingang) subtrahiert eins von der Zählung.

  • E - under flow (output) ist wahr, wenn die Zählung von 0 auf 9999 übertragen wird.

  • D - done (Ausgabe) ist wahr, wenn die Anzahl gleich der Voreinstellung ist.

  • F - Überlauf (Ausgabe) ist wahr, wenn die Anzahl von 9999 auf 0 übertragen wird.

Die Aufwärts- und Abwärtszählkontakte sind flankenempfindlich, d. h. sie zählen nur, wenn der Kontakt von falsch auf wahr wechselt (oder von aus auf ein, wenn Sie das wünschen).

Der Bereich reicht von 0 bis 9999.

Es gibt auch Variablen für Zähler, die in Vergleichs- oder Operationsblöcken gelesen und/oder beschrieben werden können.

  • %C`__xx__.D` - Zähler xx fertig (Boolesch, nur lesbar)

  • %C`__xx__.E` - Zähler xx leerer Überlauf (boolesch, schreibgeschützt)

  • %C`__xx__.F` - Zähler xx voller Überlauf (boolesch, nur Lesen)

  • %C`__xx__.V` - Zähler xx aktueller Wert (Ganzzahl, Lesen oder Schreiben)

  • %C`__xx__.P` - Zähler xx voreingestellt (Ganzzahl, lesen oder schreiben)

6.6. VERGLEICHEN

Für den arithmetischen Vergleich. Ist die Variable %XXX = zu dieser Zahl (oder der ausgewerteten Zahl)

Der Vergleichsblock wird wahr, wenn der Vergleich wahr ist. Sie können die meisten mathematischen Symbole verwenden:

  • +, - , * , /, = (mathematische Standardzeichen)

  • < (kleiner als), > (größer als), <= (kleiner oder gleich), >= (größer oder gleich), <> (ungleich)

  • (, ) trennen in Gruppen Beispiel %IF1=2,&%IF2<5 im Pseudocode bedeutet, wenn %IF1 gleich 2 ist und %IF2 kleiner als 5 ist, dann ist der Vergleich wahr. Beachten Sie das Komma, das die beiden Gruppen von Vergleichen trennt.

  • ^ (Exponent), % (Modul), & (und), | (oder),. -

  • ABS (absolut), MOY (französisch für Durchschnitt), AVG (Durchschnitt)

Zum Beispiel ABS(%W2)=1, MOY(%W1,%W2)<3.

In der Vergleichsgleichung sind keine Leerzeichen erlaubt. Zum Beispiel ist %C0.V>%C0.P ein gültiger Vergleichsausdruck, während %C0.V > %CO.P kein gültiger Ausdruck ist.

Unten auf der Seite befindet sich eine Liste von Variablen, die zum Lesen von und Schreiben in Kontaktplanobjekten verwendet werden können. Wenn ein neuer Vergleichsblock geöffnet wird, achten Sie darauf, das Symbol # zu löschen, wenn Sie einen Vergleich eingeben.

Um herauszufinden, ob die Wortvariable Nr. 1 kleiner als das 2-fache des aktuellen Wertes von Zähler Nr. 0 ist, lautet die Syntax wie folgt:

%W1<2*%C0.V

Um herauszufinden, ob S32in Bit 2 gleich 10 ist, würde die Syntax lauten:

%IW2=10

Hinweis: Compare verwendet das arithmetische Gleichheitszeichen und nicht das doppelte Gleichheitszeichen, an das Programmierer gewöhnt sind.

6.7. VARIABLENZUWEISUNG

Für die Variablenzuweisung, z. B. Zuweisung dieser Zahl (oder einer ausgewerteten Zahl) an diese Variable %xxx, gibt es zwei mathematische Funktionen MINI und MAXI, die eine Variable auf Maximal- (0x80000000) und Minimalwerte (0x07FFFFFFF) prüfen (man denke an vorzeichenbehaftete Werte) und verhindern, dass diese überschritten werden.

Wenn ein neuer Variablenzuweisungsblock geöffnet wird, achten Sie darauf, das Symbol # zu löschen, wenn Sie eine Zuweisung eingeben.

Um der Timer-Voreinstellung von IEC Timer 0 den Wert 10 zuzuweisen, lautet die Syntax:

%TM0.P=10

Um den Wert von 12 auf s32out Bit 3 zuzuweisen, wäre folgendes:

%QW3=12
Anmerkung
Wenn Sie einer Variablen mit dem Variablenzuweisungsblock einen Wert zuweisen, bleibt der Wert erhalten, bis Sie mit dem Variablenzuweisungsblock einen neuen Wert zuweisen. Der zuletzt zugewiesene Wert wird wiederhergestellt, wenn LinuxCNC gestartet wird.

Die folgende Abbildung zeigt ein Zuweisungs- und ein Vergleichsbeispiel. %QW0 ist ein S32out-Bit und %IW0 ist ein S32in-Bit. In diesem Fall wird der HAL-Pin classicladder.0.s32out-00 auf einen Wert von 5 gesetzt, und wenn der HAL-Pin classicladder.0.s32in-00 0 ist, wird der HAL-Pin classicladder.0.out-00 auf True gesetzt.

Beispiel für Zuordnen/Vergleichen
Abbildung 8. Beispiel für Zuordnen/Vergleichen von mit SPS
images/Assignment_Expression.png
Abbildung 9. Beispiel für einen Zuweisungsausdruck
images/Comparison_Expression.png
Abbildung 10. Beispiel für einen Vergleichsausdruck

6.8. SPULEN (engl. coils)

Spulen stellen Relaisspulen dar. Sie werden durch den ihnen zugewiesenen variablen Buchstaben und die Nummer gesteuert.

Der variable Buchstabe kann B oder Q sein und die Nummer kann bis zu einer dreistelligen Zahl sein, z. B. %Q3 oder %B123. Q-Spulen steuern HAL-Ausgangsstifte, z. B. wenn %Q15 aktiviert ist, wird der HAL-Pin classicladder.0.out-15 wahr. B-Spulen sind interne Spulen, die zur Steuerung des Programmablaufs verwendet werden.

  • N.O. COIL' - Eine Relaisspule: Wenn die Spule erregt ist, wird ihr Kontakt, der normalerweise offen ist (kurz: N.O.), geschlossen (eingeschaltet, wahr, etc.) und der Strom kann passieren.

  • N.C. COIL' - Eine Relaisspule, die ihre Kontakte umkehrt: Wenn die Spule erregt wird, dann wird der normalerweise geschlossene Kontakt (engl. kurz: N.C.) geöffnet (ausgeschaltet, falsch, usw.) und der Stromfluss wird unterbrochen.

  • SET COIL - Eine Relaisspule mit verriegelten Kontakten: Wenn die Spule erregt ist, wird der Kontakt geschlossen und bleibt dies.

  • RESET COIL - (eine Relaisspule mit selbsthaltenden Kontakten) Wenn die Spule erregt ist, wird der N.0.-Kontakt offen gehalten.

  • JUMP COIL - (eine goto Spule), wenn die Spule erregt wird, springt das Kontaktplanprogramm zu einem Strompfad (im Abschnitt CURRENT) - die Sprungpunkte werden durch eine Strompfadbezeichnung gekennzeichnet. (Sprossenbeschriftungen in der Abschnittsanzeige, oben links, hinzufügen.)

  • CALL COIL - Eine gosub-Spule: Wenn die Spule erregt wird, dann springt das Programm zu einem Unterprogrammabschnitt, der durch eine Unterprogrammnummer gekennzeichnet ist - Unterprogramme werden mit SR0 bis SR9 bezeichnet (bestimmen Sie sie im Abschnittsmanager).

Warnung
Wenn Sie einen NC-Kontakt mit einer NC-Spule verwenden, funktioniert die Logik (wenn die Spule erregt ist, wird der Kontakt geschlossen), aber das ist wirklich schwer zu verstehen!

6.8.1. SPRUNGSPULE (engl. jump coil)

Eine JUMP COIL wird verwendet, um zu einem anderen Abschnitt zu springen, wie ein goto in der Programmiersprache BASIC.

Oben links im Fenster der Abschnittsanzeige sehen Sie ein kleines Beschriftungsfeld und ein längeres Kommentarfeld daneben. Gehen Sie nun auf Editor→Ändern und dann zurück zu dem kleinen Kästchen, um einen Namen einzugeben.

Fügen Sie einfach einen Kommentar im Kommentarbereich hinzu. Diese Bezeichnung ist nur der Name dieser Sprosse und wird von der JUMP COIL verwendet, um zu erkennen, wohin sie gehen soll.

Wenn Sie eine JUMP COIL platzieren, fügen Sie sie an der äußersten rechten Position ein und ändern die Beschriftung in die Sprosse, zu der Sie JUMPEN wollen.

6.8.2. RUFSPULE (engl. call coil)

Eine CALL COIL wird verwendet, um zu einem Unterprogramm zu gelangen und dann zurückzukehren, wie ein gosub in der Programmiersprache BASIC.

Gehen Sie zum Fenster Abschnittsmanager und klicken Sie auf die Schaltfläche Abschnitt hinzufügen. Sie können diesen Abschnitt benennen, die Sprache (Kontaktplan oder sequentiell) und den Typ (Haupt- oder Unterprogramm) auswählen.

Wählen Sie eine Unterprogrammnummer (z. B. SR0). Es wird ein leerer Abschnitt angezeigt und Sie können Ihr Unterprogramm erstellen.

Wenn Sie das getan haben, gehen Sie zurück zum Abschnittsmanager und klicken Sie auf Ihren Hauptabschnitt (Standardname prog1).

Jetzt können Sie eine CALL COIL in Ihr Programm einfügen. CALL COILs sind an der äußersten rechten Position im Strompfad zu platzieren.

Vergessen Sie nicht, die Beschriftung in die Nummer des Unterprogramms zu ändern, die Sie zuvor gewählt haben.

7. ClassicLadder Variablen

Diese Variablen werden in COMPARE oder OPERATE verwendet, um Informationen über Kontaktplanobjekte zu erhalten oder deren Spezifikationen zu ändern, z. B. um einen Zähler zu ändern oder um zu sehen, ob ein Timer fertig ist.

Liste der Variablen :

  • %Bxxx - Bitspeicher xxx (boolesch)

  • %Wxxx - Word-Speicher xxx (32 Bit Vorzeichen)

  • '%IWxxx - Wort-Speicher xxx (S32 in Pin)

  • %QWxxx - Word-Speicher xxx (S32-Ausgangspin)

  • %IFxx - Word-Speicher xx (Gleitkomma Eingangs-Pin) (konvertiert zu S32 in ClassicLadder)

  • %QFxx - Word-Speicher xx (Gleitkomma-Ausgangs-Pin) (konvertiert in S32 in ClassicLadder)

  • %T`__xx__.R` - Timer xx läuft (boolesch, schreibgeschützt für Benutzer)

  • %T`__xx__.D` - Timer xx erledigt (Boolescher Wert, nur für Benutzer)

  • %T`__xx__.V` - Timer xx aktueller Wert (ganze Zahl, schreibgeschützt für Benutzer)

  • %T`__xx__.P` - Timer xx Voreinstellung (ganze Zahl)

  • %TM`__xxx__.Q` - Timer xxx fertig (Boolesch, lesen/schreiben)

  • %TM`__xxx__.P` - Timer xxx Voreinstellung (ganze Zahl, Schreiblese)

  • %TM`__xxx__.V` - Timer xxx Wert (ganze Zahl, lesender Schreibzugriff)

  • '%M`__xx__.R` - Monostabile xx läuft (boolesch)

  • %M`__xx__.V` - Monostabile xx aktueller Wert (Ganzzahl, nur vom Benutzer lesbar)

  • %M`__xx__.P` - Monostabile xx Voreinstellung (Ganzzahl)

  • %C`__xx__.D` - Zähler xx fertig (Boolesch, Benutzer schreibgeschützt)

  • %C`__xx__.E` - Zähler xx leerer Überlauf (Boolean, nur vom Benutzer gelesen)

  • %C`__xx__.F` - Zähler xx voller Überlauf (Boolean, schreibgeschützter Benutzer)

  • %C`__xx__.V` - Zähler xx aktueller Wert (Ganzzahl)

  • %C`__xx__.P` - Zähler xx Voreinstellung (ganze Zahl)

  • %Ixxx - Physikalischer Eingang xxx (Boolean) (HAL-Eingangsbit)

  • %Qxxx - Physikalische Ausgabe xxx (Boolesch) (HAL-Ausgangsbit)

  • %Xxxx - Aktivität von Schritt xxx (sequentielle Sprache)

  • %X`__xxx__.V` - Zeit der Aktivität in Sekunden von Schritt xxx (sequenzielle Sprache)

  • %Exx - Fehler (Boolean, read write(wird überschrieben))

  • Indizierte oder vektorisierte Variablen - Dies sind Variablen, die durch eine andere Variable indiziert werden. Einige mögen dies vektorisierte Variablen nennen. Beispiel: %W0[%W4] => Wenn %W4 gleich 23 ist, entspricht es %W23

8. GRAFCET (State Machine) Programmierung

Warnung
Dies ist wahrscheinlich die am wenigsten genutzte und am schlechtesten verstandene Funktion von ClassicLadder. Die Ablaufprogrammierung wird verwendet, um sicherzustellen, dass eine Reihe von Kontaktplanereignissen immer in einer bestimmten Reihenfolge abläuft. Ablaufprogramme funktionieren nicht allein. Es gibt immer auch ein Kontaktplanprogramm, das die Variablen steuert. Hier sind die Grundregeln für Ablaufprogramme:
  • Regel 1: Ausgangssituation - Die Ausgangssituation wird durch die Anfangsschritte charakterisiert, die sich zu Beginn des Vorgangs per Definition im aktiven Zustand befinden; es muss mindestens einen Anfangsschritt geben.

  • Regel 2 : R2, Löschung einer Transition - Eine Transition ist entweder aktiviert oder deaktiviert. Sie gilt als aktiviert, wenn alle unmittelbar vorangehenden Schritte, die mit dem entsprechenden Übergangssymbol verbunden sind, aktiv sind, ansonsten ist sie deaktiviert. Eine Transition kann nur gelöscht werden, wenn sie aktiviert ist und die zugehörige Transitionsbedingung wahr ist.

  • Regel 3 : R3, Entwicklung aktiver Schritte - Die Löschung eines Übergangs führt gleichzeitig zum aktiven Zustand des/der unmittelbar folgenden Schrittes/Schritte und zum inaktiven Zustand des/der unmittelbar vorangehenden Schrittes/Schritte.

  • Regel 4 : R4, Gleichzeitige Löschung von Übergängen - Alle gleichzeitig gelöschten Übergänge werden gleichzeitig gelöscht.

  • Regel 5 : R5, Gleichzeitiges Aktivieren und Deaktivieren eines Schrittes - Wenn während des Betriebs ein Schritt gleichzeitig aktiviert und deaktiviert wird, hat die Aktivierung Vorrang.

Dies ist das Fenster des SEQUENTIAL-Editors. (Beginnend von oben links):
Auswahlpfeil, Radiergummi
Gewöhnlicher Schritt, Anfangsschritt (Start)
Transition, Schritt und Transition
Übergang Link-unten, Übergang Link-oben
Durchgang Link-unten, Durchgang Link-oben Sprung
Link, Kommentarfeld

Fenster des Sequenzeditors
Abbildung 11. Fenster des Sequenzeditors
  • ORDINARY STEP - hat für jeden eine eindeutige Nummer

  • STARTING STEP - ein sequentielles Programm muss einen haben. Hier beginnt das Programm.

  • TRANSITION - zeigt die Variable an, die wahr sein muss, damit die Steuerung zum nächsten Schritt übergeht.

  • STEP AND TRANSITION - der Einfachheit halber kombiniert

  • TRANSITION LINK-DOWNSIDE - teilt den Logikfluss in eine von zwei möglichen Linien auf, je nachdem, welcher der nächsten Schritte zuerst wahr ist (denken Sie an die ODER-Logik)

  • TRANSITION LINK=UPSIDE - verbindet zwei (ODER) Logiklinien wieder zu einer

  • PASS-THROUGH-LINK-DOWNSIDE - teilt den Logikfluss in zwei Zeilen auf, dass BEIDE wahr sein müssen, um fortzufahren (Think AND logic)

  • PASS-THROUGH-LINK-UPSIDE - kombiniert zwei gleichzeitige (UND logische) Logiklinien wieder zusammen

  • JUMP LINK - verbindet Schritte, die nicht untereinander liegen, z. B. das Verbinden des letzten Schritts mit dem ersten

  • COMMENT BOX - wird verwendet, um Kommentare hinzuzufügen

Um Verknüpfungen zu verwenden, müssen Sie bereits Schritte platziert haben. Wählen Sie die Art der Verknüpfung und dann die beiden Schritte oder Transaktionen nacheinander aus. Das erfordert Übung!

Bei sequentieller Programmierung: Die Variable %X`__xxx__ (z. B. `%X5´) wird verwendet, um festzustellen, ob ein Schritt aktiv ist. Die Variable `%X`__xxx__.V` (z. B. %X5.V) wird verwendet, um festzustellen, wie lange der Schritt aktiv war. Die Variablen %X und %X.v werden in der LADDER-Logik verwendet. Die den Transitionen zugeordneten Variablen (z. B. %B) steuern, ob die Logik zum nächsten Schritt übergeht. Nachdem ein Schritt aktiv geworden ist, hat die Übergangsvariable, die ihn aktiv werden ließ, keine Kontrolle mehr über ihn. Der letzte Schritt muss nur noch zum Anfangsschritt zurückspringen (JUMP LINK).

9. Modbus

Zu beachtende Punkte:

  • Modbus ist ein Nicht-Echtzeitprogramm, so dass es auf einem stark belasteten Computer zu Latenzproblemen kommen kann.

  • Modbus eignet sich nicht wirklich für harte Echtzeit-Ereignisse wie die Positionssteuerung von Motoren oder die Steuerung von Notausschaltern.

  • Das ClassicLadder GUI muss ausgeführt werden, damit Modbus ausgeführt werden kann.

  • Modbus ist noch nicht ganz fertig, so dass nicht alle Modbus-Funktionen zur Verfügung stehen.

Um MODBUS zu initialisieren, müssen Sie dies beim Laden des ClassicLadder Nicht-Echtzeitprogramms angeben.

Laden von Modbus
loadusr -w classicladder --modmaster myprogram.clp

Das -w bewirkt, dass HAL wartet, bis Sie ClassicLadder schließen, bevor es die Echtzeit-Sitzung beendet. ClassicLadder lädt auch einen TCP-Modbus-Slave, wenn Sie --modserver auf der Kommandozeile hinzufügen.

Modbus-Funktionen
  • 1 - Spulen lesen

  • 2 - Eingänge lesen

  • 3 - Halteregister lesen

  • 4 - Eingaberegister lesen

  • 5 - einzelne Spulen schreiben

  • 6 - Einzelnes Register schreiben

  • 8 - Echo-Test

  • 15 - mehrere Spulen schreiben

  • 16 - mehrere Register schreiben

Wenn Sie beim Laden des Nicht-Echtzeit-Programms ClassicLadder kein --modmaster angeben, wird diese Seite nicht angezeigt.

E/A (engl. I/O)-Konfiguration
Abbildung 12. Modbus I/O-Konfiguration
Konfig Coms
Abbildung 13. Modbus-Kommunikationskonfiguration
  • SERIAL PORT - Für IP leer. Für seriell der Ort/Name des seriellen Treibers, z.B. /dev/ttyS0 ( oder /dev/ttyUSB0 für einen USB-zu-Seriell-Konverter).

  • SERIAL SPEED - Sollte auf Geschwindigkeit eingestellt sein, für die der Slave eingestellt ist - 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 werden unterstützt.

  • PAUSE AFTER TRANSMIT - Pause (Millisekunden) nach dem Senden und vor dem Empfang der Antwort, einige Geräte benötigen mehr Zeit (z. B. USB-zu-Seriell-Konverter).

  • PAUSE INTER-FRAME - Pause (Millisekunden) nach Erhalt der Antwort vom Slave. Dadurch wird der Arbeitszyklus von Anforderungen festgelegt (es ist eine Pause für JEDE Anforderung).

  • REQUEST TIMEOUT LENGTH - Länge (Millisekunden) der Zeit, bevor wir entscheiden, dass der Slave nicht geantwortet hat.

  • MODBUS ELEMENT OFFSET - wird verwendet, um die Elementnummern um 1 zu kompensieren (für Hersteller, die Unterschiede nummerieren).

  • DEBUG LEVEL - Setzen Sie dies auf 0-3 (0, um das Drucken von Debug-Informationen neben No-Response-Fehlern zu stoppen).

  • READ COILS/INPUTS MAP TO - Wählen Sie, welche Variablen die gelesenen Spulen/Eingänge aktualisieren sollen. (B oder Q).

  • WRITE COILS MAP TO - Wählen Sie aus, von welchen Variablen, von denen Schreibspulen aktualisiert werden sollen (B, Q oder I).

  • READ REGISTERS/HOLDING - Wählen Sie aus, welche Variablen durch das Lesen von Registern aktualisiert werden sollen (W oder QW).

  • WRITE REGISTERS MAP TO - Wählen Sie aus, von welchen Variablen die Leseregister aktualisiert werden (W, QW oder IW).

  • SLAVE-ADRESSE - Für serielle die Slave-ID-Nummer normalerweise auf dem Slave-Gerät einstellbar (normalerweise 1-256). Für IP die Slave-IP-Adresse plus optional die Portnummer.

  • TYPE ACCESS - Dies wählt den MODBUS-Funktionscode aus, der an den Slave gesendet werden soll (z. B. welche Art von Anfrage).

  • COILS / INPUTS - Eingänge und Spulen (Bits) werden aus I-, B- oder Q-Variablen gelesen / geschrieben (Benutzerauswahl).

  • REGISTERS (WORDS) - Register (Wörter/Zahlen) werden IW-, W- oder QW-Variablen zugeordnet (Benutzerauswahl).

  • 1st MODBUS ELEMENT - Die Adresse (oder Registernummer) des ersten Elements in einer Gruppe (Denken Sie daran, MODBUS ELEMENT OFFSET richtig einzustellen).

  • ANZAHL DER ELEMENTE - Die Anzahl der Elemente in dieser Gruppe.

  • LOGIC - Sie können die Logik hier umkehren.

  • 1st%I%Q IQ WQ MAPPED - Dies ist die Startnummer von %B, %I, %Q, %W, %IW oder %QW Variablen, die auf/von der Modbus-Elementgruppe zugeordnet werden (beginnend mit der ersten Modbus-Elementnummer).

Im obigen Beispiel: Portnummer - für meinen Computer war /dev/ttyS0 meine serielle Schnittstelle.

Die serielle Geschwindigkeit ist auf 9600 Baud eingestellt.

Die Slave-Adresse ist auf 12 gesetzt (auf meinem VFD kann ich dies von 1-31 einstellen, was bedeutet, dass ich auf einem System maximal mit 31 VFDs sprechen kann).

Die erste Zeile ist für 8 Eingangsbits eingerichtet, beginnend mit der ersten Registernummer (Register 1). Die Registernummern 1-8 werden also auf die %B-Variablen von ClassicLadder abgebildet, beginnend bei %B1 und endend bei %B8.

Die zweite Zeile ist für 2 Ausgangsbits ab der neunten Registernummer (Register 9) eingestellt, so dass die Registernummern 9-10 auf die %Q-Variablen von ClassicLadder abgebildet werden, die bei %Q9 beginnen und bei %Q10 enden.

Die dritte Zeile ist so eingestellt, dass 2 Register (je 16 Bit) geschrieben werden, beginnend mit der 0ten Registernummer (Register 0), so dass die Registernummern 0-1 auf die %W-Variablen des ClassicLadder abgebildet werden, beginnend mit %W0 und endend mit %W1.

Es ist leicht, einen Off-by-One-Fehler zu machen, da die Modbus-Elemente manchmal bei 1 und nicht bei 0 referenziert werden (eigentlich ist das laut Standard so vorgesehen!). Sie können die Optionsschaltfläche für den Modbus-Element-Offset verwenden, um dies zu vermeiden.

In den Unterlagen zu Ihrem Modbus-Slave-Gerät finden Sie Informationen darüber, wie die Register aufgebaut sind - es gibt keine Standardmethode.

Die Parameter SERIAL PORT, PORT SPEED, PAUSE und DEBUG-Level können geändert werden (beim Schließen des Konfigurationsfensters werden die Werte übernommen, die Radio-Buttons gelten jedoch sofort).

Um die Echo-Funktion zu verwenden, wählen Sie die Echo-Funktion aus und fügen Sie die Slave-Nummer hinzu, die Sie testen möchten. Sie müssen keine Variablen angeben.

Die Nummer 257 wird an die von Ihnen angegebene Slave-Nummer gesendet und der Slave sollte sie zurücksenden. Sie müssen ClassicLadder in einem Terminal laufen lassen, um die Nachricht zu sehen.

10. MODBUS-Einstellungen

Seriell:

  • ClassicLadder verwendet das RTU-Protokoll (nicht ASCII).

  • 8 Datenbits, keine Parität und 1 Stoppbit werden auch als 8-N-1 bezeichnet.

  • Die Baudrate muss für Slave und Master gleich sein. ClassicLadder kann nur eine Baudrate haben, also müssen alle Slaves auf die gleiche Rate eingestellt werden.

  • Das Pausenintervall ist die Zeitspanne, die nach dem Empfang einer Antwort pausiert wird.

  • MODBUS_TIME_AFTER_TRANSMIT ist die Länge der Pause nach dem Senden einer Anfrage und vor dem Empfang einer Antwort (dies hilft offenbar bei langsamen USB-Wandlern).

10.1. MODBUS-Info

  • ClassicLadder kann verteilte Eingänge/Ausgänge auf Modulen verwenden, die das Modbus-Protokoll verwenden ("Master": abfragende Slaves).

  • Die Slaves und ihre I/O können im Konfigurationsfenster konfiguriert werden.

  • Es sind 2 exklusive Modi verfügbar: Ethernet mit Modbus/TCP und seriell mit Modbus/RTU.

  • Es wird keine Parität verwendet.

  • Wenn kein Portname für die serielle Schnittstelle eingestellt ist, wird der TCP/IP-Modus verwendet…

  • Die Slave-Adresse ist die Slave-Adresse (Modbus/RTU) oder die IP-Adresse.

  • Die IP-Adresse kann durch die zu verwendende Portnummer ergänzt werden (xx.xx.xx.xx:pppp), andernfalls wird standardmäßig der Port 9502 verwendet.

  • Für die Tests wurden 2 Produkte verwendet: ein Modbus/TCP-Produkt (Adam-6051, https://www.advantech.com) und ein serielles Modbus/RTU-Produkt (http://www.ipac.ws).

  • Siehe Beispiele: adam-6051 und modbus_rtu_serial.

  • Weblinks: https://www.modbus.org und dieser interessante Link: http://www.iatips.com/modbus.html

  • MODBUS TCP SERVER ENTHALTEN

  • ClassicLadder hat einen Modbus/TCP-Server integriert. Der Standard-Port ist 9502. (der vorherige Standard 502 erfordert, dass die Anwendung mit Root-Rechten gestartet werden muss).

  • Die Liste der unterstützten Modbus-Funktionscodes lautet: 1, 2, 3, 4, 5, 6, 15 und 16.

  • Die Korrespondenztabelle der Modbus-Bits und -Worte ist eigentlich nicht parametrisch und entspricht direkt den Variablen %B und %W.

Weitere Informationen zum Modbus-Protokoll finden Sie im Internet.

10.2. Kommunikationsfehler

Wenn ein Kommunikationsfehler auftritt, wird ein Warnfenster angezeigt (wenn die grafische Benutzeroberfläche läuft) und %E0 ist wahr. Modbus wird weiterhin versuchen, zu kommunizieren. Der %E0-Wert kann verwendet werden, um eine Entscheidung auf der Grundlage des Fehlers zu treffen. Ein Timer könnte verwendet werden, um die Maschine anzuhalten, wenn die Zeit abgelaufen ist, usw.

11. Fehlersuche bei Modbus-Problemen

Eine gute Referenz für das Protokoll: https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf. Wenn Sie linuxcnc/classicladder von einem Terminal aus starten, werden die Modbus-Befehle und Slave-Antworten ausgegeben.

Hier wird der ClassicLadder so eingestellt, dass er den Slave 1 auffordert, die Holding-Register (Funktionscode 3) ab Adresse 8448 (0x2100) zu lesen. Wir fordern die Rückgabe von 1 (2 Byte breiten) Datenelement an. Wir ordnen es einer ClassicLadder-Variablen zu, startend bei 2.

Config I/O Register Einstellung
Abbildung 14. Modbus I/O-Register-Setup

Hinweis in diesem Bild haben wir die Debug-Ebene auf 1 gesetzt, so dass Modbus-Nachrichten an das Terminal ausgegeben werden. Wir haben unsere Lese- und Schreibregister den %W-Variablen von ClassicLadder zugeordnet, so dass unsere zurückgegebenen Daten in %W2 sind, wie in dem anderen Bild, in dem wir die Daten ab dem 2. Element zugeordnet haben.

Kommunikation Einstellung
Abbildung 15. Einrichtung der Modbus-Kommunikation

11.1. Anfrage

Betrachten wir ein Beispiel für das Lesen eines Hold-Registers bei 8448 Decimal (0x2100 Hex).

Blick in die Modbus-Protokollreferenz:

Tabelle 2. Halteregisteranforderung lesen
Name Anzahl Bytes Wert (hex)

Funktionscode

(1 Byte)

3 (0x03)

Startadresse

(2 Bytes)

0 - 65535 (0x0000 bis 0xFFFF)

Anzahl von Registern

(2 Bytes)

1 bis 125 (0x7D)

Prüfsumme

(2 Bytes)

Automatisch berechnet

Hier ist ein Beispiel für einen gesendeten Befehl, wie er im Terminal ausgedruckt wird (alles in Hex):

INFO CLASSICLADDER-   Modbus I/O module to send: Lgt=8 <-  Slave address-1  Function code-3  Data-21 0 0 1 8E 36

Bedeutung (Hex):

  • Lgt = 8 = Nachricht ist 8 Bytes lang, einschließlich Slave-Nummer und Prüfsummen-Nummer

  • Slave-Nummer = 1 (0x1) = Slave-Adresse 1

  • Funktionscode = 3 (0x3) = Halteregister lesen

  • Start bei Adresse = Highbyte 33 (0x21) Lowbyte 0 (0x00) = kombinierte Adresse = 8448 (0x2100)

  • Anzahl der Register = 1 (0x1) = 1 2-Byte-Register zurückgeben (Halte- und Leseregister sind immer 2 Byte breit)

  • Prüfsumme = Highbyte 0x8E Lowbyte 0x36 = (0x8E36)

11.2. Fehlerreaktion

Bei einer Fehlerantwort sendet er den Funktionscode plus 0x80, einen Fehlercode und eine Prüfsumme. Eine Fehlerantwort zu erhalten bedeutet, dass der Slave den Anforderungsbefehl sieht, aber keine gültigen Daten liefern kann. Schauen Sie in der Modbus-Protokollreferenz nach:

Tabelle 3. Fehler bei Funktionscode 3 (Lesen des Holdingregisters)
Name Anzahl Bytes Wert (hex)

Fehlercode

1 Byte

131 (0x83)

Ausnahmecode

1 Byte

1-4 (0x01 bis 0x04)

Prüfsumme

(2 Bytes)

Automatisch berechnet

Bedeutung des Ausnahmecodes:

  • 1 - illegal Funktion

  • 2 - unzulässige Datenadresse

  • 3 - unzulässiger Datenwert

  • 4 - Ausfall des Slave-Geräts

Hier ist ein Beispiel für einen empfangenen Befehl, wie er im Terminal ausgedruckt wird (alles in Hex):

INFO CLASSICLADDER-   Modbus I/O module received: Lgt=5 ->   (Slave address-1  Function code-83 ) 2 C0 F1

Bedeutung (Hex):

  • Slave-Nummer = 1 (0x1) = Slave-Adresse 1

  • Funktionscode = 131 (0x83) = Fehler beim Lesen des Holdingregisters

  • Fehlercode = 2 (0x2) = unzulässige Datenadresse angefordert

  • Prüfsumme = (0x8E36)

11.3. Datenantwort

Blick auf das Protokoll über die Antwort:

Tabelle 4. Datenantwort für Funktionscode 3 (Lesen Holdingregister)
Name Anzahl Bytes Wert (hex)

Funktionscode

1 Byte

3 (0x03)

Anzahl der Bytes

1 Byte

2 x N*

Wert des Registers

N* x 2 Bytes

Rückgabewert der angeforderten Adresse

Prüfsumme

(2 Bytes)

automatisch berechnet

*N = Number of registers

Hier ist ein Beispiel für einen empfangenen Befehl, wie er im Terminal ausgedruckt wird (alles in Hex):

INFO CLASSICLADDER-   Modbus I/O module received: Lgt=7 ->   (Slave address-1  Function code-3 2 0 0 B8 44)

Bedeutung (Hex):

  • Slave-Nummer = 1 (0x1) = Slave-Adresse 1

  • Angeforderter Funktionscode = 3 (0x3) = Lesen des Holdingregisters angefordert

  • Anzahl der Byte-Register = 2 (0x1) = Rückgabe von 2 Bytes (jeder Registerwert ist 2 Bytes breit)

  • Wert des Highbytes = 0 (0x0) = Highbyte-Wert der Adresse 8448 (0x2100)

  • Wert des Lowbyte = 0 (0x0) = Wert des Highbyte der Adresse 8448 (0x2100)

  • Prüfsumme = (0xB844)

(High- und Low-Bytes werden zu einem 16-Bit-Wert kombiniert und dann an die ClassicLadder-Variable übertragen). Leseregister können auf %W oder %QW (interner Speicher oder HAL-Out-Pins) abgebildet werden. Schreibregister können auf %W, %QW oder %IW (interner Speicher, HAL-Out-Pins oder HAL-In-Pins) abgebildet werden: Wenn mehrere Register in einem Lese-/Schreibvorgang angefordert werden, sind die Variablennummern nach der ersten fortlaufend.

11.4. MODBUS-Fehler

  • In Vergleichsblöcken wird die Funktion %W=ABS(%W1-%W2) akzeptiert, aber nicht korrekt berechnet. Nur %W0=ABS(%W1) ist derzeit zulässig.

  • Wenn Sie ein Kontaktplanprogramm laden, werden Modbus-Informationen geladen, aber ClassicLadder wird nicht angewiesen, Modbus zu initialisieren. Sie müssen Modbus initialisieren, wenn Sie die GUI zum ersten Mal laden, indem Sie --modmaster hinzufügen.

  • Wenn der Abschnittsmanager über der Abschnittsanzeige platziert wird, über die Bildlaufleiste hinweg, und auf Beenden geklickt wird, stürzt das Nicht-Echtzeit-Programm ab.

  • Wenn Sie --modmaster verwenden, müssen Sie gleichzeitig das Kontaktplanprogramm laden, sonst funktioniert nur TCP.

  • das Lesen/Schreiben mehrerer Register im Modbus weist Prüfsummenfehler auf.

12. Einrichten von ClassicLadder

In diesem Abschnitt werden die Schritte beschrieben, die erforderlich sind, um ClassicLadder zu einer vom StepConf Wizard generierten Konfiguration hinzuzufügen. Auf der Seite "Erweiterte Konfigurationsoptionen" des StepConf-Assistenten aktivieren Sie "Classic Ladder PLC einbeziehen".

Stepconf ClassicLadder
Abbildung 16. StepConf ClassicLadder

12.1. Hinzufügen der Module

Wenn Sie den StepConf-Assistenten zum Hinzufügen von ClassicLadder verwendet haben, können Sie diesen Schritt überspringen.

Um ClassicLadder manuell hinzuzufügen, müssen Sie zunächst die Module hinzufügen. Dazu fügen Sie der Datei custom.hal ein paar Zeilen hinzu.

Diese Zeile lädt das Echtzeitmodul:

loadrt classicladder_rt

Diese Zeile fügt dem Servo-Thread die Funktion ClassicLadder hinzu:

addf classicladder.0.refresh servo-thread

12.2. Hinzufügen der Kontaktplanlogik

Starten Sie nun Ihre Konfiguration und wählen Sie "Datei/Kontaktplan-Editor", um die GUI des klassischen Kontaktplans zu öffnen. Sie sollten ein leeres Fenster für die Abschnittsanzeige und den Abschnittsmanager sehen, wie oben gezeigt. Im Fenster Abschnittsanzeige öffnen Sie den Editor. Wählen Sie im Editor-Fenster "Ändern". Jetzt erscheint ein Fenster Eigenschaften und die Abschnittsanzeige zeigt ein Raster an. Das Gitter ist eine Sprosse des Leiters. Die Sprosse kann Verzweigungen enthalten. Eine einfache Sprosse hat einen Eingang, eine Verbindungslinie und einen Ausgang. Eine Sprosse kann bis zu sechs horizontale Zweige haben. Es ist zwar möglich, mehr als einen Stromkreis in einer Sprosse zu haben, aber die Ergebnisse sind nicht vorhersehbar.

Abschnitt Display mit Grid
Abbildung 17. Abschnitt Display mit Grid

Klicken Sie nun auf den N.O.-Eingang im Editorfenster.

Editor-Fenster
Abbildung 18. Editor-Fenster

Klicken Sie nun in das obere linke Raster, um den N.O.-Eingang in der Leiter zu platzieren.

Abschnitt Display mit Input
Abbildung 19. Abschnitt Display mit Input

Wiederholen Sie die obigen Schritte, um einen N.O.-Ausgang zum oberen rechten Gitter hinzuzufügen, und verwenden Sie die horizontale Verbindung, um die beiden zu verbinden. Es sollte wie folgt aussehen. Falls nicht, verwenden Sie den Radiergummi, um unerwünschte Abschnitte zu entfernen.

Abschnittsanzeige mit Sprosse
Abbildung 20. Abschnittsanzeige mit Sprosse

Klicken Sie nun im Editor-Fenster auf die Schaltfläche OK. Jetzt sollte Ihre Abschnittsanzeige wie folgt aussehen:

Abschnitt Anzeige Beendet
Abbildung 21. Abschnitt Anzeige Beendet

Um die neue Datei zu speichern, wählen Sie Speichern unter und geben Sie ihr einen Namen. Die Erweiterung .clp wird automatisch hinzugefügt. Als Speicherort sollte standardmäßig das laufende Konfigurationsverzeichnis angegeben werden.

Speichern unter Dialog
Abbildung 22. Speichern unter Dialog

Wenn Sie den StepConf-Assistenten zum Hinzufügen von ClassicLadder verwendet haben, können Sie auch diesen Schritt überspringen.

Um einen Leiter manuell hinzuzufügen, müssen Sie eine Zeile in Ihre custom.hal-Datei einfügen, die Ihre Leiterdatei lädt. Schließen Sie Ihre LinuxCNC-Sitzung und fügen Sie diese Zeile auf Ihre custom.hal Datei.

loadusr -w classicladder --nogui MyLadder.clp

Wenn Sie nun Ihre LinuxCNC-Konfiguration starten, wird auch Ihr Kontaktplanprogramm ausgeführt werden. Wenn Sie "Datei/Kontaktplan-Editor" wählen, wird das Programm, das Sie erstellt haben, im Fenster "Section Display" angezeigt.