S7-SoftSPS:TwinCAT I/O Konfiguration: Unterschied zwischen den Versionen
Joscha (Diskussion | Beiträge) |
Joscha (Diskussion | Beiträge) |
||
Zeile 80: | Zeile 80: | ||
| RECORD || ANY || ANY-Pointer auf gelesenen Daten | | RECORD || ANY || ANY-Pointer auf gelesenen Daten | ||
|} | |} | ||
+ | |||
Zeile 108: | Zeile 109: | ||
| RET_VAL || INT || 0 bei Erfolg | | RET_VAL || INT || 0 bei Erfolg | ||
|} | |} | ||
+ | |||
+ | |||
'''ControlSFC''' | '''ControlSFC''' | ||
Zeile 142: | Zeile 145: | ||
0x0057= ERROR_INVALID_PARAMETER - einer der übergebenen Parameter ist falsch | 0x0057= ERROR_INVALID_PARAMETER - einer der übergebenen Parameter ist falsch | ||
|} | |} | ||
+ | |||
+ | |||
'''GetDeviceIdentification''' | '''GetDeviceIdentification''' | ||
Zeile 149: | Zeile 154: | ||
{| | {| | ||
|- | |- | ||
− | | CALL || SFC/FC 1001 | + | | CALL || SFC/FC 1001, DB 1001 |
|- | |- | ||
|style="width:8em"| EXEC ||style="width:12em"| := M0.0 || //INPUT BOOL | |style="width:8em"| EXEC ||style="width:12em"| := M0.0 || //INPUT BOOL | ||
Zeile 182: | Zeile 187: | ||
|} | |} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | '''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 | ||
+ | |- | ||
+ | |style="width:8em"| NETID ||style="width:12em"| := #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 | ||
+ | |} | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Parameter !! Datentyp !! Bedeutung | ||
+ | |- | ||
+ | |style="width:9em"| NETID ||style="width:9em"| 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'''<br /> | '''AdsWrite'''<br /> |
Version vom 29. November 2012, 09:47 Uhr
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 | SFB/FB 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. |