Analyse der Gemeinsamkeiten und Unterschiede der Modbus RTU/ASCII Kommunikationsprotokolle

Modbus hat zwei Modi, die auf serieller Kommunikation basieren: Modbus RTU und Modbus-ASCII-Modus. Unabhängig vom RTU- oder ASCII-Modus werden die Modbus-Informationen in Rahmen übertragen. Jeder Informationsrahmen hat einen festgelegten Start- und Endpunkt, so dass das empfangende Gerät mit dem Lesen der Adresse am Startpunkt der Informationen beginnt und das zu adressierende Gerät (Host-Broadcast an alle Geräte) sowie den Endzeitpunkt der Informationsübertragung bestimmt. Außerdem können einige Informationen erkannt werden, was zu Fehlern führen kann.

Der Unterschied zwischen dem RTU-Modus und dem ASCII-Modus ist:

1. Die Anfangs- und Endzeichen sind unterschiedlich.

Der Beginn und das Ende des RTU-Modus werden durch die für die Übertragung von 3,5 Byte erforderliche Leerlaufzeit gekennzeichnet. Unter der Annahme, dass die Kommunikationsrate der seriellen Schnittstelle 9600bps beträgt, beträgt die für die Übertragung eines Bytes erforderliche Zeit etwa eine Millisekunde (8/9600 oder /1200 Sekunden), 3,5 Die Leerlaufzeit der Bytes beträgt etwa 3-4 Millisekunden, d.h. wenn die Baudrate 9600bps beträgt, beträgt die Leerlaufzeit der RTU-Übertragung 6-8 Millisekunden (die Leerlaufzeit am Ende des vorherigen Informationsrahmens und die Leerlaufzeit am Anfang des Informationsrahmens), um einen neuen Infoframe zu beginnen. Im ASCII-Modus werden feste ASCII-Zeichen für den Anfang (:, Doppelpunkt, 3AH in hexadezimaler Darstellung) und das Ende (CRLF, Wagenrücklauf-Zeilenvorschub, 0D und 0AH in hexadezimaler Darstellung) verwendet.

2. Die Überprüfungsmodi sind unterschiedlich.

Im RTU-Modus wird der CRC-Prüfcode verwendet, im ASCII-Modus der LRC-Prüfcode. Relativ gesehen ist der LRC-Prüfcode einfacher und leichter zu verstehen. Der LRC-Prüfcode besteht darin, zu allen Daten im Informationsrahmen mit Ausnahme der Start- und Endzeichen (: und Wagenrücklauf und Zeilenvorschub) durch Byte-Überlagerung 1 hinzuzufügen. Der LRC-Prüfcode lautet wie folgt:

BYTE GetCheckCode(const char*pSendBuf,int nEnd)//LRC-Prüfcode abrufen

{

BYTE byLrc=0;char pBuf[4];int nData=0;

for(i=1;i

{

pBuf[0]=pSendBuf[i];

pBuf[1]=pSendBuf[i 1];

pBuf[2]=”

ssanf(pBuf ”%X”,&nData;byLrc =nData);

}

bLrc=~bLrc;

bLrc;

}

Der CRC-Prüfcode besteht darin, dass jedes Acht-Bit-Zeichen einzeln mit dem Inhalt des Registers verodert wird. Das Ergebnis wandert in das niederwertigste Bit, das höchstwertige Bit wird mit 0 aufgefüllt, und das LSB ist 1. Das Register wird mit dem voreingestellten Wert LSB ODER-verknüpft, wenn es 0 ist, wird es nicht fortgesetzt. Der gesamte Vorgang wird 8 Mal wiederholt. Nachdem das letzte Bit abgeschlossen ist, wird das nächste 8-Bit-Byte mit dem aktuellen Wert des Registers verodert, und der endgültige Wert des Registers ist der CRC-Wert. Der CRC-Prüfcode lautet wie folgt:

WORD GetCheckCode(const char *pSendBuf,int nEnd)//Gewinnt CRC-Prüfcode

{

WORD wCrc=WORD(0xFFFF);

for(inti=0;i

{

wCrc^=WORD(BYTE(pSendBuf[i]));

for(int j=0;j<8;j)

{

if(wCrc&1)

{

wCrc>>=1;

wCrc^=0xA001;

}

}

sonst

{

wCrc>>=1;

}

}

return wCrc;

}

3. Die Übertragungseffizienz des RTU-Modus ist höher als die des ASCII-Modus.

Im ASCII-Modus müssen nicht nur Start- und Endflags hinzugefügt werden, sondern es müssen auch hexadezimale Daten in ASCII-Codes umgewandelt werden. Wenn zum Beispiel hexadezimale 0x25 in ASCII-Zeichen umgewandelt wird, ist es 0x32, 0x35. Die Effizienz des ASCII-Ausdrucks ist nur halb so groß wie die des RTU-Ausdrucks. Konvertieren Sie Anweisungen im RTU-Modus in Anweisungen im ASCII-Modus: 1. Entfernen Sie den CRC-Prüfcode; 2. wandeln Sie alle entsprechenden Bytes in entsprechende Zwei-Byte-ASCII-Zeichen um; 3. fügen Sie einen Start- und einen Endbezeichner hinzu und berechnen Sie LRC-Prüfcode plus.