en nl de en

Modbus RTU Protokoll

Alle Stromversorgungen verwenden das Modbus-Protokoll als Standard zur Übertragung von Telegrammen. Während der Übertragung legt das Protokoll fest, wie jede einzelne Stromversorgung ihre eigene Adresse erkennt, ein an sich gerichtetes Telegramm erkennt, festlegt, welche Aktionen durchgeführt werden müssen, und im Telegramm enthaltene Daten oder andere Informationen herauszieht. Die jeweilige Stromversorgung sendet dann eine Antwort über das Modbus-Protokoll zurück.

Das verwendete Protokoll entspricht der Standard-Modbus-Spezifikation für Nebenknoten (slave nodes) unter Verwendung des binären RTU-Modus (Remote Terminal Unit) mit den folgenden Rahmeneinstellungen:

Die Software verwendet 2 Funktionen des Modbus-Protokolls:

Der Master kann unter Verwendung der Adresse 0 an alle Slave-Geräte gleichzeitig senden. Dies nennt man einen Rundbefehl oder allgemeines Telegramm. Die Slave-Geräte führen zwar die gesendete Aufforderung aus, sie senden jedoch keine Antwort zurück zum Master.

FN3: Mehrere Register lesen

Die FN3-Funktion liest den binären Inhalt der Halteregister im Slave. Rundbefehle (allgemeine Telegramme) werden nicht unterstützt. Die Abfrage spezifiziert das Anfangsregister und die Anzahl der zu lesenden Register.

Das Beispiel zeigt eine Aufforderung zum Lesen des Registers 10 durch Slave-Gerät 1 (Antwort = 100 dezimal). Die Feldbeispiele werden als hexadezimale Werte angegeben:

Byte Feldname Beispiel (hexadezimal)
0 Slave-Adresse 01
1 Funktion 03
2 Anfangsadresse hoch 00
3 Anfangsadresse niedrig 0A
4 Anzahl der Register hoch 00
5 Anzahl der Register niedrig 01
6 CRC-Blockprüfung niedrig A4
7 CRC-Blockprüfung hoch 08


Antwort:
Die Registerdaten in der Antwort werden jeweils als zwei Byte pro Register gepackt. Bei jedem Register enthält das erste Byte die höherwertigen Bits und das zweite Byte die niederwertigen Bits.

Byte Feldname Beispiel (hexadezimal)
0 Slave-Adresse 01
1 Funktion 03
2 Byte-Zählung 02
3 Daten hoch 00
4 Daten niedrig 64
5 CRC-Blockprüfung niedrig B9
6 CRC-Blockprüfung hoch AF

 

FN16: Mehrere Register voreinstellen

Der FN16-Befehl führt die Voreinstellung eines Wertes in mehreren, aufeinanderfolgenden Halteregistern durch. Bei einem Rundbefehl führt die Funktion eine Voreinstellung der gleichen Registerreferenz in allen angeschlossenen Slaves durch.

Das Beispiel zeigt eine Aufforderung zur Voreinstellung von 3 Registern beginnend bei 31 auf 103, 203 und 303 hexadezimal im Slave-Gerät 1. Die Feldbeispiele werden in hexadezimalen Werten angegeben:

Byte Feldname Beispiel (hexadezimal)
0 Slave-Adresse 01
1 Funktion 10
2 Anfangsadresse hoch 00
3 Anfangsadresse niedrig 1F
4 Anzahl der Register hoch 00
5 Anzahl der Register niedrig 03
6 Byte-Zählung 06
7 Voreingestellte Daten hoch 01
8 Voreingestellte Daten niedrig 03
9 Voreingestellte Daten hoch 02
10 Voreingestellte Daten niedrig 03
11 Voreingestellte Daten hoch 03
12 Voreingestellte Daten niedrig 03
13 CRC-Blockprüfung niedrig 23
14 CRC-Blockprüfung hoch BD


Antwort:
Eine normale Antwort enthält die Slave-Adresse, den Funktionscode, die Anfangsadresse und die Anzahl der Register, die voreingestellt werden sollen.

