|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 5 ![]() |
Bonjour,
tout d'abord je vais exposer l'environement du problème . Je suis actuellement sur un projet de communication entre station météo/écran tactile (dans le cadre d'un stage de fin d'étude). Je dois créer/modifier un programme C++ basé au sein de la station météo afin d'y appliquer le protocol MODBUS (ASCII ou RTU). Il s'agit simplement de la localisation et du stockage des données à envoyer, puis de les transcrire sous MODBUS afin de les envoyer par le port COM. L'écran tactile reçoit alors les données qu'il affiche de fort belle manière. Jusque là tout va bien dans le meilleur des mondes . Là ou il y a un hic (il y a toujours un hic), c'est que je ne parviens pas à modifier une quelconque valeur au coeur de l'écran tactil. Ecran tactil : fabricant : KEP type : MMI430 Protocol: Toutes sortes de protocol Constructeur mais aussi des plus ouvert tel que MODBUS (modicon) [ protocol préconfiguré uniquement ] L'écran tactil n'est qu'un module de lecture (donc aucun envoie de donnée, il réceptionne et affiche uniquement) Il fonctionne sur le principe d'un registre ( modifiable sinon je vois pas l'intérêt) de format LB0000 à LB9000, LW0000 ... Où LB et autres sont des registres et 0000 la valeur de la case mémoire. Outre la possibilité (plus que présente) que mon programme ne soit pas au top (2 ans de C seulement), j'ai bien évidement essayer de faire varier les valeurs dans le registre à partir de logiciel tel que MODSCAN mais rien n'y fait. Je ne comprend pas comment accéder au registre, y appliquer la valeur. L'ennuie est qu'il existe peu de documentation sur le sujet et celle existante ne sont visiblement pas adaptée à mon petit cerveau . Je crée une trame ASCII (protocolée MODBUS ) : je place dans le buffer une structure à l'image du protocol MODBUS -> transactionID ProtocolID Length unitID function ReferenceNB [ j'y place le registre auquel je souhaite accéder ] data [ la valeur que je veux y rentrer ] Le tout soigneusement remplie. J'envoie le tout sous la fonction WRITECOIL (5) par le port série ( partie du programme qui marche parfaitement). Mais nada même pas un clignement de cil du vilain écran... J'ai bien aussi penser à sniffer le portCOM mais c'est pas très clair ce qu'il en résulte. Plz Aidez-moi |
|
|
00
|
|
|
#2 |
|
Membre habitué
![]() Inscription : septembre 2004 Messages : 138 ![]() |
Je ne connais pas ton ecran ni ton logiciel de com mais
comment configure tu ton ecran pour le protocole modbus ? No esclave / vitesse/ format etc ... Sinon en modbus si tes deux equipement communique de maniere Hard et que le No d'esclave dans ta trame est bon, l'esclave doit repondre un code erreur qui est assez explicite . Bon courage . |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 5 ![]() |
Tout d'abord merci de prêter attention à mon problème,
ensuite pour la configuration : 9600 bauds sur 8 bits pas de parité pas de controle de flux 1 bit de stop Il est de même pour ma configuration du port COM. Tout cela n'est configurable (pour l'écran) qu'à partir d'un menu de leur logiciel (easy builder ) Après pour le système d'esclave, je n'ai pas bien compris le fonctionement . J'ai ouïe dire que MODBUS fonctionne sur un système esclave/maître sans pour autant y prêter attention . Il est bien attribué un N° au pupitre tactile ( en standard : 1 ) mais cela est par défaut. Sinon, quels est la forme d'une trame MODBUS RTU ? --> N° code fonction donnée CRC Le problème c'est que des programmes tout fait me renvoie un charmant "no answer" lorsque je tente de communiquer [ logiquement leur trame sont bonnes ]... (cf ModBus Master Request pro ) Je pense que cela provient de la façon dont j'ai associé l'affichage numérique avec son registre. Malheureusement je mange leur doc de long en large mais ne trouve pas la solution clairement explicité |
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Inscription : septembre 2004 Messages : 138 ![]() |
Voici la composition d'une trame Modbus RTU .
Envoyée par le maitre vers l'esclave Pour une lecture Fonction 3 ou 4 No Esclave (1octet) Code Fonction (1octet) Adresse du 1er mots a lire (2 octets) Nombre de mots à lire (2 octets) CRC16 Pour une ecriture fonction 16 Code Fonction (1octet) Adresse du 1er mots a ecrire (2 octets) Nombre de mots à ecrire (2 octets) Nombre d'octets à ecrire (1 octet) ..................................mots à ecrire .................................. CRC16 Bon Courage
|
|
|
00
|
|
|
#5 | |
|
Membre régulier
![]() Inscription : novembre 2007 Messages : 81 ![]() |
Hello,
Citation:
Une chose à fixer, déjà: qui est le maître, qui est l'esclave ? |
|
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 5 ![]() |
Salut,
donc , eu, ah oui... Pour la question de maître-esclave la station météo sera maître et le pupitre tactile esclave (il ne sert que d'afficheur donc bon). Dans les options du tactile (logiciel easybuilder) je peux lui assigner un N° d'esclave comme le laisser à 0 (c'est à dire aucun esclavagisme). J'ai mis à 0 car l'écran tactile est le seul connecté à la station. Ensuite après moult problèmes, je suis parvenue à mes fins excepté pour la communication... Je ne comprends pas ou plutôt n'arrive pas à dialoguer avec ce vil écran . N°esclave / code fonction (poids F/f) / Valeurs (poids F/f) / CRC 0x00 0x00 0x05 0x00 0x01 0xcrc Bien entendu le calcul du CRC me pose problème ... ![]() Sur le papier, c'est pourtant simple, un bête envoie par RS232 de la trame MODBUS RTU que notre cher MMI430 interprète. De plus le service KepFrance ne répond pas clairement à ma demande : Une trame MODBUS RTU qui me permet d'assigner une valeurs à un registre du MMI. (ça me servirai de trame étalon pour finaliser ce projet) Question : les registres comportes des noms tel que LW / 4x /... Comment identifier le registre alors que je ne peux envoyer que de l'hexadécimal ? Peut être un système de 4x = 40000 donc la case mémoire que je veux allouer, admettons 100 deviendrai alors 40100 ? Mais dans ce cas à quoi correspond LW ? Si seulement une seul de mes trames pouvez renvoyer un message d'erreur... ça signifierai que je suis sur la bonne voie En tout cas merci de vos attentions |
|
|
00
|
|
|
#7 | ||||
|
Membre régulier
![]() Inscription : novembre 2007 Messages : 81 ![]() |
Hello,
Citation:
Citation:
1 - es-tu _sûr_ que l'écran fonctionne en tant qu'esclave ? 2 - sur MODBUS, l'adresse 0 est l'adresse de diffusion générale, il vaut mieux affecter une adresse précise à un équipement (1, par exemple), en plus, si des fois tu devais ajouter un autre esclave MODBUS... tu lui mettras l'adresse 2, etc. Citation:
2 - Au fait, c'est une liaison série RS232 ou RS485 ? RS485, c'est cool, parce qu'on peut facilement regarder ce qui passe sur la liaison (un PC avec un convertisseur RS232/RS485 branché en parallèle de l'équipement, et un logiciel de capture de trames, on en trouve des gratos => google, j'en ai un tout con que je peux te filer) Citation:
au niveau de la trame, le registre aura une adresse comprise entre 0x0000 et 0xFFFE, et c'est bien ça que tu dois envoyer à l'équipement; au niveau "modèle de données", les variables MODBUS sont identifiées par leur plage d'adresse, dans la forme 40001 + i, avec i=offset dans la plage 4xxxx. Dans cette forme d'adressage, les données sont rangées dans une table dont les éléments sont rangés à partir de l'adresse 1 (d'où le 40001...) Si c'est pas clair, lis les spécifications du protocole librement accessible sur http://www.modbus.org, section Technical specifications, en PDF. En particulier les chapitres 4.3 et suivants. En simplifié, dans cette forme d'adressage, on distingue: - les bits de sortie (coils), dans la plage 0xxxx, accessible en lecture/écriture; - les bits d'entrées (inputs), dans la plage 1xxxx, accessible en lecture seule; - les registres d'entrée (input registers), dans la plage 3xxxx, accessible en lecture seule; - les registres de sortie (holding registers), dans la plage 4xxxx, accessible en lecture/écriture. Pour les plages d'adresse des bits d'entrée ou de sortie, c'est peut-être l'inverse, je me rappelle plus... A noter que, selon l'implémentation du protocole MODBUS, ces plages peuvent se recouvrir ou être effectivement distinctes. Par exemple, un API Twido propose des bits internes et des mots internes accessibles aussi bien en lecture qu'en écriture, une requète 'lecture de 10 bits d'entrée à partir de l'adresse 20' renverra les mêmes bits que la requète 'lecture de 10 bits de sortie à partir de l'adresse 20'. <edit: parlé trop vite, je me suis gouré> Le lien entre les deux adresses: Côté afficheur, le registre auquel tu veux accéder est à l'adresse 40100 (0x9CA4) => dans la trame, l'adresse du registre sera 99 (0x0063). </edit heureusement que je me relis...> En espérant avoir été clair et utile... Bon courage |
||||
|
|
00
|
|
|
#8 |
|
Membre régulier
![]() Inscription : novembre 2007 Messages : 81 ![]() |
Hello,
matieu83: pourrais-tu poster un screenshot du paramétrage de communication de l'afficheur (boîte de dialogue Edit > System Parameters... onglet PLC, d'après la doc) ? Je crois que ça aiderait. |
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 5 ![]() |
Merci énormément de ton aide !
j'y vois déjà plus clair par rapport à l'adressage et à la construction de cette liaison. Après plusieurs lecture de la doc constructeur (oui je suis certainement lent à comprendre Comme tu l'as dit, je vais plutôt me baser sur un système MAITRE(afficheur) -> Esclave (API) . L'afficheur tactile va donc interroger l'API . Pour le moment, le PC me sert de "simulateur" de PLC (je ne peux transférer directement les données sur la station météo pour tester en temps réel ). En espérant que se servir du PC comme "faux" API marche ( peut concluant jusqu'à présent vu que je n'arrive pas à communiquer ). Donc pour résumer j'établis le pupitre tactile comme MAITRE . Il interroge les registres du PLC et les affiche. Ma question se retourne de l'autre coté alors . Si c'est l'écran tactile qui interroge la mémoire de l'API, je dois intégrer au sein de l'API le protocol MODBUS afin qu'il puisse réponde aux requêtes envoyées par l'écran (jusque là tout va bien) . Ce qui signifie que auparavant, l'écran tactile a formulé des requêtes de lecture... donc une communication... donc un grands pas en avant ^^ ! Je m'interroge alors sur la partie programmation de l'API. C'est du C++ . Comment dois-je faire pour créer les registres qui correspondent à l'écran tactile ? De simples tableaux nommés 4xxxx ? ( ça serai trop beau ) De plus, l'idée de mettre en esclave le programme qui commandera l'api me turlupine... comment lui assigner un N° et lui "dire" qu'il doit obéir à l'écran ? Pour la communication, c'est du RS232 . J'utilise soit le câble constructeur (câble série double non parallèle : une sortie PC->HMI qui sert essentiellement à la programmation à partir d'easybuilder et l'autre partie HMI->PLC qui sert à la com) soit un câble série croisé . Et pour la trame elles ont cette forme : Le buffer contient : 0 5 0 1 0 1 46 7a Je place cela dans le buffer en hexadécimal que j'envoie par liaison RS232. (j'ai volontairement séparé les nombres, ce qui n'est pas le cas dans le programme). Le CRC est inversé . En tout cas merci de m'aider ! |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 5 ![]() |
j'ai placé en pièce jointe un screenshot de la partie configuration du logiciel
|
|
|
00
|
|
|
#11 | ||
|
Membre régulier
![]() Inscription : novembre 2007 Messages : 81 ![]() |
Citation:
- sur réception d'une requète, vérifier celle-ci (calcul de CRC bien sur, et vérif du numéro d'esclave, des adresses demandées); - traiter la requète (si l'afficheur ne demande qu'à lire des registres, il s'agira juste de lui renvoyer les valeurs demandées, fais au plus simple); - former un message de réponse et l'envoyer sur la liaison série. Citation:
0: adresse esclave (diffusion générale ici); 5: code fonction "écrire 1 bit de sortie"; 0 1: adresse 0x0001 (soit le deuxième bit de la table des sorties TOR); 0 1: valeur 0x0001 (dans le cas d'écriture de _bit_, ça marchera pas, c'est soit 0x0000 pour mettre le bit à 0, soit 0xFF00 pour le mettre à 1); 46 7A: le CRC (en calculant de mon côté avec les valeurs précédentes, je ne trouve pas ça, mais 0x5C 0x1B, dans l'ordre poids faible puis poids fort). Au fait, même si l'afficheur est esclave, il ne répondra rien aux requètes de diffusion générale (ce qui est normal, dans le cas où on a plein d'esclaves, ils ne vont pas tous causer en même temps, et c'est spécifié dans le protocole) Un exemple de trame avec un CRC correct (pris dans la doc d'un Altivar): lecture de 4 registres d'entrée à partir de l'adresse 3102 dans l'esclave 2: requète maître: 02 03 0C 1E 00 04 27 6C 02: esclave 03: code fonction 0C 1E adresse début poids fort puis poids faible 00 04 nombre de valeurs 27 6C CRC16 poids faible puis poids fort Un exemple de réponse que ton appli devra balancer à l'afficheur, si celui-ci émet la requète ci-dessus: 02 03 08 00 28 02 58 01 F4 00 00 52 B0 02 adresse esclave 03 code fonction 08 nombre d'octets de données (2 x 4 ici !) 00 28 valeur1 poids fort puis poids faible 02 58 valeur2 01 F4 valeur3 00 00 valeur4 52 B0 CRC16 poids faible puis poids fort Merci pour les screenshots, mais en fait ça ne me parle pas trop, j'ai essayé de télécharger Easybuilder sans succès, j'ai que la doc en PDF en anglais... Juste un détail: la station météo, c'est un PC, un automate industriel, ou un équipement spécifique (genre à base de microcontrôleur / matos propriétaire) ? |
||
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 1 ![]() |
j'ai le même problème!
as tu trouver comment faire?, mon PC voit bien la trame venant du MMI-430, mai s le MMI-430 ne voit pas ou ne comprend pas la réponse que je lui fait. |
|
|
00
|
|
|
#13 |
|
Membre régulier
![]() Inscription : novembre 2007 Messages : 81 ![]() |
Hello,
comme pour matieu83, poste donc la trame de réponse que tu envoies (et aussi la requète du MMI430, qu'on puisse tout vérifier Peut-être dans un autre fil de discussion, on y verra plus clair... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com