IPXV5 et MODBUS

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

  1. 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.

  2. 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)


Tension de 235.7 Volts

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.

1 « J'aime »

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 :
image

1 « J'aime »

Merci beaucoup Jweb,
Oui en fait cela devrait être Octetx4 mais c’est Octetx3


Le problème c’est que l’IPX lit effectivement Octetx3


4416967->4365C7 → (les 3 premiers octets mais il manque le quatrième donc le resultat n’est pas valable)

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(«  »)

EXTRACTION DES 4 BYTES ET RANGEMENT DANS INT32

data_bytes = np.array([messageMODBUS[6],messageMODBUS[5], messageMODBUS[4], messageGlobal[3]], dtype=np.uint8)

CONVERSION EN FLOAT

data_as_float = data_bytes.view(dtype=np.float32)
print(data_as_float)
"
RESULTAT
0x8;0x4;0x4;0x43;0x66;0xaa;0x8d;0x29;0xda;
[230.66621]

Si j’ai bien compris votre question, est-ce cela que vous cherchez

image
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.

1 « J'aime »

N’ayant pas d’appareil modbus, je ne peux pas tester…
Votre démonstration m’a convaincu et j’ouvre donc un ticket pour faire remonter l’incident.

1 « J'aime »

Merci beaucoup Jweb,

Bonsoir @denisB

Le fix au problème que vous avez soulevé se trouve ds la nouvelle release 5.4.1 :wink:

1 « J'aime »

Fantastique,
Merci beaucoup. Je vais quelques essais et poster le résultat.

1 « J'aime »

Résultats:
Le ModBus fonctionne bien en lecture de mots 32 Bits.


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
image

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).

Merci Jweb et GCE!
Une idée pour des développements futurs (s’il n’existe pas déjà) un convertisseur ANA → Float IEEE754

2 « J'aime »

Excellent.

I have an SDM 120M you can help me.

Best regards.

Hello Araujo and welcome to this forum,
Do you have a datatsheet with the ModBus commands?

Can we go on in french, so that all the others members can follow?

Have a nice day

hello Grocrabe,

My english is bad, my french is to worse.

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)!

the other counter is SDM120M (atachment)
SDM120-MODBUS_Protocol (1).pdf (232,8 Ko)
SDM120_Series_Manual_ (1).pdf (1,1 Mo)

code.pdf (776,8 Ko)

540295c_cd.pdf (1,3 Mo)

Hello Aroujo,

explain clearly what exactly you want to do.
There are a few ModBus specialists on this forum (one is fluent in english and german :wink:).

Have a nice day

Good morning,

Thanks for your answer.

i need to receveid the information (kWh, A, V and others) about the counters on the ipx800v5.

thank you soo much.

Good morning,

Thanks for your answer.

i need to receveid the information (kWh, A, V and others) about the counters on the ipx800v5.

you can help me please.

thank you soo much

Hello

The answer was wrote on the last post of @denisB
Just translate this message.