Byte Feldname Beispiel (hexadezimal)
0 Slave-Adresse 01
1 Funktion 10
2 Anfangsadresse hoch 00
3 Anfangsadresse niedrig 1F
4 Anzahl der Register hoch 00
5 Anzahl der Register niedrig 03
6 CRC-Blockprüfung niedrig B1
7 CRC-Blockprüfung hoch CE

 

Zyklische Blockprüfung (CRC - Cyclic Redundancy Check)

Das CRC-Feld besteht aus zwei Bytes, die einen binären 16-Bit-Wert enthalten. Der CRC-Wert wird vom sendenden Gerät berechnet, das den CRC-Wert an das Telegramm anhängt. Das empfangende Gerät führt während des Erhalts des Telegramms eine Neuberechnung des CRC-Wertes durch und vergleicht den berechneten Wert mit dem tatsächlichen Wert im CRC-Feld. Sind die beiden Werte nicht identisch, wird ein Fehler gesetzt.

Die zyklische Blockprüfung wird eingeleitet, indem zunächst ein 16-Bit-Register komplett mit 1ern geladen wird. Dann werden aufeinanderfolgende 8-Bit-Bytes des Telegramms auf den aktuellen Inhalt des Registers angewendet. Nur die acht Datenbits in jedem Zeichen werden zur Durchführung der zyklischen Blockprüfung herangezogen. Die Start- und Stoppbits werden bei der zyklischen Blockprüfung nicht berücksichtigt.

Während der Durchführung der zyklischen Blockprüfung wird jedes 8-Bit-Zeichen mit dem Registerinhalt verglichen und eine exklusive ODER-Verknüpfung hergestellt. Das Ergebnis wird in Richtung des am wenigsten wichtigen Bit verschoben, wobei an die Stelle des wichtigsten Bits eine Null gesetzt wird. Das am wenigsten wichtige Bit wird entfernt und untersucht. War das am wenigsten wichtige Bit eine 1, dann wird mit dem Inhalt des Registers eine exklusive ODER-Verknüpfung mit einem voreingestellten, feststehenden Wert (= hex A001) durchgeführt. War das am wenigsten wichtige Bit eine 0, so findet keine exklusive ODER-Verknüpfung statt.

Dieser Vorgang wiederholt sich so lange, bis acht Stellenverschiebungen durchgeführt wurden. Nach der letzten (achten) Verschiebung, wird das nächste 8-Bit-Byte mit dem aktuellen Registerinhalt verglichen und eine exklusive ODER-Verknüpfung hergestellt. Dieser Vorgang wiederholt sich wie oben beschrieben bei acht weiteren Verschiebungen. Der endgültige Registerinhalt ist nach Berechnung aller Telegrammbytes das Ergebnis der zyklischen Fehlerprüfung, sprich der CRC-Wert.

Wird der CRC-Wert an das Telegramm angehängt, dann wird das niederwertige Byte zuerst angehängt. Danach folgt das höherwertige Byte.

Die folgende Abbildung zeigt ein Beispiel einer C-Programmiersprachenfunktion bei der Durchführung einer zyklischen Fehlerprüfung:

typedef unsigned int WORD;

char Buffer[128];

WORD CRC16(char Cnt)
/* ----------------------------------- */
/* Procedure to calculate CRC checksum */
/* ----------------------------------- */
{
  char c,i,j;
  WORD Temp = 0xFFFF;

  for (i=1;i<=Cnt;i++)
    {
    Temp ^= (WORD)Buffer[i];
    for (j=1;j<=8;j++)
      {
      c = (Temp & 0x0001);
      Temp = Temp >> 1;
      if (c) Temp ^= 0xA001;
      }
    }
  return Temp;
}

Ausnahmeantworten

