Décodage impossible pour un compteur d'énergie DDS661

Bonjour,

Voilà trois jours que je me débat avec un compteur d’énergie référence DDS661 branché en MODBUS RTU.

L’appareil répond mais pas ce qu’il faudrait.

J’ai fais plusieurs configurations en fonction (04) et (03) avec nombre int et uint 16 et 32 bits. Mais rien de cohérent !

Je lis le premier registre qui doit me donner la tension, soit 238 volts environ.

image

Quand j’interroge les registres avec le logiciel (QModeMaster), j’obtient les valeurs hexa suivantes :

Si je les teste avec un convertisseur Hexadécimal/Décimal suivant Norme IEEE 754 (comme le stipule la doc de l’appareil ci-après) j’obtient des valeurs cohérentes. Donc ça vient bien du plugin. Du moins de sa prog.
DDS661 RS485 English Manual.pdf (153,0 Ko)

Merci pour votre aide, car là, je suis un peu sec !

Bonjour,

… ou de sa configuration…

Un peu de lecture de la documentation va vous orienter vers la solution, je le sens (le lien pointe vers le chapitre précis qui va vous aider mais si vous découvrez la documentation du plugin, lisez attentivement l’ensemble, je me suis donné du mal pour la faire, je pense que sa lecture ne peut être que bénéfique pour les utilisateurs du plugin).

A+
Michel

Bonjour et merci pour l’aide.

J’avais malgré tout bien parcouru la doc. Mais j’était à 100 lieux de penser qu’il faut utiliser « SunSpec SF » ! Du moins c’est ce que je comprends en suivant le lien.

J’ai donc été voir ce que dit cette norme.
J’avoue que pour moi, ça reste abscons ! Quel rapport avec la IEEE 754 ? Est-ce à dire que mon compteur d’énergie est fait pour cette norme, c’est à dire pour des panneaux photovoltaïques ?

J’ai donc essayé :

Voila ce que ça donne :

image

Donc rien qui se rapproche de 238 volts

C’est sans doute lié au fait qu’il faille utiliser l’inversion d’octets et/ou de mots. (Pas lu la suite)

Ha mais si, ça je l’avais fait.
Du coup j’ai essayé à nouveau. Sans succès !
image
image
image
image

Il n’est absolument pas logique (pour ne pas dire impossible) d’avoir le même résultat sans aucune inversion et avec toutes les inversions.
Vous pouvez envoyer les log debug de chaque essai SVP ? Le mieux serait de passer l’équipement en « sur événement » de sauvegarder, de passer le démon en log debug, de redémarrer le démon, de faire l’essai, de lancer un rafraichissement, de modifier la config et de sauvegarder, de relancer un rafraichissement, de modifier la config, …
Et de poster les log debug en texte préformaté.

Avec la version bêta du plugin, il est possible de créer un équipement de test, vous avez essayé ?

D’accord je vais le faire. Mais qu’est-ce que veut dire de passer l’équipement en sur événement ?

C’est ça ?

Capture d'écrans_20250316-181355

Non, je parle du mode de rafraichissement. 3 Options sont possibles dont « sur événement ».

Edit : et pour l’équipement de test, je vous conseille d’en faire un autre (une copie) de désactiver l’équipement « de prod » et de faire les essais

Il y a bien 2 choses à faire :

  1. les log debug sur l’équipement « de prod »
  2. le test avec différentes configurations dans un équipement de test en version bêta

D’après la doc, il ne faut tester que float32 et la fonction 0x03 Read holding registers.

Bonjour,

Voici donc les résultats pour la première partie sur « évènement ».

J’ai gardé les tests aussi pour int et uint pour 16 et 32 bits.

J’ai relancé le démon chaque fois avant de cliquer sur évènement.

image
image
image
image

mymodbus.txt (218,6 Ko)

Génial cette fonction !

Je suis en train de tester. Malheureusement sans grand succès ! Mais je ne désespère pas …

Alors c’est avec le dernier essai :

que tu as une valeur cohérente : 9600 qui me fait pensé à une vitesse de transfert et d’ailleurs :

Je pense qu’avec la fonction 0x03 ça lit le tableau du bas et avec 0x04 ça lit le tableau du haut et donc ce qui t’interesse. Tu peux vérifier cette théorie STP ? Il s’agirait donc de lire avec 0x03 et 0x04 en float32 à l’adresse 0 avec l’inversion sur les mots, pas sur les octets.

EDIT:

        array (
          'id' => '4589',
          'name' => 'Voltage fonction 04 float32',
          'type' => 'info',
          'cmdSlave' => '1',
          'cmdFctModbus' => '3',
          'cmdFormat' => 'f',
          'cmdAddress' => '0',
          'cmdFrequency' => '1',
          'cmdInvertBytes' => '0',
          'cmdInvertWords' => '1',
          'cmdInvertDWords' => '0',
          'repeat' => '0',
        ),

La commande s’appelle fonction 04 mais c’est la fonction 03 (cmdFctModbus) qui est utilisée.

Houla, bien vu !
Je l’avais pourtant remarqué ce « 9600 ».
Mais je m’étais dit que c’était peut être une coïncidence. Pas assez perspicace le gazier !
Pas de pot : dans toutes les configs que j’ai faite j’en ai pas fais une en fonction 03 et float32 et mot inversés !

Alors voilà, tout y est :

image

Congratulations :clap:

En ce qui concerne la fonction test, c’est nickel. Voici le résultat sur 256 registres :

Même si il y a des valeurs avant ou après le registre concerné. Je suppose que c’est dû au décodage en lui même où on voit le signe, l’exposant et la mantisse.

En tout cas merci encore de m’avoir débugger tout ça. Car sinon, c’est sur que j’y serait encore !

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.