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
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).
Nachdem man das gewünschte Gerät ausgewählt hat, fragt der TwinCAT System Manager nach, ob nach neuen Boxen gesucht werden soll.
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
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.
Je nach vorhandener E/A-Punkt muss der passende Variablentyp ausgewählt werden.
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%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. |