Bonjour
J’utilise actuellement le MODBUS et je partage mon expérience (cette fois sur la lecture de registres d’un Wattmètre EASTRON SDM230).
Je rencontre deux problèmes
Je dois lire un registre de 32 bits mais seulement 24 bits (3 octets) sont accessibles. L’Object MODBUS code 32 bits (ANA32) sur « Octetx3 », il y a peut être une erreur.
Ensuite la valeur reçue est selon codée en IEEE 754 8-bit per byte Data Format: 4 bytes (2 registers) per parameter. Floating point format ( to IEEE 754)
Après programmation de l’objet MODBUS et en observant les trames échangées entre l’IPXV5 et le Wattmètre , lorsque j’envoie la demande je m’aperçois que la trame est bien codée
→ 0x8;0x4;0x0;0x0;0x0;0x2;0x71;0x52;
Lecture de deux registres à l’adresse 0
et la réponse adéquate
0x8;0x4;0x4;0x43;0x6b;0xb6;0x1a;0xf1;0x77;
Mot de 32 bits 0x43;0x6b;0xb6;0x1a;
Conversion en Float (avec une appli JAVA)
Néanmoins je voudrais utiliser l’IPX et non des programmes externes.
Pour le codage 32 bits sur 3 octets je pense qu’il s’agit d’une erreur et donc je ne retrouve pas la valeur adéquate dans ma valeur 32bits, une mise à jour pourrait résoudre ce problème. Pour la conversion ANA32 vers Float je pose la question sur le forum au cas ou il y aurait une solution.
Bonsoir @denisB ,
Oui effectivement, il y a une erreur déjà au niveau de l’IHM… cela devrait être « Octet x4 » pour une ANA32, comme c’est le cas « Octet x2 » pour ANA16 et « Octet » pour une ANA8. Je vais le faire remonter.
Et c’est d’ailleurs bien pour cela que vous trouvez la bonne valeur codée sur 4 octets (et non 3)
Si j’ai bien compris votre question, est-ce cela que vous cherchez :
Je peux lire les 4 octets grâce à un programme python qui surveille les échanges MODBUS, extrait les 4 octets, les converti en float et m’affiche les résultats: (ici 4366AA8D ->230.66 V - la tension varie de seconde en seconde)
"
TRAME DE REPONSE MODBUS
for character in messageMODBUS:
print(hex(character), end=‹ ; ›)
print(« »)
Si j’ai bien compris votre question, est-ce cela que vous cherchez
Tout à fait je voudrais afficher la valeur en float directement après l’acquisition MODBUS. C’est important étant donnée que certains périf MODBUS codent les données en FLOAT.
J’en ai profité pour lire plusieurs valeurs sur le Wattmetre Eastron → Volts // Amp // Watts
Le premier registre c’est la tension, quatrième l’intensité, le septième la puissance
Pour la tension la valeur stockée après la demande MODBUS 1130910383 = 436852AF -= 232.32 Volts
Reste la conversion ANA32 vers IEE754
Je n’ai pas trouvé de solution avec l’IPX (si quelqu’un a une idée je suis preneur)
Néanmoins, j’utilise un convertisseur externe que je fait fonctionner sur un PC toujours disponible (serveur HTTP twisted + script python) en passant les paramètres en argument URL /float/?arg1={« Volts »:[$327712$],« Amps »:[$327713$],« Watts »:[$327714$]}
Je fais un push des valeurs 32 bits et reçoit en retour les valeurs en JSON {« Volts »: 234.42, « Amps »: 0.09, « Watts »: 9.88} puis un PARSE pour les récupérer en décimal.
Pour finalement afficher toutes les secondes sur le DASHBOARD
Voilà je suis très satisfait du résultat, l’idée étant à terme d’utiliser ce Wattmètre pour des applications photovoltaïques (piloter un chauffe eau en fonction de la puissance excédentaire en temps réel au lieu de l’injecter sur le réseau par exemple via X010V+Gradateur de puissance).
The counter is Hager SM101C and works as a slave, you have to use the reading code for each variable (attachment) and the reading is in 2 Words (4 bytes)!