Analyse des similitudes et des différences entre les protocoles de communication Modbus RTU/ASCII

Modbus a deux modes basés sur la communication en série : Modbus RTU et Modbus ASCII. Indépendamment du mode RTU ou du mode ASCII, les informations Modbus sont transmises dans des trames. Chaque trame d'information a un point de départ et un point d'arrivée déterminés, de sorte que l'appareil récepteur commence à lire l'adresse au point de départ de l'information et détermine l'appareil à adresser (diffusion de l'hôte à tous les appareils), ainsi que l'heure de fin de la transmission de l'information. Certaines informations peuvent être détectées et des erreurs peuvent en résulter.

La différence entre le mode RTU et le mode ASCII est la suivante :

1. Les signes de début et de fin sont différents.

Le début et la fin du mode RTU sont marqués par le temps d'inactivité nécessaire à la transmission de 3,5 octets. En supposant que le taux de communication du port série est de 9600bps, le temps nécessaire pour transmettre un octet est d'environ une milliseconde (8/9600 ou /1200 secondes), 3,5 Le temps d'inactivité des octets est d'environ 3-4 millisecondes, c'est-à-dire que lorsque le taux de baud est de 9600bps, le temps d'inactivité de la transmission RTU est de 6-8 millisecondes (le temps d'inactivité à la fin de la trame d'information précédente et le temps d'inactivité au début de la trame d'information) pour commencer une nouvelle trame d'information. Le mode ASCII utilise des caractères ASCII fixes pour représenter le début ( :, deux points, 3AH en hexadécimal) et la fin (CRLF, retour chariot, touche de saut de ligne, 0D et 0AH en hexadécimal).

2. Les modes de vérification sont différents.

Le mode RTU utilise le code de contrôle CRC, tandis que le mode ASCII utilise le code de contrôle LRC. Relativement parlant, le code de contrôle LRC est plus simple et plus facile à comprendre. Le code de contrôle LRC consiste à ajouter 1 à toutes les données de la trame d'information, à l'exception des caractères de début et de fin ( :, du retour chariot et du saut de ligne) par superposition d'octets. Le code de contrôle LRC est le suivant :

BYTE GetCheckCode(const char*pSendBuf,int nEnd)//Obtention du code de contrôle LRC

{

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

pour(i=1;i

{

pBuf[0]=pSendBuf[i] ;

pBuf[1]=pSendBuf[i 1] ;

pBuf[2]="

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

}

bLrc=~bLrc ;

bLrc ;

}

Le code de vérification CRC est le suivant : chaque caractère de huit bits est individuellement combiné par OU avec le contenu du registre. Le résultat se déplace vers le bit le moins significatif, le bit le plus significatif est rempli avec 0, et le LSB est 1. Le registre est OU avec la valeur prédéfinie, LSB S'il est 0, il n'y aura pas de suite. L'ensemble du processus est répété 8 fois. Une fois le dernier bit terminé, l'octet de 8 bits suivant est combiné à la valeur actuelle du registre, et la valeur finale du registre est la valeur CRC. Le code de vérification CRC est le suivant :

WORD GetCheckCode(const char *pSendBuf,int nEnd)//Obtention du code de contrôle CRC

{

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 ;

}

}

autre

{

wCrc>>=1 ;

}

}

return wCrc ;

}

3. L'efficacité de la transmission en mode RTU est supérieure à celle du mode ASCII.

Le mode ASCII nécessite non seulement l'ajout de drapeaux de début et de fin, mais aussi la conversion des données hexadécimales en codes ASCII. Par exemple, lorsque l'hexadécimal 0x25 est converti en caractères ASCII, il s'agit de 0x32, 0x35. L'efficacité de l'expression ASCII n'est que la moitié de celle de l'expression RTU. Convertir les instructions en mode RTU en instructions en mode ASCII : 1. Supprimer le code de contrôle CRC ; 2. convertir tous les octets correspondants en caractères ASCII correspondants de deux octets ; 3. ajouter un identificateur de début et un identificateur de fin, et calculer le code de contrôle LRC plus.

Nous contacter