S7-SoftSPS:TwinCAT I/O Konfiguration
Der vorliegende Treiber ermöglicht es E/A Daten über den Beckhoff Treiber TwinCAT IO mit der IBH softec S7-SoftSPS auszutauschen. Über den TwinCAT IO Treiber lassen sich alle E/A Baugruppen der Firma Beckhoff ansprechen, so dass dieser Treiber unabhängig vom verwendeten Bussystem ist. Um mit der S7-SoftSPS die Beckhoff Peripheriebaugruppen ansprechen zu können, muss der TwinCAT IO Treiber von Beckhoff auf dem Rechner installiert und lizenziert sein.
Die IO-Tasks, die mit der S7-SoftSPS verwendet werden sollen, müssen mit dem Beckhoff TwinCAT System Manager konfiguriert werden. Die TwinCatIO.dll kann den E/A-Bereich des PAE/PAA zyklisch auf E/A-Baugruppen lesen/schreiben. Azyklischer Zugriff mittels der Peripheriebefehle ist ebenso möglich wie auch der azyklische Zugriff mit einem SFC/FC.
Um die gewünschten Funktionen in der S7-SoftSPS zu aktivieren sind folgende Schritte erforderlich:
- Einfügen einer Station im TwinCAT System Manager
- Anlegen eines Tasks im TwinCAT System Manager
- Aufrufen der Ads-Funktionen aus dem SPS-Programm
Einfügen einer Station im TwinCAT System Manager
[[Image:../images/TwinCAT%20d1.png|frame|none]]
Mittels eines Rechtsklicks auf "E/A Geräte" >> "Geräte Suchen..." erscheint ein Dialog mit dem sich eine E/A Baugruppe auswählen lässt (sofern im Netz vorhanden).
[[Image:../images/TwinCAT%20d2.png|frame|none]]
Nachdem man das gewünschte Gerät ausgewählt hat, fragt der TwinCAT System Manager nach, ob nach neuen Boxen gesucht werden soll.
[[Image:../images/TwinCAT%20d3.png|frame|none]]
Dieser Frage stimmt man zu, um die vorhandene Peripherie aus der E/A-Baugruppe zu lesen. Die E/A Baugruppe ist nun für den TwinCAT IO Treiber bekannt und kann von diesem angesprochen werden.
Anlegen eines Tasks im TwinCAT System Manager
[[Image:../images/TwinCAT%20d4.png|frame|none]]
Mit einem Rechtsklicks auf "Zusätzliche Tasks" >> "Task Anfügen..." erstellt man einen neuen Task, mit dem die TwinCatIO.dll der S7-SoftSPS Daten austauscht.
Wichtige Eigenschaften des Tasks
Port: Der Port Nummer 301 dient normalerweise als Prozessabbild für die S7-SoftSPS. Dieser ist auch über einen SFC/FC ansprechbar.
AutoStart: Die S7-SoftSPS kümmert sich selbstständig um das Triggern des Feldbusses und meldet so dem TwinCAT-Treiber, dass sie noch funktionsbereit ist, so dass die Option AutoStart normalerweise nicht gewählt werden sollte. Wenn diese Option gewählt wird, muss der TwinCAT IO-Treiber so konfiguriert werden, dass er selbstständig feststellen kann, ob die SPS noch arbeitet, um gegebenenfalls die Ausgänge der E/A-Baugruppe in einen definierten Zustand zu schalten.
Konfigurieren des Tasks
Um die E/A-Baugruppen ansprechen zu können, müssen die E/A-Punkte mit dem Task verknüpft werden. Mittels eines Rechtsklicks auf "Eingänge" oder "Ausgänge" >> "Variable Einfügen..." können die E/A-Punkte dem Task zugeordnet werden.
[[Image:../images/TwinCAT%20d5.png|frame|none]]
Je nach vorhandener E/A-Punkt muss der passende Variablentyp ausgewählt werden.
[[Image:../images/TwinCAT%20d6.png|frame|none]]
Ist die Variable deklariert, muss diese mit der E/A-Baugruppe verknüpft werden. Hierzu betätigt man den Button "Verknüpft m." um die Zuordnung zu treffen.
[[Image:../images/TwinCAT%20d7.png]] [[Image:../images/TwinCAT%20d8.png]]
Ist nun die gewünschte Anzahl an Variablen mit dem Task verknüpft, muss die Konfiguration aktiviert werden. Danach ist der TwinCAT IO-Task einsatzbereit, sobald in den Run-Modus gewechselt wurde.
Aufrufen von Sonderfunktionen und ADS-Funktionen aus dem SPS-Programm
SFC 14
Mittels des Bausteins DPRD_DAT können Daten aus dem TwinCAT I/O Task gelesen werden
CALL | SFC/FC 14 | |
LADDR | := W#16#100 | //INPUT WORD |
RET_VAL | := MW 0 | //RESULT INT |
RECORD | := P#M 100.0 BYTE 1 | //OUTPUT ANY |
Parameter | Datentyp | Bedeutung |
---|---|---|
LADDR | WORD | Startadresse der zu lesenden Daten |
RET_VAL | INT | 0 bei Erfolg |
RECORD | ANY | ANY-Pointer auf gelesenen Daten |
SFC 15
Mittels des Bausteins DPWR_DAT können Daten in den TwinCAT I/O Task geschrieben werden
CALL | SFC/FC 15 | |
LADDR | := W#16#100 | //INPUT WORD |
RECORD | := P#M 102.0 BYTE 1 | //INPUT ANY |
RET_VAL | := MW 0 | //RESULT INT |
Parameter | Datentyp | Bedeutung |
---|---|---|
LADDR | WORD | Startadresse der zu schreibenden Daten |
RECORD | ANY | ANY-Pointer auf zu schreibende Daten |
RET_VAL | INT | 0 bei Erfolg |
ControlSFC
Mittels des Bausteins CONTROL kann auf jeden beliebigen TwinCAT I/O Task zugegriffen werden
CALL | SFC/FC 1000 | |
IN0 | := FALSE | //INPUT BOOL |
IN1 | := 301 | //INPUT INT |
IN2 | := P#M 104.0 BYTE 1 | //RESULT ANY |
RET_VAL | := MW 0 | //RESULT INT |
Parameter | Datentyp | Bedeutung |
---|---|---|
IN0 | BOOL | false = Daten aus beliebigem TwinCAT I/O Task lesen
true = Daten in beliebigen TwinCAT I/O Task schreiben |
IN1 | INT | Portnummer des TwinCAT I/O Tasks, auf dessen E/A Bereich zugegriffen werden soll |
IN2 | ANY | ANY-Pointer auf zu lesende/schreibende Daten mit passender Länge (es sind nur ANY-Pointer vom Typ Byte zulässig) |
RET_VAL | INT | 0 bei Erfolg, ansonsten werden die Rückgabewerte des TwinCAT I/O Treibers direkt durchgereicht
0x0057= ERROR_INVALID_PARAMETER - einer der übergebenen Parameter ist falsch |
GetDeviceIdentification
Der Funktionsbaustein GETDEVID erlaubt es die Geräteidentifikationsdaten auszulesen
CALL | SFC/FC 1001, DB 1001 | |
EXEC | := M0.0 | //INPUT BOOL |
TMOUT | := TIME#0D_0H_0M_1S_0MS | //INPUT TIME |
BUSY | := M0.1 | //OUTPUT BOOL |
ERR | := M0.21 | //OUTPUT BOOL |
ERRID | := MD 4 | //OUTPUT DWORD |
DEVID | := P#M 10.0 BYTE 214 | //IN_OUT ANY |
Parameter | Datentyp | Bedeutung |
---|---|---|
IN0 | BOOL | TRUE startet das Kommando |
IN1 | TIME | Nicht benutzt, da die darunterliegende ADS Funktion den Timeout liefert |
OUT2 | BOOL | Die Daten werden aus dem CX ausgelesen. Nach fehlerfreier Ausführung stehen bei bBusy = FALSE die Daten in der Struktur stDevIdent |
OUT3 | BOOL | Wird TRUE, sobald ein Fehler eintritt |
OUT4 | DWORD | Liefert bei einem gesetzten bError-Ausgang die Fehlernummer |
IO5 | ANY | ST_CxDeviceIdentification (Länge 214 Byte) |
AdsRead
Der Funktionsbaustein ADSREAD erlaubt die Ausführung eines ADS-Lesebefehls, um Daten von einem ADS-Gerät anzufordern.
CALL | SFC/FC 1002, DB 1002 | |
NETID | := #stringvar | //INPUT STRING |
PORT | := W#16#0 | //INPUT WORD |
IDXGRP | := DW#16#0 | //INPUT DWORD |
IDXOFFS | := DW#16#0 | //INPUT DWORD |
LEN | := DW#16#0 | //INPUT DWORD |
DESTADDR | := P#M 10 BYTE 1 | //INPUT ANY |
READ | := M0.0 | //INPUT BOOL |
TMOUT | := TIME#0D_0H_0M_1S_0MS | //INPUT TIME |
BUSY | := M0.1 | //OUTPUT BOOL |
ERR | := M0.2 | //OUTPUT BOOL |
ERRID | := MD 4 | //OUTPUT DWORD |
Parameter | Datentyp | Bedeutung |
---|---|---|
NETID | STRING | Ist ein String, der die AMS-Netzwerkkennung des Zielgerätes enthält, an das der ADS-Befehl gerichtet wird. |
PORT | WORD | Enthält die Portnummer des ADS-Gerätes. |
IDXGRP | DWORD | Enthält die Index-Gruppennummer ( 32bit, unsigned ) des angeforderten ADS-Dienstes. Dieser Wert ist der ADS-Tabelle des angesprochenen Gerätes zu entnehmen. |
IDXOFFS | DWORD | Enthält die Index-Offsetummer ( 32bit, unsigned ) des angeforderten ADS-Dienstes. Dieser Wert ist der ADS-Tabelle des angesprochenen Gerätes zu entnehmen. |
LEN | DWORD | Enthält die Anzahl der zu lesenden Daten in Bytes. |
DESTADDR | ANY | Pointer auf Puffer, der die gelesenen Daten aufnehmen soll. Der Puffer muss groß genug sein um "LEN" Bytes aufzunehmen. Der Puffer kann eine Einzelvariable, ein Array oder eine Struktur sein. |
READ | BOOL | TRUE an diesem Eingang löst den ADS-Befehl aus. |
TMOUT | TIME | Gibt die Zeit bis zum Abbrechen der Funktion an. |
BUSY | BOOL | Dieser Ausgang bleibt solange auf TRUE, bis der Baustein eine Befehlsanforderung ausführt, längstens aber für die Dauer der an dem 'Timeout'-Eingang angelegten Zeit. Während Busy = TRUE wird an den Eingängen kein neuer Befehl angenommen. Bitte beachten Sie, dass nicht die Ausführung des Dienstes, sondern nur dessen Annahme zeitlich überwacht wird. |
ERR | BOOL | Dieser Ausgang wird auf TRUE geschaltet, wenn bei der Ausführung eines Befehls ein Fehler aufgetreten ist. Der befehlsspezifische Fehlercode ist in 'ErrorId' enthalten. Wenn der Baustein einen Timeout-Fehler hat, so ist 'Error' = TRUE und 'ErrorId' = 1861 (Hexadezimal 0x745). Wird durch das Ausführen eines Befehls an den Eingängen auf FALSE zurückgesetzt. |
ERRID | DWORD | Enthält den befehlsspezifischen Fehlercode des zuletzt ausgeführten Befehls. Wird durch das Ausführen eines Befehls an den Eingängen auf 0 zurückgesetzt. |
AdsWrite
Der Baustein erlaubt die Ausführung eines ADS-Schreibbefehls, um Daten zu einem ADS-Gerät zu übermitteln.
CALL | SFC/FC 1003, DB 1003 | |
NETID | := #stringvar | //INPUT STRING |
PORT | := W#16#0 | //INPUT WORD |
IDXGRP | := DW#16#0 | //INPUT DWORD |
IDXOFFS | := DW#16#0 | //INPUT DWORD |
LEN | := DW#16#0 | //INPUT DWORD |
SRCADDR | := P#M 10.0 BYTE 1 | //INPUT ANY |
WRITE | := M0.0 | //INPUT BOOL |
TMOUT | := TIME#0D_0H_0M_1S_0MS | //INPUT TIME |
BUSY | := M0.1 | //OUTPUT BOOL |
ERR | := M0.2 | //OUTPUT BOOL |
ERRID | := MD 4 | //OUTPUT DWORD |
Parameter | Datentyp | Bedeutung |
---|---|---|
NETID | STRING | Ist ein String, der die AMS-Netzwerkkennung des Zielgerätes enthält, an das der ADS-Befehl gerichtet wird. |
PORT | WORD | Enthält die Portnummer des ADS-Gerätes, an das der Befehl gerichtet ist. |
IDXGRP | DWORD | Enthält die Index-Gruppennummer ( 32bit, unsigned ) des angeforderten ADS-Dienstes. Dieser Wert ist der ADS-Tabelle des angesprochenen Gerätes zu entnehmen. |
IDXOFFS | DWORD | Enthält die Index-Offsetnummer ( 32bit, unsigned ) des angeforderten ADS-Dienstes. Dieser Wert ist der ADS-Tabelle des angesprochenen Gerätes zu entnehmen. |
LEN | DWORD | Enthält die Anzahl der zu lesenden Daten in Bytes. |
SRCADDR | ANY | Pointer auf Puffer, der die zu schreibenden Daten enthält. Der Puffer muss mindestens "LEN" Bytes Daten enthalten. Der Puffer kann eine Einzelvariable, ein Array oder eine Struktur sein. |
WRITE | BOOL | TRUE an diesem Eingang löst den ADS-Befehl aus. |
TMOUT | TIME | Gibt die Zeit bis zum Abbrechen der Funktion an. |
BUSY | BOOL | Bei der Aktivierung des Funktionsbausteins wird dieser Ausgang gesetzt und bleibt gesetzt, bis eine Rückmeldung erfolgt. |
ERR | BOOL | Sollte ein ADS-Fehler bei der Übertragung des Kommandos erfolgen, wird dieser Ausgang gesetzt, nachdem der BUSY-Ausgang zurückgesetzt wurde. |
ERRID | DWORD | Liefert bei einem gesetzten ERR-Ausgang die ADS- oder die gerätespezifische Fehlernummer. |