FB_ModbusTcpRequest
Mit dem FB_ModbusTcpRequest-Funktionsbaustein kann ein MODBUS-Request an einen Remote-Partner gesendet werden. Die Verbindung muss dafür zuerst mit dem FB_ModbusTcpOpen-Funktionsbaustein geöffnet worden sein. Die bei dem Verbindungsaufbau zurückgelieferte, dynamische Portnummer, wird als Eingangsparameter an die iMyPortNo-Variable übergeben. Die nicht benutzten Verbindungen werden nach ca. 10 Sekunden automatisch geschlossen oder können auch von dem Remote-Partner geschlossen worden sein. Bei einer fehlenden Verbindung wird z.B. an dem iErrorId-Ausgang der Fehlercode 0x8305 zurückgegeben. Mit dem FB_ModbusTcpRequest-Funktionsbaustein wird der gesamte MODBUS-Frame beginnend mit den UNIT ID übertragen. Der TCP-Anteil wird von dem BC9xxx-Bus-Controller vorangestellt.
VAR_INPUT
VAR_INPUT
bStart : BOOL;
sRemoteIPAddr: STRING(15);
iMyPortNo : WORD;
pReqBuff : DWORD;
cbReqLen : WORD;
pResBuff : DWORD;
cbResLen : WORD;
END_VAR
bStart: Durch eine steigende Flanke an diesem Eingang wird der Funktionsbaustein aktiviert.
sRemoteIPAddr: Die Variable ist ein String mit der Netzwerkadresse (IP-Adresse) des Remote-Partners.
iMyPortNo: Hier wird die zur Verbindung zugehörige Portnummer als Parameter übergeben. Die Portnummer wird bei jedem Verbindungsaufbau mit dem FB_ModbusTcpOpen-Funktionsbaustein jedes Mal neu (dynamisch) erzeugt.
pReqBuff : Enthält die Adresse des Puffers mit den MODBUS-Request-Daten. Der Programmierer ist selbst dafür verantwortlich, den Puffer in der Größe so zu dimensionieren, dass cbReqLen- Bytes daraus entnommen werden können. Der Puffer kann eine Einzelvariable, ein Array oder eine Struktur sein, dessen Adresse man mit dem ADR - Operator ermitteln kann.
cbReqLen : Bytelänge der MODBUS-Request Daten im pReqBuff-Puffer.
pResBuff : Enthält die Adresse des Puffers für die MODBUS-Response-Daten. Der Programmierer ist selbst dafür verantwortlich den Puffer in der Größe so zu dimensionieren, dass er cbResLen- Bytes aufnehmen kann. Der Puffer kann eine Einzelvariable, ein Array oder eine Struktur sein, dessen Adresse man mit dem ADR - Operator ermitteln kann.
cbResLen : Bytelänge des MODBUS-Response Puffers. Der Programmierer ist selbst dafür verantwortlich den Puffer in der Größe so zu dimensionieren, dass alle Response-Daten aufgenommen werden können.
VAR_OUTPUT
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
iErrorId : WORD;
cbResponse : WORD;
END_VAR
bBusy: Bei der Aktivierung des Funktionsbausteins wird dieser Ausgang gesetzt und bleibt gesetzt, bis eine Rückmeldung erfolgt.
bError: Sollte ein Fehler bei der Ausführung des Befehls auftreten, dann wird dieser Ausgang gesetzt, nachdem der bBusy-Ausgang zurückgesetzt wurde.
iErrorId: Liefert bei einem gesetzten bError-Ausgang den Befehlsspezifischen Fehlercode (Tabelle) oder den gerätespezifischen Fehlercode.
cbResponse : Die Bytelänge der tatsächlich im Response-Puffer zurückgelieferten Response-Daten.
Fehlercodes | Beschreibung |
---|---|
0x8300 | Tx error. Timeout error. |
0x8301 | Tx error. Remote shutdown. |
0x8302 | Tx error. Internal error. |
0x8303 | Tx error. Resource error. |
0x8305 | Tx error. No remote connection. |
0x8100 | Rx error. Wrong transaction ID. |
0x8101 | Rx error. Wrong protocol ID. |
0x8102 | Rx error. Wrong length. |
0x8103 | Rx error. Exceeding length. |
0x8104 | Rx error. Wrong unit ID. |
Beispiel für den Aufruf des Bausteins in FUP:
PROGRAM MAIN
VAR
fbModbusRequest : FB_ModbusTcpRequest;
bExecute : BOOL;
bExecute : nConnectionPort;
SendBuffer : ARRAY[0..5] OF BYTE := 1,6,64,64,0,0;
ReceiveBuffer : ARRAY[0..255] OF BYTE;
bBusy : BOOL;
bError : BOOL;
nErrId : WORD;
cbReceived : WORD;
END_VAR
Im Beispiel wird bei einer steigenden Flanke am bExecute-Eingang ein Request zu dem Remote-Teilnehmer mit der Netzwerkadresse: '172.16.2.209' gesendet.
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v2.7.0 und abwärts | BC9xxx (165) firmware version >= 0xB6 | TcModbusTCPBC.Lb6 |