Calcul du CRC16 trame Modbus

thmatew Messages postés 68 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 19 janvier 2010 - 20 déc. 2006 à 15:42
thmatew Messages postés 68 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 19 janvier 2010 - 27 mars 2007 à 22:25
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.
A voir également:

3 réponses

040652 Messages postés 1 Date d'inscription jeudi 8 décembre 2005 Statut Membre Dernière intervention 12 janvier 2007
12 janv. 2007 à 14:59
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
0
cs_duolim Messages postés 1 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 27 mars 2007
27 mars 2007 à 21:30
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
0
thmatew Messages postés 68 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 19 janvier 2010
27 mars 2007 à 22:25
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
0
Rejoignez-nous