Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Calcul CRC pour Modbus RTU Ven 21 Mai 2021 - 11:18 | |
| Bonjour à tous ! Voici une fonction qui calcule le CRC d’une chaîne hexadécimale Modbus à envoyer dans le port série. Le programme est brut, sans interface utilisateur. Une version plus civilisée arrivera dans le fil de discussion « Domotique avec Panoramic. RS485, Modbus RTU ». La fonction intègre : - un contrôle de la validité des caractères hexadécimaux saisis ; - un contrôle du nombre de caractères hexadécimaux saisis ; - l’inversion de résultat CRC au format little-endian. La trame (ou séquence, chaine… ) peut être saisie avec ou sans espaces, en minuscules ou majuscules. Bonne journée à tous ! - Code:
-
' calcul crc-16 pour Modbus RTU ' Marc - mai 2021 - https://panoramic.1fr1.net/
' Entrée en hexadécimal ! ! !
dim trame$ caption 0,"Calcul CRC pour modbus RTU."
' chaine hexadécimale test trame$ = "01 03 EF 12 01 00"
' affichage trame$ = upper$(trame$) print trame$ print trame$ + " " + crc16$(trame$)
end
fnc crc16$(tr$) dim_local crc, crc16$, i%, j%, c$, p%, pFort$, pFaible$, t$
' suppression des espaces dans la trame reçue en paramètre for p% = 1 to len(tr$) c$ = mid$(tr$,p%,1) if c$ <> " " t$ = t$ + c$ end_if next p%
' vérification de la chaine hexadécimale reçue par la fonction if mod(len(t$),2) = 0 for p% = 1 to len(t$) c$ = mid$(t$,p%,1) if instr("0123456789ABCDEFabcdef",c$) = 0 message "Le caractère ''" + c$ + "'' n'est pas une valeur hexadécimale !" exit_fnc end_if next p% else message "Le nombre de charactères, sans compter les espaces, doit être pair." exit_fnc end_if
' calcul du crc16 p% = 1 crc = hex("FFFF") for i% = len(t$) to 1 step -2 c$ = mid$(t$,p%,2) crc = bin_xor(crc,hex(c$)) p% = P% + 2 for j% = 0 to 7 if bin_and(crc,hex("0001")) = 1 crc = bin_xor(int(crc/2),hex("A001")) else crc = int(crc/2) end_if next j% next i%
' inversion des 2 octets (little-endian) crc16$ = hex$(crc)
while len(crc16$) < 4 crc16$ = "0" + crc16$ end_while
pFort$ = left$(crc16$,2) pFaible$ = right$(crc16$,2) crc16$ = pFaible$ + " " + pFort$
result crc16$ end_fnc
Sur cette capture d’écran, la première ligne est la séquence hexadécimale de test. La deuxième ligne répète la même séquence suivie des deux octets du CRC. Dans cet exemple, le CRC est « D0 8B ». EDIT du 26/05/2021 : correction d'un bug : mise à jour du code.
Dernière édition par Marc le Mer 26 Mai 2021 - 15:52, édité 3 fois | |
|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 21 Mai 2021 - 14:30 | |
| Bon, ca commence bien, c'est quoi CRC ? une nouvelle agence gouvernementale américaine ? Dis toi que le mec en face, il y pipe rien. Et pourquoi hexadécimal modbus, il est spécial ce code hexa ? tu vois, c'est pas gagné. | |
|
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Calcul CRC pour Modbus RTU Ven 21 Mai 2021 - 23:50 | |
| | |
|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 22 Mai 2021 - 4:07 | |
| Promis, je vais regarder tout cela mais un peu plus tard car il est déjà très tard ou très tôt selon l' angle de vue. | |
|
Ouf_ca_passe
Nombre de messages : 285 Age : 76 Localisation : Villeneuve d'Ascq (59-Dpt du NORD) France Date d'inscription : 21/12/2015
| Sujet: Codes autocorrecteurs Sam 22 Mai 2021 - 11:40 | |
| Bonjour à tou(te)s Oserais-je m'immiscer dans votre conversation de spécialistes ? https://fr.wikipedia.org/wiki/Code_correcteurMAIS cela ajoute au signal d'origine des bits à calculer puis à décoder. Nous avançons-nous vers des simulations 2D sur ordi d'expérimentations de physique ou de chimie ? Trop fort ! | |
|
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Calcul CRC pour Modbus RTU Sam 22 Mai 2021 - 11:59 | |
| Bonjour !
@Ouf_ça_passe
Merci de ton intérêt pour le sujet.
Afin d'éviter toute ambiguïté, je précise qu'ici il s'agit du CRC et pas d'un code de correction d'erreur (ECC).
ECC : A l'aide des bits ajoutés, le récepteur peut corriger une certaine quantité d'erreurs du signal reçu. Le signal est accepté et utilisé par le récepteur.
CRC : Le récepteur effectue le même calcul CRC sur le signal reçu. Si les deux CRC sont identiques, le récepteur accepte l'ordre. Dans le cas contraire, le signal reçu est rejeté. | |
|
Ouf_ca_passe
Nombre de messages : 285 Age : 76 Localisation : Villeneuve d'Ascq (59-Dpt du NORD) France Date d'inscription : 21/12/2015
| Sujet: DOMOTICON Dim 23 Mai 2021 - 7:53 | |
| En voiture les Seniors des PANO
c'est Panoramic LE MAG qui redémarre ...
Merci Marc | |
|
Contenu sponsorisé
| Sujet: Re: Calcul CRC pour Modbus RTU | |
| |
|