Calcul du CRC16 trame Modbus

Signaler
Messages postés
68
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
19 janvier 2010
-
Messages postés
68
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
19 janvier 2010
-
Salut a tous,

G un gros probleme je travail avec des trames Modbus seul probleme je dois calculer le CRC16 g trouver des algorithmes et des trames deja faite. Malheureusement les algorithme et codes trouver ne me fournisse pas le meme résultat que celui de la trames voici un algorithme et un code:

Initialiser le CRC (registre de 16 bits)
à H'FFFF
Faire du 1er octet du message au dernier
   CRC X0R < octet > CRC
   Faire 8 fois
      Décaler le CRC d'un bit à droite
      Si le bit de sorti = 1, faire CRC X0R H'A001 CRC
   Fin faire.
Fin faire
Le CRC obtenu sera émis poids faibles d'abord, poids forts ensuite.
X0R signifie OU exclusif.

(http://download.telemecanique.com/85256F0B003C899C/all/2D8049B41308F50585256DD50069BA46/$File/Vvg058fr.PDF )

Auteur : VirtuA

unsigned
int
Crc16(
unsigned
char
*Adresse_tab ,
unsigned
char
Taille_max)    
{
   unsigned
int
Crc = 0xFFFF; 
   unsigned
int
Polynome = 0xA001; 
   unsigned
char
CptOctet = 0; 
   unsigned
char
CptBit = 0; 
   unsigned
char
Parity= 0; 
      Crc = 0xFFFF;       Polynome 0xA001; <samp>// Polynôme 2^15 + 2^13 + 2^0 = 0xA001.</samp> 
   for
( CptOctet= 0 ; CptOctet < Taille_max ; CptOctet++) 
      { 
             Crc ^= *( Adresse_tab + CptOctet); <samp>//Ou exculsif entre octet message et CRC</samp> 
      for
( CptBit = 0; CptBit <= 7 ; CptBit++) <samp>/* Mise a 0 du compteur nombre de bits */</samp> 
            {
                 Parity= Crc; 
                 Crc >>= 1;             <samp>// Décalage a droite du crc</samp> 
                 
if
(Parity%2 == VRAI) Crc ^= Polynome; <samp>// Test si nombre impair -> Apres decalage à droite il y aura une retenue 
</samp>            }                     <samp>// "ou exclusif" entre le CRC et le polynome generateur.</samp> 
        } 
   return
(Crc);
}
(http://www.cppfrance.com/codes/CRC-16_31553.aspx)
La trame qui a ete recu est la suivante : 0403 0002 0001 25CA
et le resultat de ce code est A043 au lieu de 25CA

Pouvez vous maider je ne trouve pas la solution a ce probleme car le calcul effectuer dans le code me parait juste.

3 réponses

Messages postés
1
Date d'inscription
jeudi 8 décembre 2005
Statut
Membre
Dernière intervention
12 janvier 2007

Je cherche du source (C++,C#,ACCESS,VB) en Modbus/Jbus pour faire communiquer une machine automate avec un ordinateur (RS232, RS425)

Merci d'avance pour votre aide

ABT
Messages postés
1
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
27 mars 2007

j'ai un pb depuis 30 jour pour configure une passerellemodbus pour contrôler une barrière a distance svp une aide mon hotmail hadj-miloud@hotmail.fr
Messages postés
68
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
19 janvier 2010

duolim,

moi g trouver une solution et ca marche qd on c bien sen servir,
va sur http://members.tripod.com/~mbserver/ et telecharge l'executable en bah de page c mod102.zip et lit la doc c'est un server ActiveX et ca marche bien. En tout cas pour moi, je n'utilise qu'une carte relier par un cable serie mais ca communique bien en modbus voila j'espere que ca va t'aider.

040652,
va faire un tour y a aussi les source ca peut t'aider je pense.

Voila j'espere vous avoir bien aider.

CIAO