ModbusTCP Client
Mit dem ModbusTCP Client (Modbus Master) kann der BX9000 eine Verbindung zu einem ModbusTCP-Server (Modbus Slave) aufnehmen. Es stehen 3 Bausteine zur Verfügung. Fb_MBConnect zum Aufbauen einer TCP/IP Verbindung, FB_MBGenericReq für das Versenden und Empfangen von beliebigen Modbus Funktionen und den FB_MBClose zum Schließen der TCP/IP Verbindung. Da es sich beim FB_MBGenericReq um einen allgemeinen Baustein handelt, müssen die entsprechenden Modbus Funktionen noch implementiert werden, dies erlaubt daher auch nicht Modbus konforme Protokolle zu versenden. Es sind maximal 3 Client Verbindungen gleichzeitig möglich. Durch die Möglichkeit eine TCP/IP Verbindung zu schließen und neu öffnen zu können, sind damit nahezu beliebig viele ModbusTCP-Server ansprechbar.
FB_MBConnect
Der FB_MBConnect verbindet den BX9000 über ModbusTCP mit einem anderen Teilnehmer. Es wird eine Verbindung aufgebaut mit steigender Flanke von bExecute. Die IP-Adresse wird über sIPAddr eingestellt. Die zu verwendete TCP-Portnummer über nTCPPort und ist normalerweise bei ModbusTCP auf 502 spezifiziert. Solange der Baustein aktiv ist, ist das bBusy gesetzt. Wurde die ModbusTCP Verbindung erfolgreich initialisiert, wird das bBusy auf FALSE gesetzt und das bError Flag ist FALSE. Sollte das bError Flag TRUE sein, ist der Verbindungsaufbau fehlgeschlagen und in der Variable nErrId ist der entsprechende Fehlercode enthalten. nHandlemuss mit den Bausteinen FB_MBGernericReq und FB_MBClose verbunden werden.

INPUT
VAR_INPUT
sIPAddr : STRING(15);
nTCPPort : UINT;
bExecute : BOOL;
tTimeout : TIME;
END_VAR
sIPAddr: IP-Adresse des ModbusTCP-Servers (Slave Gerät) mit dem eine Modbus Verbindung hergestellt werden soll.
nTCPPort: ModbusTCP Port Nummer, normalerweise ist diese bei ModbusTCP 502dez.
bExecute: Eine steigende Flanke aktiviert den Baustein.
tTimeout: Zeit nach der abgebrochen werden soll.
OUTPUT
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
iErrId : WORD;
nHandle : UINT;
END_VAR
bBusy: Dieser Ausgang bleibt solange auf TRUE, bis die Befehlsausführung abgeschlossen wurde.
bError: Dieser Ausgang wird auf TRUE geschaltet, wenn bei der Ausführung eines Befehls ein Fehler aufgetreten ist. Der befehlsspezifische Fehlercode ist in iErrorId enthalten.
iErrorId: Enthält den befehlsspezifischen Fehlercode des zuletzt ausgeführten Befehls (siehe Tabelle).
nHandle: Handle, der mit den Bausteinen FB_MBGernericReq und FB_MBClose verbunden werden muss.
FB_MBGENERICREQ
Der Baustein FB_MBGENERICREQ ermöglicht das Senden und Empfangen beliebiger ModbusTCP Funktionen. Mit steigender Flanke von bExecute wird der Baustein aktive, das bBusy wird gesetzt und er sendet seine Daten, die im pReqBuff (Pointer auf die Daten die verschickt werden sollen) enthalten sind. Die Länge der zu senden Daten entnimmt der Baustein der Variable cbReqLen. Die Variable nHandle muss mit der Variable aus dem Baustein Fb_MBConnect nHandle verbunden werden. Die Antwort des ModbusTCP-Servers (Slave) wird in dem pResBuff (Pointer auf die Empfangsdaten) abgelegt. Die Größe der Variable sollte groß genug gewählt werden, damit alle Daten eines ModbusTCP Telegramms empfangen werden. Empfängt der ModbusClient innerhalb der tTimeout Zeit keine Antwort, so wird das bBusy auf FALSE gesetzt und das bError gesetzt. In der Variable nErrId findet man den Fehlercode. In cbResponse ist die Anzahl der empfangenden Bytes enthalten. Diese können mit der Puffergröße der cdResLen verglichen werden. Ist cbResponse größer als dResLen gehen Daten verloren und Buffer muss größer gewählt werden.

