Bonjour messieurs,
@Kevin_GCE, @gce, @Jeremy_GCE
Je travaille sur une lecture Modbus avec un PZEM‑017. Ce module renvoie les valeurs 32 bits avec les registres dans l’ordre inversé, c’est‑à‑dire LSW (registre bas) avant MSW (registre haut). En lisant ces deux registres via une ANA32, on s’attend logiquement à pouvoir utiliser une fonction de type swap word pour remettre les mots de 16 bits dans le bon ordre.
La fonction de l’IPX nommée “32 bits little endian byte swap” semble être celle qui devrait correspondre, mais son comportement ne correspond pas à un swap word standard.
Exemple de test
Pour vérifier, j’ai utilisé la valeur décimale 12 345 678, soit 0x00BC614E en hexadécimal.
Le swap word manuel donne :
- Résultat attendu : 0x614E00BC
- Valeur décimale attendue : 1 632 501 948
L’IPX renvoie :
- 0x614E00C0
- soit 1 632 501 888
Il manque 60 (0x3C), ce qui montre que le dernier octet est modifié. Cela ressemble fortement à un bug dans la fonction de conversion.
Remarque sur le nom de la fonction
L’intitulé “byte swap” est trompeur :
- un byte swap standard inverse les octets à l’intérieur d’un mot 16 bits,
- alors que le résultat obtenu ressemble plutôt à un word swap,
- mais avec une altération du dernier octet.
Pouvez-vous me dire si ce comportement est déjà connu, ou si quelque chose m’échappe ?
Contournement actuel
En attendant, je lis les deux registres séparément en 16 bits et je reconstruis la valeur 32 bits avec un objet fonction :
Code
(registre_haut * 65536) + registre_bas
Merci d’avance.