Modbus TCP : Gestion valeur négative

Bonjour,
Je n’ai aucune idée de comment gérer les valeurs négatives. Sachant que les valeurs sont aussi bien positives que négative.
Les valeurs négatives débutent à 65535.
Merci de votre aide.

Bonjour @Vins ,

Pour rendre ta valeur exploitable, j’imagine qu’il faut faire une fonction de transfert (objet Fonction).

Le manuel de l’appareil qui te fourni les données via ModBus devrait te donner la correspondance des valeurs ?

Bonjour,
Merci pour l’aide.
Donc si je comprends bien :
valeur modbus–>fonction(decimale, X/10)–>fonction(soustraction, X-6553,5).
Mais comment cela se passe-t-il pour les valeurs positives? Comment afficher valeur negative et valeur positive sur un même chiffre?

Je suis pas sûr de comprendre la problématique.
Pourriez vous décrire plus précisément les valeur reçu en ModBus ? Est-ce des pourcentage, des températures, … ?

De ce que j’en comprend actuellement :
Lorsque la valeur reçu est inférieur à 65635, la valeur est positive et elle est 10 x supérieur.

Lorsque la valeur est supérieur à 65635, la valeur est négative et elle est 10 x supérieur.

Par exemple :
Valeur reçu : 770, valeur réel : 77,0
Valeur reçu : 65735, valeur réel : -100

C’est bien ça ?

Bonjour,
Merci pour votre aide.
Alors non, pas du tout.
Je vais essayer d’être plus clair.
La valeur est des watt.
La valeur, je vais l’appeler Y.
Les valeurs positive commence à 0
Les valeurs négative commencent à 32768
Exemple 1 :
retour modbus : Y= 2500–>Y(fonction X/10)= 250w
Exemple 2 :
Retour modbus : Y=30768–>Y(fonction X/10)–>je ne sais pas (3076,8-3276,8)= -200w.

Les 2 chiffres font partie de la même donnée. Donc elle varie de +3276,8 à-3276,8 par exemple.

Les explications sont ils plus explicites ?
J’avais fait une erreur. J’ai modifié l’exemple.
Merci de votre aide.

Désolé,
J’avais fait plusieurs erreurs.
J’ai modifié les exemples.

Bonjour,
Avez-vous une doc modbus de votre appareil avec la table des registres ?
Je suis étonné que vous soyez obligé d’appliquer des formules différentes sur une même adresse.

Généralement vous avez une plage et il faut la connaitre en totalité.

Et se termine à combien?

1 « J'aime »

Oui, j’ai le fichier des registres.
Voici :
https://www.victronenergy.com/upload/documents/CCGX-Modbus-TCP-register-list-3.10.xlsx
C’est le registre 841, c’est des ampères.
Merci de votre aide

J’imagine que l’on peut faire une conversion fonctionnelle a base d’objet comparateur, preset et fonction.

Mais je suis étonné de la donnée que vous recevez. Etes vous bien sûr des exemple que vous citez ?

ça ok, ça me semble logique

là, j’ai un doute. les valeurs négative ne commencerait-elle pas à 65535 vers 32767.

Je dis ça dans le cas où me 1er bit de la valeur est utilisé pour signé la donnée.
Et si c’est ça, la variable dans laquelle est reçu les données ModBus est-elle bien paramétré ?

J’aurais tendance à vouloir la mettre en REAL avec une précision d’1 décimale.
Capture d’écran 2023-12-04 à 02.20.39

Je ne suis pas spécialement calé sur ces sujets… je vous propose juste des piste de reflexion :wink:

1 « J'aime »

Bonjour,
Merci de votre aide.
Oui je suis sur concernant les valeurs.
De plus si vous regardez votre screen, vous avez la réponse à votre question.
Étant donné que c’est des anal 16 alors les valeurs sont comprises entre -32768 et +32767.
Je passe par la fonction de X pour être cohérent dans les données.
Étant donné qu’il y a des erreurs avec les conversions anal.
Pouvez vous préciser votre exemple avec preset?
Merci de votre réponse/aide.

Lorsque vous paramétrer la variable qui reçoit le ModBus en RAW, qu’elle est la valeur exemple pour une valeur négative ?

Alors j’ai paramètres en RAW.
Cependant la plage est 0 à 65535.
Donc dans la logique,
En positif 0,1,2,3,4 etc…
En négatif 65535, 65534, 65334, 65533, etc…
Mais la doc modbus donne bien init16 donc 32765.
Mais moi, c’est Comment faire pour avoir une même valeur positive ou négative sur un même affichage ?
Dans un autre système, j’ai un scénario qui me le transforme au besoin.
Là, je n’ai aucune idée !!!
Hormis ce sujet, j’ai d’autres scénarios qui ne fonctionnent pas alors que c’est trop simple !! J’ai du mal à comprendre son mode de fonctionnement. !!
Merci de votre aide.

Bonsoir, Normalement c’est comme ça! C’est le bit de poids fort qui donne le signe.
Je n’ai pas de lecture négative pour vérifier mais j’avais posé la question à @Jweb et il me semble qu’il avait répondu que c’est l’IPX qui devait gérer.
A confirmer s’il passe par là!