Wenn ein Master-Gerät eine Abfrage an ein Slave-Gerät sendet, erwartet das Master-Gerät eine normale Antwort; eine Ausnahme bilden die Rundbefehle. Nach der Übertragung einer Abfrage durch den Master kann eines der folgenden vier Ereignisse eintreten:

  1. Wenn das Slave-Gerät die Abfrage ohne Datenübertragungsfehler erhält und die Abfrage normal bearbeiten kann, wird eine normale Antwort zurückgesendet.
  2. Wenn das Slave-Gerät aufgrund eines Datenübertragungsfehlers die Abfrage nicht erhält, wird keine Antwort zurückgesendet. Das Programm des Master-Gerätes stellt für die Abfrage eine Zeitüberschreitung fest.
  3. Wenn das Slave-Gerät die Abfrage empfängt, jedoch einen Datenübertragungsfehler ermittelt (wie z.B. ein Fehler im CRC-Wert), wird keine Antwort zurückgesendet. Das Programm des Master-Gerätes stellt für die Abfrage eine Zeitüberschreitung fest.
  4. Wenn das Slave-Gerät die Abfrage ohne Datenübertragungsfehler erhält, die Abfrage jedoch nicht bearbeiten kann (z.B. falls die Aufforderung darin besteht, ein nicht vorhandenes Register auszulesen), wird eine Ausnahmeantwort zurückgesendet, mit der das Master-Gerät über die Art des Fehlers informiert wird.

Die Ausnahmeantwort besitzt zwei Felder, die es von einer normalen Antwort unterscheiden:

Funktionscodefeld: Bei einer normalen Antwort sendet das Slave-Gerät eine Kopie des in der ursprünglichen Abfrage enthaltenen Funktionscodes im entsprechenden Feld der Antwort zurück. Alle Funktionscodes besitzen ein wichtigstes Bit (most significant bit; MSB) 0. Bei einer Ausnahmeantwort setzt das Slave-Gerät das wichtigste Bit des Funktionscodes auf 1. Dadurch wird der Wert des Funktionscodes bei einer Ausnahmeantwort um genau 80 Hexadezimale höher als er in einer normalen Antwort sein würde.

Ist das wichtigste Bit (MSB) des Funktionscodes gesetzt, kann das Anwendungsprogramm des Master-Gerätes die Ausnahmeantwort identifizieren und das Datenfeld auf den Ausnahmecode untersuchen.

Datenfeld: Bei einer normalen Antwort sendet das Slave-Gerät Daten im Datenfeld (alle Informationen, die abgefragt wurden). Bei einer Ausnahmeantwort sendet das Slave-Gerät einen Ausnahmecode im Datenfeld. Dadurch wird der Betriebszustand des Slave-Gerätes definiert, der die Ausnahme verursacht hat.

Die folgende Liste enthält Ausnahmecodes, die von der AxD-Software verwendet werden:

Code Bezeichnung Bedeutung
01 UNZULÄSSIGE FUNKTION Der zusammen mit der Abfrage empfangene Funktionscode bezieht sich auf eine für das Slave-Gerät unzulässige Aktion.
02 UNZULÄSSIGE DATENADRESSE Die zusammen mit der Abfrage empfangene Datenadresse ist für das Slave-Gerät nicht zulässig.
03 UNZULÄSSIGER DATENWERT Ein im Abfragedatenfeld enthaltener Wert ist für das Slave-Gerät nicht zulässig.


Beispiel:

Im folgenden Beispiel fordert das Master-Gerät Register 1 vom Slave-Gerät 1 an. Da das Register 1 nicht lese-unterstútzt ist, wird der Ausnahmecode 2 zurückgesendet:

Byte Feldname Beispiel (hexadezimal)
0 Slave-Adresse 01
1 Funktion 03
2 Anfangsadresse hoch 00
3 Anfangsadresse niedrig 01
4 Anzahl der Register hoch 00
5 Anzahl der Register niedrig 01
6 CRC-Blockprüfung niedrig D5
7 CRC-Blockprüfung hoch CA


Antwort:

Byte Feldname Beispiel (hexadezimal)
0 Slave-Adresse 01
1 Funktion 83 (MSB bit is set)
2 Ausnahmecode 02 (illegal data address exception)
3 CRC-Blockprüfung niedrig C0
4 CRC-Blockprüfung hoch F1