0
votes

Convertir deux valeurs brutes au numéro de point flottant IEEE 32 bits

J'essaie de décoder certaines données d'un requin 100 compteur d'alimentation via TCP Modbus. J'ai franchi avec succès les registres dont j'ai besoin et je suis laissé avec deux valeurs brutes des registres comme: xxx

du manuel, je sais que je dois convertir ces deux nombres en Un numéro de point flottant de 32bits IEEE. Je sais aussi du manuel que "le registre inférieur est le La moitié de commande élevée (c.-à-d. contient l'exposant). "Le premier numéro de la liste ci-dessus est le registre d'adressé inférieur.

Utilisation de Python (toute bibliothèque fera si nécessaire), comment irai-je les emporter deux valeurs et les faire en une valeur de point flottante IEEE 32 bits.

J'ai essayé d'utiliser divers convertisseurs en ligne et des calculatrices pour comprendre un moyen non programmatique de le faire, cependant, tout ce que j'ai essayé obtient Moi un résultat qui est hors limites (je lisons des volts dans ce cas, le résultat final devrait donc être d'environ 120-122 des valeurs fournies ci-dessus).


2 commentaires

Pymodbus a intégré dans des décodeurs de charge utile. Reportez-vous des exemples ici. Github.com/ripttidio/pymodbus/blob/master/examples/ commun / ...


J'ai posté une réponse basée sur le commentaire de @ Sanju, en utilisant pymodbus.payload.binarypayloaddecoder .


3 Réponses :


1
votes

Le code suivant fonctionne: xxx

il donne xxx

adapté de Convertir HEX en float et Entier à la conversion hexadécimale à Python


2 commentaires

C'est le billet! Merci à un million et merci de contribuer publiquement, de sorte que d'autres peuvent avoir la réponse.


Je crois que cela devrait être structure.unpack ('! F', bytes.fromhex ('{0: 04x}'. Format (a) + '{0: 04x}'. Format (B))) . Par exemple, si A = 17138 et B = 0, '{0: 02x}'. Format (B) retournerait '00' au lieu de '0000' et vous obtiendriez struct. Erreur: Débattre nécessite un tampon de 4 octets



1
votes

Mise à jour pour Python 3.6+ (F-Strings).

Je ne suis pas sûr de savoir pourquoi la réponse de remplir @ B.Go était uniquement 2 . De plus, étant donné que l'ordre d'octete était Big-Endian, je l'ai impayé en tant que tel. xxx

sortie: 121.45304107666016


0 commentaires

0
votes

J'ai lu dans les commentaires et @sanju avait posté ce lien: https://github.com/ripttidio/pymodbus/blob/master/examples/common/modbus_payload.py

pour toute personne utilisant pymodbus , le binairepayloaddecoder est utile car il est intégré. Il est très facile de passer un résultat .registers , comme indiqué dans l'exemple. En outre, il dispose d'un de journalisation intégré, vous pouvez donc vous aider à déboguer pourquoi une conversion ne fonctionne pas (ex: mauvaise endannicité).

En tant que tel, j'ai fait un exemple de travail pour Cette question (en utilisant pymodbus == 2.3.0 ): xxx

sortie: 121.45304107666016


0 commentaires