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.

Funktionsbaustein FB_MBCONNECT

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.

Funktionsbaustein FB_MBGENERICREQ

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.

Funktionsbaustein FB_MBCLOSE

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.

ModbusTCP Client 1: Download Erster BX9000 als ModbusTCP Client (Beispieldatei)
ModbusTCP Client 2: 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

bx9000 modbustcp client.prx
bx9000 modbustcp server.prx

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