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.
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 |
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 |
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;
}
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:
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 |