1 « J'aime »

La doc ModBus indique que la valeur est int16. donc 16bits.
de même dans l’IPX, on a le choix entre des variable de 8, 16 ou 32bits.

Lorsqu’on a 16 bits, la variable peut prendre 65 536 valeurs différente.

de base, les valeurs vont de 0 (tous les bits à 0) à 65535 (tous les bits à 1).
Mais dans ce cas, impossible de gérer des valeurs négative. Rien dans le mot binaire n’indiquant le signe.

Si on veut transmettre des valeurs négative, il faut réserver 1 bits pour le signe. Du coup, seul 15 bits reste disponible pour transmettre la valeur.
Avec 15 bits, le nombre de possibilité se réduit à 32 768.
Mais dans ce cas, étant donnée que 1 bit transmet le signe, la valeur -32767 peut également est codé.
Donc, dans le cas d’un mot binaire sur 16bits signé, les valeurs vont de -32768 à +32767.

Reste un problème : il existe au moins 2 manières de signé une valeur binaire > « complément à 1 » et « complément à 2 ».
exemple avec un mot de 8bits (1 octet) : (source)
Capture d’écran 2023-12-04 à 19.45.45

Dans votre cas, je ne sais pas comment est représenté les valeurs négatives dans le mot sur 16bits récupéré par le ModBus.
On peut le déduire en mettant votre variable ana16 en RAW et étudier les valeur négative reçu.

De même, je ne sais pas quel est la méthode utilisé par l’IPX pour les nombre négatif.

Quoi qu’il en soit, il semblerait que les 2 méthode ne soit pas compatible puisque vous n’avez pas de valeur négative reçu par ModBus.

Merci de me corriger si je fait erreur… de nouveau, je ne suis pas spécialiste.

1 « J'aime »

Merci @patam .

j’avais vu votre post qui semblait dire que l’IPX utilise le complément à 2.
Voilà pourquoi je suis étonné que @Vins ai besoin d’une formule de conversion puisque ce qu’il décrit correspond au complément à 2.

Je suis étonné aussi. Les formules à appliquer sont normalement pour afficher la décimale ou plus particulièrement les index de compteur qui peuvent s’afficher sur plusieurs adresses.

Bonsoir,
Merci pour vos réponses.
Alors je pense que je me suis trompé !!
Je vous expliquerai cela en détail demain.
Mais j’ai malgré tout une conversion de valeur à faire.
Merci

Sinon, pour le plaisir du jeu, j’ai fait une fonction qui semble fonctionnel pour ton cas.

1- La valeur Modbus (ana16 - RAW) rentre dans un objet comparateur pour savoir sur la valeur modus est censé être positive ou négative.
Entrée A = valeur ModBus
Entrée B = 32768
Comparateur A < B :

  • Si la valeur ModBus est inférieur à 32768, la sortie est à 1.
  • Si la valeur ModBus est supérieur à 32768, la sortie est à 0.

2- La sortie du comparateur entre dans une variable IO en sélectionnant « NOT » sur le lien pour inversé la valeur.

  • Si la valeur ModBus est supérieur à 32768, la variable IO est à 1. Sinon, elle est à 0.

3- La valeur ModBus entre également dans un objet Fonction en entrée « X ».
Fonction de transfert :
[Sortie Comparateur] * X/10 + ( [Variable IO] * (X - 65535)/10)

4- La valeur de sortie de l’Objet Fonction est votre valeur Modbus en watt comprise entre -3276,8 et +3276,7

Chez moi, ça a l’air fonctionnel.
Je sais pas si mes explication son claire, dite moi…

Plein d’info sur les Objet et les Liens sur le Wiki fait par @fgtoul

3 « J'aime »

Bonjour,
Pour debuter, chez moi, j’utilise jeedom et IPX800V4. Le modbus pour la communication de mon materiel d’energie electrique…
Je récupere les données modbus dans jeedom. Dans IPX800V4, j’ai que quelques scenarios. tout est declenché dans jeedom. Donc je me base sur les données et connaissances du modbus dans jeedom.

Concernant l’IPX800V5, Je dois mettre en place un systeme de gestion d’energie electrique pour un site isolé sans maintenance!!! car il n’ont pas les compétences informatiques.
Le materiel est le meme chez moi et chez eux.

Voici la base ;


Etant donné qu’il n’y a pas de stockage externe et internet limité. Je dois fais avec ce qu’il y a dans l’IP800v5

Maintenant, Concernant les données négatives,
Ce sont les watt et les ampères tiré ou stocké dans la batterie. c’est pas la bonne période pour faire du tirage sur la batterie.!!
Moi dans jeedom, j’ai un scenario avec comme valeurs « 65536 ».
Mais suivant la doc, les valeurs doivent débuter à « 32768 ».

Dans la logique IPX800v5 devrait transformer les valeurs negatives modbus en valeurs avec le signe, non?

@GwenLR
Merci pour votre exemple.
Je regarde dans la journée.
Ou avez-vous trouvé les informations pourvant etre inclus dans les formules?

Merci beaucoup de votre aide.

bonjour,

voici un peu de lecture :slight_smile: : Utilisation des variables — GCE Electronics (gce-electronics.com)