Hinweise zur Dokumentation

Diese Beschreibung wendet sich ausschließlich an ausgebildetes Fachpersonal der Steuerungs- und Automatisierungstechnik, das mit den geltenden nationalen Normen vertraut ist.
Zur Installation und Inbetriebnahme der Komponenten ist die Beachtung der Dokumentation und der nachfolgenden Hinweise und Erklärungen unbedingt notwendig.
Das Fachpersonal ist verpflichtet, für jede Installation und Inbetriebnahme die zu dem Zeitpunkt veröffentlichte Dokumentation zu verwenden.

Das Fachpersonal hat sicherzustellen, dass die Anwendung bzw. der Einsatz der beschriebenen Produkte alle Sicherheitsanforderungen, einschließlich sämtlicher anwendbaren Gesetze, Vorschriften, Bestimmungen und Normen erfüllt.

Disclaimer

Diese Dokumentation wurde sorgfältig erstellt. Die beschriebenen Produkte werden jedoch ständig weiter entwickelt.
Wir behalten uns das Recht vor, die Dokumentation jederzeit und ohne Ankündigung zu überarbeiten und zu ändern.
Aus den Angaben, Abbildungen und Beschreibungen in dieser Dokumentation können keine Ansprüche auf Änderung bereits gelieferter Produkte geltend gemacht werden.

Marken

Beckhoff®, TwinCAT®, EtherCAT®, EtherCAT G®, EtherCAT G10®, EtherCAT P®, Safety over EtherCAT®, TwinSAFE®, XFC®, XTS® und XPlanar® sind eingetragene und lizenzierte Marken der Beckhoff Automation GmbH.
Die Verwendung anderer in dieser Dokumentation enthaltenen Marken oder Kennzeichen durch Dritte kann zu einer Verletzung von Rechten der Inhaber der entsprechenden Bezeichnungen führen.

Patente

Die EtherCAT Technologie ist patentrechtlich geschützt, insbesondere durch folgende Anmeldungen und Patente:
EP1590927, EP1789857, EP1456722, EP2137893, DE102015105702
mit den entsprechenden Anmeldungen und Eintragungen in verschiedenen anderen Ländern.

EtherCAT® ist eine eingetragene Marke und patentierte Technologie lizenziert durch die Beckhoff Automation GmbH, Deutschland.

Copyright

© Beckhoff Automation GmbH & Co. KG, Deutschland.
Weitergabe sowie Vervielfältigung dieses Dokuments, Verwertung und Mitteilung seines Inhalts sind verboten, soweit nicht ausdrücklich gestattet.
Zuwiderhandlungen verpflichten zu Schadenersatz. Alle Rechte für den Fall der Patent-, Gebrauchsmuster- oder Geschmacksmustereintragung vorbehalten.


Übersicht

Die Bibliothek beinhaltet Funktionsbausteine die einen Datenaustausch zwischen dem BC9xxx-Bus-Controller und einem Remote-Partner auf dem MODBUS/TCP Port ermöglichen.

Bemerkungen

  • Um den Resourcenverbrauch zu minimieren, wurde die maximale Anzahl der gleichzeitig geöffneten Verbindungen auf 4 begrenzt. Um eine weitere Verbindung öffnen zu können muss eine der nicht benötigten Verbindungen zuerst geschlossen werden.
  • Nach ca. 10 Sekunden wird eine in dieser Zeit nicht benutze Verbindung automatisch geschlossen und muss neu geöffnet werden.

Funktionsbausteine

Name | Beschreibung
FB_ModbusTcpOpen | Eine MODBUS/TCP-Verbindung zu einem Remote-Partner öffnen.
FB_ModbusTcpClose | Eine MODBUS/TCP-Verbindung zu einem Remote-Partner schließen.
FB_ModbusTcpRequest | Ein MODBUS-Request zu einem Remote-Partner senden.


FB_ModbusTcpOpen

TwinCAT PLC Library: MODBUS TCP BC

FUNCTION_BLOCK FB_ModbusTcpOpen

Der Funktionsbaustein öffnet eine TCP/IP-Verbindung zu einem Remote-Partner auf dem MODBUS/TCP-Port. Um den Resourcenverbrauch minimal zu halten wurde die maximale Anzahl der geöffneten Verbindungen auf 4 begrenzt. Um eine weitere Verbindung öffnen zu können, kann eine zur Zeit nicht benötigte Verbindung mit dem Funktionsbaustein FB_ModbusTcpClose zuerst geschlossen werden. Der FB_ModbusTcpOpen-Funktionsbaustein liefert beim Erfolg in der iMyPortNo-Ausgangsvariable eine Portnummer. Diese Portnummer wird dazu benötigt, um mit dem FB_ModbusTcpRequest- oder FB_ModbusTcpClose-Funktionsbaustein einen MODBUS-Request zu senden, bzw. die Verbindung zu schließen. Mit dem Eingangsparameter tTimeout wird beim Öffnen der Verbindung auch die Timeout-Zeit für den MODBUS-Request und den Verbindungsabbau festgelegt. Nach ca. 10 Sekunden wird eine geöffnete und in dieser Zeit nicht benutzte Verbindung automatisch geschlossen und muss neu geöffnet werden.

VAR_INPUT

VAR_INPUT
    bStart		: BOOL;
    sRemoteIPAddr	: STRING(15);
    tTimeOut		: TIME;
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.

tTimeOut: Gibt die Zeit an, die bei der Ausführung des Befehls nicht überschritten werden darf.

