Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/03/2016, à 16:21

BenjiBoy

Python, modbus, et half-duplex

Salut à tous,

Je rencontre une difficulté pour communiquer avec un périphérique en protocol modbus RTU, via une communication serial en half-duplex, donc avec le TX et RX sur la même pin.
Là j'essaie de configurer une sortie en emission, envoyer un chaîne, la switcher en reception, puis lire et afficher la chaîne reçue.

Le périphérique programmé est un raspberry pi, qui lit un régulateur solaire, via une connectique RJ-11.

Je crois comprendre sur la doc constructeur (1, et 2) que pour par exemple lire le voltage solaire il faut envoyer [0x03][03][0x0002] (read holding register - adresse logique - adresse PDU) puis on reçoit une chaîne de caractère sur ce même canal qu'il faut au préalable configurer en réception.

Sur le RasPi j'utilise la librairie pigpio qui permet le bit banging.

Voilà ... Alors toutes ces notions sont très nouvelles pour moi, il est out à fait possible que je n'ai pas tout compris, mais là mon cerveau sature d'information ...
Je coince.

Tcho

Hors ligne

#2 Le 22/03/2016, à 17:13

BenjiBoy

Re : Python, modbus, et half-duplex

Hum ... Est-ce qu'il n'y aurait pas également un problème de tension dans tout ça ?
Des millions de forum que je lis actuellement, j'ai vu deux ou trois fois des problèmes de "niveau" avec le 3,3 VDC des GPIO...
Je reste totalement coincé.
Et vaguement cuit du cerveau, à force.

Hors ligne

#3 Le 22/03/2016, à 17:18

BenjiBoy

Re : Python, modbus, et half-duplex

J'enchaîne mes questions quelqu'un qui tombera sur le topic pourra peut-être y répondre : je lis 7,5 V à la sortie du régulateur solaire sur le port TX/RX, est-ce qu'en reduisant ça avec un pont diviseur j'ai une chance de capter les valeurs emises du périphérique ?

Dernière modification par BenjiBoy (Le 22/03/2016, à 17:19)

Hors ligne

#4 Le 22/03/2016, à 19:35

claudius01

Re : Python, modbus, et half-duplex

Bonjour,

BenjiBoy a écrit :

Je rencontre une difficulté pour communiquer avec un périphérique en protocol modbus RTU, via une communication serial en half-duplex, donc avec le TX et RX sur la même pin.

TX et RX sur la même pin, je ne pense pas (à confirmer / infirmer) et de toute façon coté RPi, les TX et RX sont sur 2 pins séparées (ou alors tu utilises le protocole I²C ce qui n'est pas la même chose - à confirmer / infirmer ;-)

Une communication half-duplex signifie simplement qu'une réponse ne peut arriver qu'à la suite d'une question et en l’occurrence, c'est le maître qui impose le dialogue (cf. Modbus).

BenjiBoy a écrit :

Des millions de forum que je lis actuellement, j'ai vu deux ou trois fois des problèmes de "niveau" avec le 3,3 VDC des GPIO...

Et oui, le niveau électrique en entrée/sortie du RPi est 3.3 Volts ce qui oblige à faire une adaptation du genre Adatation avec Optocoupleur sinon, RPi va mourir ;-). L'avantage des optocoupleurs est de permettre une très grande plage de tension qui est fixée par résistance pour limiter le courant requis...

Hors ligne

#5 Le 23/03/2016, à 09:58

BenjiBoy

Re : Python, modbus, et half-duplex

Hello claudius01, merci pour ton aide,

hélas comme on le voit sur le document (ici) il semblerait que les TX/RX soient sur la même pin, et en fait de ce que j'ai lu il semblerait que ce soit possible (notamment pour le RS485 que je ne connais pas du tout) avec les notions que tu cites de master / slave.
Effectivement le port serie UART du RPi est à 3 pins TX/RX/GND. Mais j'avais vu qu'il était possible de transformer une GPIO en ce qu'on veut via le bit banging (et la librairie python pigpio).

D'ou ma démarche de faire dans l'ordre par exemple de la GPIO 18 une sortie, émettre une requête, la switcher en entrée, recevoir et lire la réponse à la requête.
Mais en effet (j'en ai relus entre temps) le niveau logic sera un problème.

J'attends la réponse du fabriquant quant au niveau logic de son régulateur pour commencer à bricoler un truc !

A pluche

Hors ligne

#6 Le 23/03/2016, à 10:48

claudius01

Re : Python, modbus, et half-duplex

Bonjour,

Tout d'abord, impossible de visiter https://zimbra.univ-grenoble-alpes.fr/s … 610&part=2 car nécessite une authentification ... pas grave car je vois ce dont il s'agit ;-)

Ok pour TX / RX sur la même pin en utilisant une liaison physique type RS485 qui travaille en mode différentiel (cf. LIAISON SERIE MODBUS).

S'agissant du bit banging sur la GPIO 18 (ou autre), je crains que cela occupe à 100% le RPi durant les échanges car il devra sérialiser / désérialiser les 10 bits (1 start + 8 bits + 1 stop) et ce d'autant plus souvent que la vitesse sera importante (9600 bauds, 112000 bauds et plus)...

Je préconiserai dans ce cas de conserver les TX / RX natifs du RPi pour bénéficier de l'UART intégré pilotable par interruption ce qui soulagera d'autant le RPi et en final "dormira" la plupart du temps. Le fait de passer en RS485 le permet pour peu qu'un GPIO soit dédié au sens de la communication pour piloter les drivers RS485 car cette communication se fait en half duplex.

