IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Calcul CRC 16


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Par défaut Calcul CRC 16
    Bonjour,

    Je souhaite communiquer avec un régulateur de température (eurotherm S2000) via une RS232. Le protocole de communication utilisé est un protocole Modbus. Le message transmit se compose d'un certain nombre de caractères pour que mon ordinateur puisse comprendre. Ainsi, la syntaxe de la trame d'un message est début de la trame (3 octets), adresse du pérephirique (1 octets), code fonction (1 octets), données (n octets), CRC (2 octets) , EOT (3 octets).

    Donc cette communication repose sur le calcul du contrôle de redondance cyclique (CRC 16bits), un calcul permettant la détection d'erreur.


    Mon probléme est que je ne sais pas comment mettre en place cette communication via python. Donc si vous pouviez m'éclairer sur mon probléme, cela me serait d'une grande aide.


    Voici la doc de l'instrument que j'utilise: http://www.eurotherm.tm.fr/index.php...wnload_id=1915

    En vous remerciant par avance.

    Cordialement.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par Cerise22 Voir le message
    Mon probléme est que je ne sais pas comment mettre en place cette communication via python. Donc si vous pouviez m'éclairer sur mon probléme, cela me serait d'une grande aide.
    Il suffit de coder
    S'il faut tout coder, c'est un travail conséquent qu'il faut structurer, réaliser, tester,...

    Une autre solution est de rechercher sur le ouèbe si une implémentation utilisable par Python de ce type de protocole n'est pas utilisable tout ou partie.
    Il faut lire la documentation et le code pour voir si çà le fait... tester avec votre engin pour voir si çà fonctionne adapter ou écrire des bouts.

    Dans tous les cas, c'est un boulot de plusieurs jours (voire semaines) pour un programmeur expérimenté (même pour récupérer une bibliothèque prête à l'emploi, il faut de l'expérience pour savoir si elle a des chances de fonctionner, la tester, l'adapter).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Par défaut
    Bonjour,

    Pour la partie communication, vous pouvez déjà pour renseigner sur les modules, pyserial, ftd2xx ou pylibftdi (choisissez en une ou plusieurs suivant vos besoin).
    Ensuite, pour les calculs de CRC, il y à plein d'implémentation sur le net, personnellement j'en utilise une que j'ai trouver il y a un petit moment sur le web, mais pycrc devrai faire ton bonheur.
    Il propose entre autre :
    crc-16-modbus
    Width 16
    Poly 0x8005
    Reflect In True
    XOR In 0xffff
    Reflect Out True
    XOR Out 0x0000
    Short command pycrc.py --model crc-16-modbus
    Extended command pycrc.py --width 16 --poly 0x8005 --reflect-in True --xor-in 0xffff --reflect-out True --xor-out 0x0000
    Check 0x4b37

  4. #4
    Membre confirmé
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Par défaut
    Bonjour,

    Pour la communication avec le régulateur de température, je vais utiliser le module pyserial pour la communication avec la liaison RS232.
    Pour le calcul du CRC 16 , le code de redondance cyclique, j'utilise le module PyCRC.

    Le protocole pour lire une température via le régulateur est d'envoyer ces paramétres via le port série: "1 3 0 28 0 1" ensuite on calcul le CRC de ces données. Dans la documentation, on m'indique que l'on doit ajouter à la chaine précedente le CRC lo byte et le CRC HIGH byte.

    Mais concretement à quoi correspond le CRC lo byte et le CRC High byte?


    En vous remerciant.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par Cerise22 Voir le message
    Mais concretement à quoi correspond le CRC lo byte et le CRC High byte?
    Votre documentation donne un exemple en C:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    uint16 calculate_crc(octet *z_p, uint16 z_message_length)
    /* CRC fait tourner l'algorithme de contrôle de redondance cyclique sur l'entrée z_p
    */
    /* Renvoie une valeur de 16 bits CRC après achèvement et ajoute */
    /* toujours 2 octets CRC au message */
    /* renvoie 0 si le CRC du message qui arrive est correct */
    {
        uint16 CRC= 0xffff;
        uint16 next;
        uint16 report;
        uint16 n;
        uint8 crch, crcl;
        while (z_message_length--) {
            next = (uint16)*z_p;
            CRC ^= next;
            for (n = 0; n < 8; n++) {
                report = CRC & 1;
                CRC >>= 1;
                if (report) {
                    CRC ^= 0xA001;
                }
            }
            z_p++;
        }
        crch = CRC / 256;
        crcl = CRC % 256
        z_p[z_message_length++] = crcl;
        z_p[z_message_length] = crch;
        return CRC;
    }

    Une autre façon de voir est qu'un CRC16 se calcule sur 2 octets/bytes et comme vous transférez des bytes sur le port série, il faut savoir dans quel ordre transférer ces 2 bytes... et là on vous dit: "low-byte first".
    note: même si vous ne connaissez pas C, ces constructions sont suffisamment proches de Python pour être à priori "lisibles".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre confirmé
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Par défaut
    Merci pour votre retour.

    Comme dit précedemment, j'utilise le module PyCRC:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from PyCRC.CRC16 import CRC16
     
    input = '1302801'
    print(CRC16().calculate(input))
     # Cela m'affiche comme valeur 42303
    Donc en ayant cette valeur comment je peux différencier le bit de poids faible et le bit de poids fort?

Discussions similaires

  1. [WD12E] Calcul CRC-CCITT erroné
    Par bouillant dans le forum WinDev
    Réponses: 9
    Dernier message: 17/03/2022, 11h54
  2. Choix et calcul CRC, checksum,md5
    Par mercure07 dans le forum C++
    Réponses: 1
    Dernier message: 22/04/2008, 14h27
  3. Calcul CRC 16
    Par G_angel dans le forum C#
    Réponses: 1
    Dernier message: 16/04/2007, 09h46
  4. Calcul CRC d'une trame
    Par Dimitri_87 dans le forum Réseau
    Réponses: 6
    Dernier message: 10/02/2007, 17h56
  5. Calcul CRC ISO3309
    Par zodd dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/05/2006, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo