Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Automation
Automation Forum d'entraide sur l'automatisme, la robotique et l'informatique industrielle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/05/2008, 14h23   #1
Invité de passage
 
Inscription : mai 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 5
Points : 0
Points : 0
Par défaut Communication TouchScreen, Station meteo et MODBUS

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
matieu83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 16h27   #2
Membre habitué
 
Inscription : septembre 2004
Messages : 138
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 138
Points : 133
Points : 133
Par défaut Protocole Modbus

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 .
sylvain giardini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 09h43   #3
Invité de passage
 
Inscription : mai 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 5
Points : 0
Points : 0
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é
matieu83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 15h58   #4
Membre habitué
 
Inscription : septembre 2004
Messages : 138
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 138
Points : 133
Points : 133
Par défaut Trame Modbus RTU

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
sylvain giardini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 13h49   #5
Membre régulier
 
Homme
Inscription : novembre 2007
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2007
Messages : 81
Points : 99
Points : 99
Hello,

Citation:
Envoyé par matieu83 Voir le message
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 .
En effet, dans un réseau MODBUS, il y a un (et un seul) maître, et un ou plusieurs esclaves.
Une chose à fixer, déjà: qui est le maître, qui est l'esclave ?
Poil_dur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2008, 10h20   #6
Invité de passage
 
Inscription : mai 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 5
Points : 0
Points : 0
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
matieu83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2008, 11h06   #7
Membre régulier
 
Homme
Inscription : novembre 2007
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2007
Messages : 81
Points : 99
Points : 99
Hello,

Citation:
Envoyé par matieu83 Voir le message
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).
Moui, effectivement, on peut faire comme ça. Ca ne gêne pas, même si, dans le cas d'un afficheur relié à un automate, on fait plutôt le contraire (c'est l'afficheur qui demande les variables dont il a besoin à l'API => c'est l'afficheur qui est maître).

Citation:
Envoyé par matieu83 Voir le message
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.
Ca, ça me gêne:
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:
Envoyé par matieu83 Voir le message
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 ...
1 - Peux-tu poster une trame d'exemple ? On pourra vérifier la validité de celle-ci.
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:
Envoyé par matieu83 Voir le message
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 ?
Hahem... en fait, l'adressage d'un registre MODBUS se présente sous deux formes:
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
Poil_dur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 12h38   #8
Membre régulier
 
Homme
Inscription : novembre 2007
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2007
Messages : 81
Points : 99
Points : 99
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.
Poil_dur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h30   #9
Invité de passage
 
Inscription : mai 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 5
Points : 0
Points : 0
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 ), je pense que l'écran tactile se doit d'être le MAITRE afin de gérer les données. Qu'il interroge de lui même plutôt que d'essayer d'y forcer des valeurs .

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 !
matieu83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h36   #10
Invité de passage
 
Inscription : mai 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 5
Points : 0
Points : 0
j'ai placé en pièce jointe un screenshot de la partie configuration du logiciel
Images attachées
Type de fichier : jpg config.JPG (65,6 Ko, 13 affichages)
Type de fichier : jpg adresse.JPG (24,8 Ko, 10 affichages)
matieu83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 23h20   #11
Membre régulier
 
Homme
Inscription : novembre 2007
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2007
Messages : 81
Points : 99
Points : 99
Citation:
Envoyé par matieu83 Voir le message
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 ?
En fait, tu dois implémenter un esclave MODBUS, qui se présentera dans ton code sous la forme d'une table de données (les registres auxquels l'afficheur voudra accéder) et d'un numéro d'esclave, avec les fonctions suivantes:
- 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:
Envoyé par matieu83 Voir le message
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
Si je décompose la requète:
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) ?
Poil_dur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 16h11   #12
Invité de passage
 
Inscription : décembre 2006
Messages : 1
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 1
Points : 1
Points : 1
Par défaut j'ai le meme probleme!

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.
ben123frbis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2008, 09h52   #13
Membre régulier
 
Homme
Inscription : novembre 2007
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2007
Messages : 81
Points : 99
Points : 99
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...
Poil_dur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h59.


 
 
 
 
Partenaires

Hébergement Web