Modbus/TCP-Treiber - Details
Dieses Kapitel ist für fortgeschrittene WinCC OA Anwender, die weitere Details über Funktionscodes, Config-Einträge oder Debugmöglichkeiten erfahren möchten.
Funktionscodes
Die folgende Tabelle enthält die möglichen Funktionscodes, sowie eine kurze Beschreibung. Im Slave Mode des WinCC OA Treibers hängt der verwendete Funktionscode von der SPS ab.
Funktionscode | Code | Beschreibung |
---|---|---|
read coils | 1 | Liest den ON/OFF Status eines diskreten Ausgangs |
read input discretes | 2 | Liest den ON/OFF Status eines diskreten Eingangs |
read multiple registers | 3 | Liest den binären Inhalt der Holding Register |
read input registers | 4 | Liest den binären Inhalt der Eingangs-Register |
write coil | 5 | Setzt einen einzelnen Coil (Ausgang) entweder ON oder OFF |
write single register | 6 | Schreibt einen Wert in einen Register |
read exception status | 7 | Liest den Status von 8 Ausgängen mit Ausnahmestatus |
force multiple coils | 15 | Setzt jeden Coil (Ausgang) einer Reihe von Coils entweder auf ON oder OFF |
write multiple registers | 16 | Schreibt Werte in mehrere Holding Register |
atomic read/write | 23 | Erlaubt das Ausführen von atomaren Schreib-/Leseoperationen. |
read FIFO queue | 24 | Liest den Inhalt einer FIFO Reihe von Registern |
- FC23
-
Der Modbus-Funktionscode 23 (0x17) bietet die Möglichkeit, eine atomare Schreib-/Leseoperation auszuführen. In der Modbus-Spezifikation ist definiert, dass der Schreibvorgang vor dem Lesevorgang im Gerät ausgeführt werden muss.
Dies ermöglicht die Implementierung eines Befehls mit zurückgegebenen Daten im Gerät, da die Operation auf atomare Weise erfolgt.
Wird der Funktionscode mit einer Adresse angegeben, (Das ist der Regelfall wie alle anderen Adressen aussehen.) führt das Schreiben auf diese Adresse auch ein Lesen derselben Adresse aus. Der entsprechende Eingangswert kann auf dieselbe DPE (I/O)-Adresse oder auf einem anderen DPE mit derselben Adresse im Empfangsmodus "Spontan" empfangen werden.
Es ist auch möglich, eine andere Leseadresse anzugeben, indem ein optionaler Adressteil
/<Adresse lesen>[:<Länge>]
zum Adress-Referenz hinzugefügt wird, z.B. die AdresseM.1.23.5/15
schreibt Adresse 5 und liest Adresse 15.Anmerkung: Der gelesene Wert kann nur auf einer separaten Eingangsadresse empfangen werden, die die Leseadresse des Telegramms angibt. Für das obige Beispiel wäre dies die AdresseM.1.23.15
.Um ein weiteres Beispiel zu geben, wo der Benutzer einen Blob von 10 Bytes ab Adresse 20 schreiben und einen Blob von 30 Bytes von Adresse 100 lesen möchte, muss die Ausgangsadresse
M.<SPS-Nummer>.23.20:10/100:30
und eine Eingangsadresse im spontanen ModusM.<SPS-Nummer>.23.100:30
konfigurieren werden.
Debug-Levels
Um mögliche Fehlerquellen während der Treiberaktionen aufzuspüren, gibt es auch für den Modbus/TCP Treiber die Möglichkeit Kommandozeilenoptionen zum Debuggen zu verwenden. Informationen über alle weiteren Optionen können mit -helpdbg abgefragt werden (siehe auch Manageroptionen).
Debug-Level | Beschreibung |
---|---|
-dbg 2 | Diese Option informiert detailliert, was der Treiber gerade macht. Es wird empfohlen, nur bei geringer Treiberlast diese Option zu setzen, um das Zeitverhalten des Treibers nicht zu beeinflussen. |
-dbg 25 | Wen der Verdacht besteht, dass eine Pollingabfrage die Nachricht verloren hat, kann diese Option verwendet werden. Damit werden die zugehörigen Fehlermeldungen aktiviert und im Log Viewer angezeigt. Normalerweise sind diese Fehlermeldungen deaktiviert, da sie für eine Pollingabfrage nicht kritisch sind. Zusätzlich zu den verlorenen Pollingaufträgen kann dieser Debug-Level dazu verwendet werden, Warnungen anzuzeigen wenn Daten eintreffen, die zu keiner parametrierten Adresse gehören. Die Warnungen werden deshalb mittels Debug-Level gefiltert, da ansonsten das Logging mit Logging-Meldungen überfüllt wird, die in den meisten Fällen für den Benutzer nicht erforderlich sind. |
-dbg 26 | Mit dieser Option kann angezeigt werden wieviele Frames in der Modbus Queue sind. |
-dbg 27 | Mit dieser Option werden die Transaction Ids der laufenden Modbus Frames angezeigt. Diese Option kann verwendet werden um zu prüfen wieviele Requests noch nicht bestätigt wurden. |
-dbg 9 | Um Information über die Treiber Zykluszeit zu erhalten, kann diese Option verwendet werden. |
-dbg 10 | Mit diesem Debug-Level wird der Zeitstempel von UNICOS Event Frames im Log Viewer angezeigt, um Fehler im Bezug auf Zeitstempel bei der Generierung von UNICOS Event Frames zu finden. |
-report ALL | Aktiviert man dieses Debug-Level zur Laufzeit, so werden die Pollgruppen und Pollblöcke ausgegeben. |
Transformationen
Eine Transformation konvertiert Hardware-Daten in ein WinCC OA Format. Folgende Tabelle gibt über die Transformationen und die Kompatibilität mit den Funktionscodes Auskunft. Der Treiber prüft, ob ein Datentyp und ein Code kompatibel sind und gibt andernfalls eine Fehlermeldung aus.
Benötigter Datentyp | Trafo | Subindex (Array) Support | Itemgröße [byte] | Elemente in Item | WinCC OA Elementtyp |
FC für Write Request |
FC für Read Request |
---|---|---|---|---|---|---|---|
bit | boolean | ✔ | 1 | 8 | bool | 15 | 1, 2 |
bit | boolean | ✔ | 2 | 16 | bool | 6, 16 | 3, 4, 7, 24 |
bit | boolean as byte | ❌ | 1 | 1 | bool | 5 | none |
byte | byte | ✔ | 2 | 2 | char | 6, 16 | 3, 4, 7, 24 |
word | int 16 | ✔ | 2 | 1 | int | 6, 16 | 3, 4, 24 |
unsigned word | uint 16 | ✔ | 2 | 1 | unsigned | 6, 16 | 3, 4, 24 |
dword | int 32 | ✔ | 4 | 1 | int | 16 | 3, 4, 24 |
unsigned dword | uint 32 | ✔ | 4 | 1 | unsigned | 16 | 3, 4, 24 |
qword | int 64 | ✔ | 8 | 1 | long | 16 | 3, 4, 24 |
unsigned qword | uint64 | ✔ | 8 | 1 | ulong | 16 | 3, 4, 24 |
float | float | ✔ | 4 | 1 | float | 16 | 3, 4, 24 |
double | double | ✔ | 8 | 1 | float | 16 | 3, 4, 24 |
string | string | ❌ | max. 240 | 1 | string | 16 | 3, 4, 24 |
blob | blob | ❌ | max. 240 | 1 | blob | 16 | 3, 4, 24 |
Bitweises Schreiben von Holding Registern
Werden nur einzelne Bits eines Registers geschrieben, werden die restlichen Bits automatisch auf 0 gesetzt, da der Treiber immer ein gesamtes Register schreibt. Sollen daher nur einzelne Bits geschrieben werden, müssen alle 16 Bits in WinCC OA konfiguriert, ausgelesen und entsprechend gesetzt werden. Der Treiber führt kein "Read before Write" durch. Diese Funktionalität muss vom Benutzer selbst eingebaut werden.
Bitweises Lesen von Holding und Input Registern
Soll ein Holding Register bitweise gelesen und auf einzelne Datenpunktelemente abgebildet werden, stehen folgende Möglichkeiten zur Verfügung:
- Methode 1
-
Erstellen Sie einen neuen Datenpunkttyp mit einem Strukturknoten vom Typ bool. Jedes Element dass unter diesem Strukturknoten angelegt wird, ist ebenfalls automatisch vom Typ bool. Um alle 16 Bits eines Holding Registers abbilden zu können, benötigen Sie 16 dieser bool-Elemente.
Legen Sie einen Datenpunkt vom eben erstellten Typ an und fügen Sie am Strukturknoten ein _address-Config ein. Parametrieren Sie das Register das gelesen werden soll (in diesem Beispiel Register 10) und wählen Sie Funktionscode 3 (read multiple registers) und Transformationstyp boolean.
Beim Lesen des Registers wird nun das Word bitweise auf die einzelnen bool-Elemente (b1 - b16) aufgeteilt.
- Methode 2
-
Legen Sie 16 Datenpunkte vom Typ bool an und fügen Sie jedem Datenpunkt ein _address-Config hinzu. Parametrieren Sie das Register das gelesen werden soll (in diesem Beispiel Register 12) und wählen Sie Funktionscode 3 (read multiple registers) und Transformationstyp boolean. Definieren Sie für jedes Element den entsprechenden Subindex (DPE1 = Subindex 0, DPE2 = Subindex 1, ...).
Anmerkung: Wenn Sie an den _address-Configs Polling konfigurieren, müssen Sie für alle Elemente die gleiche Pollgruppe wählen, da ein Register immer als Gesamtes gelesen wird. Ansonsten würde das Word mehrfach gelesen werden.
Error Codes / Fehlercodes
In diesem Abschnitt finden Sie eine Tabelle, die Fehlercodes im SPS-Parametrierpanel (siehe Parametrierpanel des Modbus/TCP Treibers) beschreibt.
Fehlernummer | Beschreibung |
---|---|
0 | kein Fehler |
1 | Master-Verbindung zur SPS unterbrochen, Wiederaufbau wird nicht versucht |
2 | Master-Verbindung zur SPS unterbrochen, Wiederaufbau wird versucht |
3 | Fehler bei der Slave-Verbindung |
4 | Peer hat die Slave-Verbindung geschlossen |
5 | Modbus Queue übergelaufen |
6 | Fehler beim Frame entschlüsseln |
Fehlernummer | Beschreibung |
---|---|
101 | Illegale Funktion |
102 | Illegale Datenadresse |
103 | Illegaler Datenwert |
104 | Illegale Antwortlänge |
105 | Quittieren |
106 | Slave-Gerät beschäftigt |
107 | Negative Quittierung |
108 | Speicher Parität Fehler |
110 | Gateway-Pfad nicht verfügbar |
111 | Antwort vom Gateway-Zielgerät fehlgeschlagen |
Error Messages
Die nachfolgende Tabelle beschreibt Fehlermeldungen beim Modbus/TCP Treiber.
Klasse | Fehlermeldung | Beschreibung |
---|---|---|
ModConnection | Too many PLCs on one gateway | Es gibt zu viele SPSen mit der gleichen IP-Adresse. |
ModHWMapper | Illegal transformation type for ... | Ein ungültiger Transformationstyp wurde für ein Peripherieadressen-Konfig definiert. |
ModHWMapper | Subindex + transformation type exceeds max. data length ... | Eine Subindex-Transformation und Funktionscode Kombination liefert eine zu hohe Datenlänge. |
ModHWMapper | Wrong Output function code for: ... | Dieser Funktionscode ist für ein Ausgangs-DPE nicht erlaubt. |
ModHWMapper | Wrong input spontaneous function code for: ... | Dieser Funktionscode ist für einen spontanen Eingangs-DPE nicht erlaubt. |
ModHWMapper | Ref. number not modulo 16 for spontaneous mode and FC15 for: ... | Die Referenznummer muss für diese Kombination Modulo 16 sein. |
ModHWMapper | Wrong input polling/squery function code for: ... | Dieser Funktionscode ist für ein Polling oder Single query Eingangs-DPE nicht erlaubt. |
ModHWMapper | Wrong mode for: ... | Falsche Eingangsart für Peripherieadressen-Konfig. |
ModHWMapper | Transformation/FC incompatibility for: ... | Unerlaubte Kombination von Funktionscode und Transformationstyp. |
ModHWMapper | UNICOS SFC != 0 and FC != 16 for: ... | UNICOS verwendet nur Funktionscode 16. |
ModMasterConnection | Socket error during send | Fehler am Socket während dem Senden von Daten. |
ModMasterConnection | Cannot establish connection to server | Der Master kann keine Verbindung zur SPS aufbauen, entweder aufgrund eines falschen Hostnamens/Portnummer oder eines Netzwerkproblems. |
ModMasterConnection | Peer has closed connection | Die SPS hat die Verbindung geschlossen. |
ModMasterConnection | Connection to ... marked as dead | Die Verbindung ist als "tot" markiert. Verbindungsversuche werden nicht länger durchgeführt. |
ModModbus | Error during reception of ASCII frame | Kein gültiger ASCII Frame empfangen. |
ModModbus | No PLC for unit address: ... | Es ist keine SPS mit der empfangenen Unit-Adresse auf dieser Verbindung definiert. |
ModModbus | Invalid Request Size field | Ein Modbus Frame ohne gültiger Requestgröße wurde empfangen. In diesem Fall wird die Frame Erkennung nicht synchronisiert. Die Verbindung wird geschlossen und wieder geöffnet, um diesen Fehler zu beheben. |
ModModbus | Error too many invalid frames | Zu viele falsche Frames wurden empfangen. Das ist ein Folgefehler von anderen Fehlern. Dies bewirkt ein Wiederöffnen der Verbindung. |
ModModbusMaster | No host/unit address defined for PLC number: ... | Für die SPS-Nummer ist keine Host/Unit-Adresse definiert. Dieser Fehler wird hervorgerufen, wenn kein interner DP (_Mod_Plc) für diese SPS-Nummer angelegt wurde. |
ModModbusMaster | Unknown function code specified in Peripheral Address | Ungültiger Funktionscode in der PA enthalten. |
ModModbusMaster | Missing some responses to outstanding requests | Einige Antworten zu ausständigen Requests fehlen. |
ModModbusMaster | Receiving Modbus frame without request | Erhalt einer Antwort ohne Senden eines Requests. Wenn zu viele solcher Fehler passieren wird die Verbindung geschlossen und wieder geöffnet. |
ModModbusMaster | Wrong unit address received: UA= ... | Erhalt einer falschen Unit-Adresse für einen ausständigen Request. Wenn zu viele solcher Fehler passieren wird die Verbindung geschlossen und wieder geöffnet. |
ModModbusMaster | Exception code received: EC= ... | Ein Fehler kam von der SPS. Sie konnte den Request nicht verarbeiten. Die Bedeutung des Ausnahmecodes kann aus der Tabelle der Error Codes entnommen werden. |
ModModbusMaster | Wrong response to output FC | Falsche Antwort zum bestimmten Request. Wenn zu viele solcher Fehler passieren wird die Verbindung geschlossen und wieder geöffnet. |
ModModbusMaster | Wrong response to read registers request | Falsche Antwort zum bestimmten Request. Wenn zuviele solcher Fehler passieren wird die Verbindung geschlossen und wieder geöffnet. |
ModModbusMaster | Wrong response to read discretes request | Falsche Antwort zum bestimmten Request. Wenn zuviele solcher Fehler passieren wird die Verbindung geschlossen und wieder geöffnet. |
ModModbusMaster | Wrong response to read exception status request | Falsche Antwort zum bestimmten Request. Wenn zuviele solcher Fehler passieren wird die Verbindung geschlossen und wieder geöffnet. |
ModModbusMaster | Wrong response to read FIFO request | Falsche Antwort zum bestimmten Request. Wenn zuviele solcher Fehler passieren wird die Verbindung geschlossen und wieder geöffnet. |
ModModbusSlave | Slave received unknown function code | Der Slave erhielt einen nicht unterstützten oder ungültigen Modbus Funktionscode. |
ModModbusSlave | Invalid number of events in UNICOS Event Report | Im UNICOS Event Report Frame ist eine ungültige Nummer vom Event Feld. |
ModModbusSlave | UNICOS Slave received unknown subfunction code | Der Slave erhielt einen nicht unterstützten oder ungültigen UNICOS Subfunktionscode. |
ModOutputQueue | Maximum requests in queue, request discarded | Ein Überlauf der Modbus Queue tritt auf. |
ModOutputQueue | Discarding polling requests (Msg. every 100) | Der gleiche Polling Request ist bereits in der Queue, der aktuelle wird verworfen. Diese Warnung erscheint nur, wenn der Treiber mit -dbg 25 startet. |
ModOutputQueue | Timeout appears for last sent request | Ein Modbus Transaktions-Timeout für einen Request trat auf. |
ModPlc | Error during setting of PLC data | Ein Fehler passiert während des Setzens von SPS Daten vom internen DP. Verwenden Sie -dbg 2, für weitere Informationen (DP Identifier) zu diesem Fehler. |
ModPrLayer | Cannot start Server | Der Treiber kann keinen Server Socket erstellen. Vermutlich wird die Portnummer bereits verwendet. |
ModRsrce | Unknown keyword in config file | Die Config-Datei enthält einen unbekannten Eintrag. |
ModSlaveConnection | Socket error during send | Ein Fehler ist während des Sendens von Daten über den Socket aufgetreten. |