Question à propos du protocole modbus

InfectedFuture - 6 mai 2013 à 15:01
 InfectedFuture - 15 mai 2013 à 10:13
Salut
Après de nombreuses recherches je me suis décidé à poster mon problème car je n'arrive pas à trouver la réponse sur internet.
Pour tout vous dire je ne fais pas d'études en informatique je n'ai donc pas les bases théoriques.
Je travaille en ce moment sur un projet consistant à programmer les déplacements d'un robot en vb.net, ça c'est fait. J'ai donc pu acquérir les bases de ce langage.
Maintenant j'ai à programmer, en vb.net aussi, un code permettant de contrôler un boitier Eurotherm 3216. Les échanges se faisant avec ce boitier se basent sur le protocole Modbus.


Mon problème (pour ceux qui auraient la flemme de lire l'intro )

Je n'arrive pas à trouver des exemples de "messages modbus", c'est à dire que je sais de quoi sont composés les messages, un bit de départ etc, mais quel est le caractère du bit de départ, en gros pourais-je avoir un exemple type de chaîne "modbus" qu'il faut envoyé pour que celle ci soit comprise par le boitier ?

Merci d'avance :)

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 mai 2013 à 15:25
Salut

Un bit est un bit : 0 ou 1
Ce genre d'information définit la technique utilisée pour communiquer avec un port série.
Il te faudra aussi définir la parité, la vitesse ...

Ensuite, le protocole Modbus définit plusieurs types de questionnement/réponses = les trames.
De mémoire , elles sont composées d'une suite de plusieurs infos de type Short ou Integer (16 ou 32 bits = 'mot') :
- Adresse de destination (adresse sur le bus modbus)
- Code de l'action : Demande d'écriture de mot, Demande de lecture de mot, réponse à une demande ...
- Adresse du premier mot à lire ou écrire
- Longueur des données à lire / écrire
- Les données, en cas d'écriture : autant de mots que de longueur
- Et pour finir, un CheckSum qui est le XOR de chaque mot composant la requète

Ce CheckSum te servira à vérifier que les infos reçues dans ta trame sont cohérentes, et, quand tu feras une écriture, il te faudra fournir ce Checksum pour que ton automate fasse pareil de son côté.

En général, les fabricants de ce genre de matériel fournissent des fichiers OCX permettant de gérer facilement ces échanges. Ces OCX sont conçus pour du VB6/VBA mais tu peux les utiliser sous .Net (composant COM).

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 mai 2013 à 15:27
PS : Le premier mot "adresse" est le numéro d'esclave de ta liaison, de 1 à 64 il me semble.
0
InfectedFuture
7 mai 2013 à 09:29
Salut,

Merci d'avoir pris le temps de répondre j'ai déjà compris plus de choses :)
Mais ce que je ne comprends pas c'est la trame qu'il faut envoyer
Pour ilustrer ma question, quand j'ai programmé le robot j'envoyé des strings du type "2PA 2000" (2 -> adresse du moteur, PA -> l'action a effectué, 2000 -> sa valeur)
Mais en modbus, qu'est ce que j'envoie concrètement ? ( I'm a and I know It )
0
InfectedFuture
7 mai 2013 à 10:36
Ah et par la même occasion j'ai une autre question à propos de ce protocole : je n'arrive pas à comprendre le principe de high bytes et low bytes
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 mai 2013 à 15:30
Il faut impérativement que tu consultes la norme liée au protocole Modbus : je ne saurais le détailler ici.

Avec ce genre de liaison, tu es capable d'écrire/lire des valeurs dans/depuis des adresses de l'automate.
Donc, quand tu parles de "PA action à effectuée", il faut savoir vers quoi tu dois envoyer cet ordre.
Il doit bien y avoir une adresse mémoire dans l'automate où écrire.

Maintenant, est-ce qu'il faudra écrire les deux lettres P et A ?
Si oui, chaque mot faisant 16 bits (2 octets/bytes) et chaque lettre faisant 8 bits (1 octet/byte), il faudra envoyer dans UNE adresse les deux codes Ascii de ces deux lettres.
Il est plus facile de travailler avec les valeurs hexa :
    high byte  low byte
16 +--------+ +--------+ 0
    11111111   11111111    Binaire
      255        255       Décimal
       FF         FF       Hexa

Exemple avec PA :
P = code ascii 80 (déc) donc 50 Hexa
A = code ascii 65 (déc) donc 41 hexa
--> LeMotHexa = &H5041 ou 20545 en décimal
En supposant que tu écrives à l'adresse 4000, ta trame Modbus pourrait donc ressembler à
2 16 4000 20545 xxx
- 2 pour l'adresse esclave
- 16 pour l'ordre d'écriture de mot (à confirmer par la doc du protocole)
- 4000 pour l'adresse mémoire à cibler
- 20545 pour la valeur à écrire
- xxx pour la valeur du Checksum qu'il te faudra calculer

La valeur 2000 que tu dois écrire dois aussi atterrir à une adresse.
En supposant que tu écrives à l'adresse 4001, ta trame Modbus pourrait donc ressembler à
2 16 4001 2000 xxx
- 2 pour l'adresse esclave
- 16 pour l'ordre d'écriture de mot (à confirmer par la doc du protocole)
- 4001 pour l'adresse mémoire à cibler
- 2000 pour la valeur à écrire
- xxx pour la valeur du Checksum qu'il te faudra calculer

Tout ceci ne s'improvise pas et tu n'y arrives pas à tâton : il faut se baser sur les docs.

As-tu recherché un fichier OCX chez le fournisseur de ton équipement ?
Ce composant te facilitera la tâche.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 mai 2013 à 15:34
Dans le protocole, il y a de fortes chances qu'il faille donner le nombre de mots à écrire :
(je te donne ces infos de mémoire, cela fait au moins 20 ans que je n'y ai pas touché)

2 16 2 4000 20545 2000 xxx
- 2 pour l'adresse esclave
- 16 pour l'ordre d'écriture de mot (à confirmer par la doc du protocole)
- 2 pour le nombre de mots
- 4000 pour la première adresse mémoire à cibler
- 20545 et 2000 pour les valeurs à écrire respectivement dans ces adresses consécutives
- xxx pour la valeur du Checksum qu'il te faudra calculer
0
InfectedFuture
15 mai 2013 à 10:13
Salut Jack,
Un grand merci pour ta réponse très détaillée ça m'a énormément aidé à cerner ce protocole.
Maintenant la dernière question (je pense) que je me pose est : comment choisit on l'adresse mémoire à cibler ? Est-ce aléatoire, peut-on écrire toujours à la même adresse ou faut-il incrémenter d'un certain nombre (16 ou 32 peut-être sachant que la trame fait cette taille)
Merci beaucoup en tout cas :)
0
Rejoignez-nous