Analyse van overeenkomsten en verschillen in Modbus RTU/ASCII-communicatieprotocollen

Modbus kent twee modi op basis van seriële communicatie: Modbus RTU en de Modbus ASCII-modus. Ongeacht of er sprake is van de RTU-modus of de ASCII-modus, wordt Modbus-informatie in frames verzonden. Elk informatieframe heeft een vastgesteld begin- en eindpunt, zodat het ontvangende apparaat het adres op het beginpunt van de informatie begint te lezen en het te adresseren apparaat bepaalt (host-uitzending naar alle apparaten), evenals het eindpunt van de informatieoverdracht. Ook kan bepaalde informatie worden gedetecteerd, waardoor fouten kunnen worden vastgesteld.

Het verschil tussen de RTU-modus en de ASCII-modus is:

1. De begin- en eindtekens zijn verschillend.

Het begin en einde van de RTU-modus worden gekenmerkt door de wachttijd die nodig is om 3,5 bytes te verzenden. Ervan uitgaande dat de communicatiesnelheid van de seriële poort 9600 bps bedraagt, duurt het verzenden van één byte ongeveer één milliseconde (8/9600 of /1200 seconden), 3,5 De wachttijd voor 3,5 bytes bedraagt ongeveer 3-4 milliseconden; dat wil zeggen dat bij een baudrate van 9600 bps de wachttijd bij RTU-verzending 6-8 milliseconden bedraagt (de wachttijd aan het einde van het vorige informatieframe en de wachttijd aan het begin van het informatieframe) om een nieuw informatieframe te starten. De ASCII-modus gebruikt vaste ASCII-tekens om het begin (:, dubbele punt, 3AH in hexadecimaal) en het einde (CRLF, carriage return-line feed, 0D en 0AH in hexadecimaal) aan te duiden.

2. De verificatiemethoden verschillen.

De RTU-modus maakt gebruik van een CRC-controlecode, terwijl de ASCII-modus een LRC-controlecode gebruikt. Relatief gezien is de LRC-controlecode eenvoudiger en gemakkelijker te begrijpen. De LRC-controlecode wordt verkregen door 1 op te tellen bij alle gegevens in het informatieframe, met uitzondering van de start- en eindtekens (: en carriage return en line feed), door middel van byte-superpositie. De LRC-controlecode is als volgt:

BYTE GetCheckCode(const char*pSendBuf, int nEnd) // LRC-controlecode ophalen

{

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;

}

De CRC-controlecode werkt als volgt: elk 8-bits teken wordt afzonderlijk met de inhoud van het register OR-gecombineerd. Het resultaat wordt naar het minst significante bit verplaatst, het meest significante bit wordt op 0 gezet en het LSB is 1. Het register wordt met de vooraf ingestelde waarde OR-gecombineerd; als het LSB 0 is, wordt de procedure niet voortgezet. Het hele proces wordt 8 keer herhaald. Nadat het laatste bit is verwerkt, wordt de volgende 8-bits byte met de huidige waarde van het register OR-gecombineerd, en de uiteindelijke waarde van het register is de CRC-waarde. De CRC-controlecode is als volgt:

WORD GetCheckCode(const char *pSendBuf, int nEnd) // CRC-controlecode ophalen

{

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;

}

}

anders

{

wCrc>>=1;

}

}

return wCrc;

}

3. De overdrachtsefficiëntie van de RTU-modus is hoger dan die van de ASCII-modus.

In de ASCII-modus moeten niet alleen begin- en eindvlaggen worden toegevoegd, maar moeten ook hexadecimale gegevens worden omgezet in ASCII-codes. Wanneer bijvoorbeeld de hexadecimale waarde 0x25 wordt omgezet in ASCII-tekens, wordt dit 0x32 en 0x35. De uitdrukkingskracht van ASCII bedraagt slechts de helft van die van de RTU-uitdrukking. Converteer instructies in de RTU-modus naar instructies in de ASCII-modus: 1. Verwijder de CRC-controlecode; 2. Converteer alle bijbehorende bytes naar de overeenkomstige ASCII-tekens van twee bytes; 3. Voeg een start- en eindmarkering toe en bereken de LRC-controlecode.

Over mij
e87d0ef219292bb40d6f120e7d321bcb?s=150&d=mp&r=g
Meer berichten