VAR_OUTPUT

VAR_OUTPUT
    bBusy		: BOOL;
    bError		: BOOL;
    iErrorId		: WORD;
    iMyPortNo		: 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.

iMyPortNo : Beim Erfolg wird an diesem Ausgang die eigene zur Verbindung zugehörige Portnummer zurückgeliefert. Bei der Portnummer handelt es sich um eine dynamische Portnummer, die bei einem Verbindungsaufbau jedesmal neu erzeugt wird.

Fehlercodes | Beschreibung
0x8500 | Resource error
0x8501 | No socket available
0x8502 | Open connection error

Beispiel für den Aufruf des Bausteins in FUP:

PROGRAM MAIN
VAR
    fbModbusOpen	: FB_ModbusTcpOpen;
    bOpen		: BOOL;
    bBusy		: BOOL;
    bError		: BOOL;
    nErrId		: WORD;
    nConnectionPort	: WORD;
END_VAR

Im Beispiel wird bei einer steigender Flanke am bOpen-Eingang die TCP/IP-Verbindung zu dem Remote-Teilnehmer mit der Netzwerkadresse: '172.16.2.209' aufgebaut.

Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken
TwinCAT v2.7.0 und abwärts | BC9xxx (165) firmware version >= 0xB6 | TcModbusTCPBC.Lb6


FB_ModbusTcpClose

FUNCTION_BLOCK FB_ModbusTcpClose

Mit dem FB_ModbusTcpClose-Funktionsbaustein wird eine mit dem FB_ModbusTcpOpen-Funktionsbaustein geöffnete Verbindung zu einem Remote-Partner geschlossen. Um den Resourcenverbrauch minimal zu halten wurde die maximale Anzahl der geöffneten Verbindungen auf 4 begrenzt. Um eine weitere Verbindung öffnen zu können, muss eine zur Zeit nicht benötigte Verbindung zuerst geschlossen werden. Nach ca. 10 Sekunden wird eine Verbindung automatisch geschlossen, wenn sie in dieser Zeit nicht genutzt wurde. Beim Schließen der Verbindung wird nicht auf eine Bestätigung von dem Remote-Partner gewartet. D.h. es kann unter Umständen vorkommen (z.B. bei einer unterbrochenen Netzwerkkommunikation), dass eine Verbindung weiterhin besteht. Solche offene Verbindungen sollten dann von dem Remote-Partner automatisch geschlossen werden. Ein Bus-Controller als Remote-Partner schließt solche offenen Verbindungen automatisch.

VAR_INPUT

VAR_INPUT
    bStart		: BOOL;
    sRemoteIPAddr	: STRING(15);
    iMyPortNo		: 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 dessen Verbindung geschlossen werden soll.

iMyPortNo: Hier wird die zur Verbindung zugehörige Portnummer als Parameter übergeben. Die Portnummer wird bei jedem Verbindungsaufbau mit dem FB_MobusTcpOpen-Funktionsbaustein jedesmal neu (dynamisch) erzeugt.

VAR_OUTPUT

VAR_OUTPUT
    bBusy		: BOOL;
    bError		: BOOL;
    iErrorId		: 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.

Fehlercodes | Beschreibung
0x8400 | Connection is already closed.
0x8401 | Connection close timeout.
0x8402 | Connection close resource error.

Beispiel für den Aufruf des Bausteins in FUP:

PROGRAM MAIN
VAR
    fbModbusClose	: FB_ModbusTcpClose;
    bOpen		: BOOL;
    bBusy		: BOOL;
    bError		: BOOL;
    nErrId		: WORD;
    nConnectionPort	: WORD;
END_VAR

Im Beispiel wird bei einer steigender Flanke am bClose-Eingang die TCP/IP-Verbindung zu dem Remote-Teilnehmer mit der Netzwerkadresse: '172.16.2.209' geschlossen.

Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken
TwinCAT v2.7.0 und abwärts | BC9xxx (165) firmware version >= 0xB6 | TcModbusTCPBC.Lb6


FB_ModbusTcpRequest

FUNCTION_BLOCK 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 jedesmal 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 steigender Flanke am bExecute-Eingang ein Request zu dem Remote-Teilnehmer mit der Netzwerkadresse: '172.16.2.209' gesendet.

Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken
TwinCAT v2.7.0 und abwärts | BC9xxx (165) firmware version >= 0xB6 | TcModbusTCPBC.Lb6


Device specific error codes

BC9xxx return codes

Wert (hex) | Beschreibung
0x8800 | No valid network configuration.
0x8E00 | Connection closed by target.
0x8F00 | Resource error.

Wert (hex) | Beschreibung Receive Error
0x8100 | Receive wrong transaction ID
0x8101 | Receive wrong protocol ID
0x8102 | Receive wrong lenght
0x8103 | Receive exceeding lenght
0x8104 | Receive wrong unit ID

Wert (hex) | Beschreibung Transmit Error
0x8300 | Transmit timeout
0x8301 | Transmit Shutdown
0x8302 | Transmit internal error
0x8303 | Transmit resource error
0x8305 | Transmit remote not connected

Wert (hex) | Beschreibung Close Error
0x8400 | Receive wrong transaction ID
0x8401 | Receive wrong protocol ID
0x8402 | Receive wrong lenght

Wert (hex) | Beschreibung Open Error
0x8500 | Open ressoucre error
0x8501 | Open ressoucre error_1
0x8502 | Open connect error
0x8503 | Open connection already open