INPUT
VAR_INPUT
nHandle : UINT;
pRecBuff : DWORD;
cbReqLen : WORD;
pResBuff : DWORD;
cbResLen : WORD;
bExecute : BOOL;
tTimeout : TIME;
END_VAR
nHandle: Handle, wird mit den Bausteinen Fb_MBConnect verbunden.
pReqBuff: Pointer auf die Daten, die versendet werden sollen.
cbReqLen: Länge der Daten die versendet werden sollen.
pResBuff: Pointer auf die Daten, die empfangen werden sollen. Die Variable muss groß genug angelegt werden.
cbResLen: Länge der Daten die empfangen werden sollen. Die Länge muss groß genug sein.
bExecute: Eine steigende Flanke aktiviert den Baustein.
tTimeout: Zeit nach der abgebrochen werden soll.
OUTPUT
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
iErrId : WORD;
cbResponse : WORD;
END_VAR
bBusy: Dieser Ausgang bleibt solange auf TRUE, bis die Befehlsausführung abgeschlossen wurde.
bError: Dieser Ausgang wird auf TRUE geschaltet, wenn bei der Ausführung eines Befehls ein Fehler aufgetreten ist. Der befehlsspezifische Fehlercode ist in iErrorId enthalten.
iErrorId: Enthält den befehlsspezifischen Fehlercode des zuletzt ausgeführten Befehls (siehe Tabelle).
cbResponse: Anzahl an Bytes die empfangen wurden.
FB_MBCLOSE
Der Baustein FB_MBCLOSE ermöglicht das Schließen einer TCP/IP Verbindung. Mit einer steigenden Flanke von bExecute wird der Baustein aktiviert. Solange der Baustein arbeitet ist das Bit bBusy gesetzt. nHandle muss mit dem Baustein Fb_MBConnect nHandle verbunden sein. Tritt ein Fehler auf wird bError auf TRUE gesetzt und in nErrId findet man den Fehlercode. Nach fehlerfreien Aufruf des Bausteins kann mit Fb_MBConnect ein neuer Socket geöffnet werden.

INPUT
VAR_INPUT
nHandle : UINT;
iFlags : UINT;
bExecute : BOOL;
tTimeout : TIME;
END_VAR
nHandle: Handle, wird mit den Bausteinen Fb_MBConnect verbunden.
iFlags: 0 - TCP/IP Verbindung wird geschlossen auch wenn die Gegenstelle nicht erreichbar ist, 1 - TCP/IP Verbindung wird mit "FIN" beendet, damit der Baustein ohne Fehler die TCP/IP Verbindung schließt muss dieser vorhanden sein und die Kommunikation funktionieren. Es empfiehlt sich die 0 zu nehmen da hier auf jedenfall unabhängig vom Zustand der Gegenstelle die TCP/IP Verbindung geschlossen wird.
bExecute: Eine steigende Flanke aktiviert den Baustein.
tTimeout: Zeit nach der abgebrochen werden soll.
OUTPUT
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
iErrId : WORD;
END_VAR
bBusy: Dieser Ausgang bleibt solange auf TRUE, bis die Befehlsausführung abgeschlossen wurde.
bError: Dieser Ausgang wird auf TRUE geschaltet, wenn bei der Ausführung eines Befehls ein Fehler aufgetreten ist. Der befehlsspezifische Fehlercode ist in iErrorId enthalten.
iErrorId: Enthält den befehlsspezifischen Fehlercode des zuletzt ausgeführten Befehls (siehe Tabelle).
Beispiel
Für das Beispiel brauchen Sie zwei BX9000 oder statt eines BX9000 einen BC9x00.
Download Erster BX9000 als ModbusTCP Client (Beispieldatei)
Download Zweiter BX9000 als ModbusTCP-Server (oder einen BC9x00) (Beispieldatei)
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v2.10.0 und höher | BX9000 (165) firmware version >=1.14 | TcBaseBX9000.lbx |
Error Codes
Fehlercode | Beschreibung |
---|---|
0xFB00 | keine gültige IP-Adresse |
0xFC00 | Response Länge größer als Speicher |
0xFD00 | Request konnte nicht abgesetzt werden |
0xFF00 | TimeOut während der Kommunikation |
Modbus Close
Fehlercode | Beschreibung |
---|---|
0xFA00 | Verbindung bereits geschlossen |
0xFF00 | TimeOut beim Schließen der Verbindung. Es wird RST verwendet und der Remote Teilnehmer ist nicht vorhanden. |
Modbus Client Connect
Fehlercode | Beschreibung |
---|---|
0xFA00 | Interne Verbindung wird verweigert |
0xFA01 | Connection Timeout Event |
0xFA02 | Connect wurde vom Remote nicht akzeptiert |
0xFA03 | ungültige IP Adresse |
0xFA04 | Alle Modbus Verbindungen belegt |
0xFA05 | kein interner Socket mehr vorhanden |
0xFA06 | interner Socket Fehler |
0xFA07 | Fehler beim Connect Aufruf |