Quant au niveau électrique, aucun soucis avec la solution optocoupleur que te t'ai indiquée précédemment.

A suivre...

NB: Pour une accroche plus grande de ton problème, tu pourrais poster celui-ci sur 2 forum que je pratique également; à savoir:
- abcelectronique - Electronique Analogique et Numérique
- Forum de la communauté francophone de Raspberry PI

Dernière modification par claudius01 (Le 23/03/2016, à 11:14)

Hors ligne

#7 Le 23/03/2016, à 12:53

BenjiBoy

Re : Python, modbus, et half-duplex

claudius01 a écrit :

Tout d'abord, impossible de visiter https://zimbra.univ-grenoble-alpes.fr/s … 610&part=2 car nécessite une authentification ... pas grave car je vois ce dont il s'agit ;-)

Ah mais oui le lien, quel nouille ... Bref.

claudius01 a écrit :

S'agissant du bit banging sur la GPIO 18 (ou autre), je crains que cela occupe à 100% le RPi durant les échanges car il devra sérialiser / désérialiser les 10 bits (1 start + 8 bits + 1 stop) et ce d'autant plus souvent que la vitesse sera importante (9600 bauds, 112000 bauds et plus)...

Oui ça m'avait effleuré l'esprit, mais je n'en avais aucune idée. Et c'est du 9600 bauds.

claudius01 a écrit :

Je préconiserai dans ce cas de conserver les TX / RX natifs du RPi pour bénéficier de l'UART intégré pilotable par interruption ce qui soulagera d'autant le RPi et en final "dormira" la plupart du temps. Le fait de passer en RS485 le permet pour peu qu'un GPIO soit dédié au sens de la communication pour piloter les drivers RS485 car cette communication se fait en half duplex.

Quant au niveau électrique, aucun soucis avec la solution optocoupleur que te t'ai indiquée précédemment.

Du coup ce faisant, je garde un petit élement que le fabricant vend aussi (le MSC MeterBus) qui doit faire le niveau logique et qui transforme la communication en RS232 (half ou full, chais pas). C'est ce qu'on faisait avant et qui marchait bien.
Mais, car il reste un mais, dans cette configuration on utilisait en plus un convertisseur RS232 - USB pour brancher ça à l'USB du RPi, car le port UART GPIO ne dispose que des TX,RX et GND mais pas des CTS, RTS qui semblent nécessaires pour une comm.
On voulait éviter les deux périphériques supplémentaires pour avoir moins de source de panne possible (certaines de nos install' ne sont accessibles qu'en mode cordiste !), pour le coût et la veille techno à faire lors de la disparition d'un produit.

Donc j'ai bien noté tes forums et ton schéma, je vais aller fouiner un peu en attendant la réponse du fabricant qui donnera déjà plus d'info.

A pluche !

Hors ligne

#8 Le 23/03/2016, à 18:45

claudius01

Re : Python, modbus, et half-duplex

Bonsoir,

BenjiBoy a écrit :

...
Donc j'ai bien noté tes forums et ton schéma, je vais aller fouiner un peu en attendant la réponse du fabricant qui donnera déjà plus d'info.

Je t'ai vu passer sur ces 2 forums et j'ai "alimenté" l'un d'eux car plus tourné sur l’électronique...

Petit avertissement, sur celui où j'ai contribué avec des questions / réponses complémentaires, ne te braque surtout pas car ce sont des professionnels / amateurs très avertis qui peuvent faire dévier très vite le sujet (c'est parfois intéressant, mais très souvent épuisant ;-)

De plus, le RPi n'est pas leur tasse de thé car légitimement, je le concède maintenant après moult échanges constructifs, ils ne considèrent pas le RPi comme un Nano-Ordinateur Industriel mais il faut faire avec et je dois dire que coté Électronique, il y a des carrures qui m'ont beaucoup appris et m'en apprennent encore après 20 ans de métier ;-). De plus, certains contributeurs travaillent au quotidien avec le protocole logique et physique ModBus, ce qui devrait leur mettre la puce à l'oreille...

En espérant que cette piste produise un début de solution. Maintenant coté logiciel, l'autre forum est plus adapté comme celui sur lequel je te réponds ici. C'est compliqué la vie mais c'est comme cela...

Si avec tout cela, tu n'arrives pas à entrevoir une solution, je désespérerais mais il faut dire que ton problème Hard / Soft n'est pas courant ni simple mais ô combien intéressant...

Dernière modification par claudius01 (Le 23/03/2016, à 19:36)

Hors ligne

#9 Le 24/03/2016, à 21:35

claudius01

Re : Python, modbus, et half-duplex

Bonsoir,

Certes, mais je crains que le problème ne puisse pas être réduit à la maîtrise d'un langage informatique quel qu'il soit car, sauf erreur erreur de ma part, c'est avant tout un problème d'architecture, après un problème d’électronique et en final un choix du langage informatique qui reste, malgré tout, la composante la plus souple...

Dernière modification par claudius01 (Le 25/03/2016, à 22:26)

Hors ligne

#10 Le 31/03/2016, à 11:11

BenjiBoy

Re : Python, modbus, et half-duplex

Hello,

yep comme dit claudius01, il y a de toute façon un problème d'électronique, hélas, avant celui de language de programmation.
Ceci dit le python reste celui que je vais utiliser, car c'est celui à la mode ...

a+

Hors ligne