Page 1 sur 1
Comparaison WORD_TO_REAL Control Expert
Posté : 21 févr. 2025, 11:39
par zeze
Bonjour à tous,
J'ai une petite question qui me trotte dans la tête depuis ma dernière mise en service concernant un soucis que j'ai eut sur control expert.
J'ai fait un bout de code comme suit :
Code : Tout sélectionner
VAR
NIV_CUVE : REAL; (*NIVEAU DANS LA CUVE*)
HMI_SEUIL_NIV_CUVE_OK : WORD; (*SEUIL NIVEAU OK DANS LA CUVE*)
NIV_OK : BOOL; (*NIVEAU OK DANS LA CUVE*)
END_VAR
IF NIV_CUVE < WORD_TO_REAL(HMI_SEUIL_NIV_CUVE_OK) THEN
NIV_OK := TRUE;
ELSE
NIV_OK := FALSE;
END_IF;
A ce moment la de la mise en service, le niveau dans la cuve été à 60% et le seuil de niveau OK était à 90%.
Hors, la variable NIV_OK été toujours en FALSE.
Après quelques temps, je me suis rendu compte que c'était la conversion WORD_TO_REAL qui empechait de valider cette condition.
J'ai donc passer ma variable HMI_SEUIL_NIV_CUVE_OK en REAL et la plus aucun soucis.
Est-ce que quelqu'un de plus expert que moi sur Control Expert/Unity saurait m'expliquer pourquoi le programme réagit de cette manière?
Merci d'avance pour vos réponses

Re: Comparaison WORD_TO_REAL Control Expert
Posté : 21 févr. 2025, 12:53
par itasoft
ça met les poids faible à zéro, ceci dit quelle idée de ne pas mettre HMI_SEUIL_NIV_CUVE_OK dans le même type
------------
simple curiosité: pourquoi NIV_CUVE est un REAL et pas un entier ??
Re: Comparaison WORD_TO_REAL Control Expert
Posté : 21 févr. 2025, 13:47
par Bruce33
Bonjour,
Votre variable HMI_SEUIL_NIV_CUVE_OK provient d'un afficheur : il faut d'abord savoir quel est son type dans l'afficheur.
Dans Control Expert les types BYTE, WORD et DWORD sont des "chaines de bits". C'est-à-dire qu'il ne sont pas interprétés comme des valeurs numériques.
La conversion WORD_TO_REAL transfère les bits de la variable WORD dans le mot de poids faible de la variable REAL. Or dans un REAL les bits ont un rôle précis : signe, exposant, mantisse. Et comme le type WORD contient 16 bits alors que le type REAL contient 32 bits, vous obtiendrez de toute façon n'importe quoi.
Si HMI_SEUIL_NIV_CUVE_OK est une valeur entière (INT) il suffit d'utiliser la conversion INT_TO_REAL().
Par ailleurs, cela me hérisse le poil (et j'en ai beaucoup) quand je vois ce genre d'écriture :
zeze a écrit : ↑21 févr. 2025, 11:39
IF NIV_CUVE < WORD_TO_REAL(HMI_SEUIL_NIV_CUVE_OK) THEN
NIV_OK := TRUE;
ELSE
NIV_OK := FALSE;
END_IF;
Ecrivez plutôt :
Si HMI_SEUIL_NIV_CUVE_OK est bien un niveau maxi à ne pas dépasser...
Re: Comparaison WORD_TO_REAL Control Expert
Posté : 21 févr. 2025, 19:00
par zeze
itasoft a écrit : ↑21 févr. 2025, 12:53
ça met les poids faible à zéro, ceci dit quelle idée de ne pas mettre HMI_SEUIL_NIV_CUVE_OK dans le même type
------------
simple curiosité: pourquoi
NIV_CUVE est un REAL et pas un entier ??
Car mon client souhaitait avoir la virgule au niveau de mon IHM, et je voulais pas mettre mon seuil en real juste pour écrire une valeur entière comprise entre 0 et 100.
Bruce33 a écrit : ↑21 févr. 2025, 13:47
Bonjour,
Votre variable HMI_SEUIL_NIV_CUVE_OK provient d'un afficheur : il faut d'abord savoir quel est son type dans l'afficheur.
Dans Control Expert les types BYTE, WORD et DWORD sont des "chaines de bits". C'est-à-dire qu'il ne sont pas interprétés comme des valeurs numériques.
La conversion WORD_TO_REAL transfère les bits de la variable WORD dans le mot de poids faible de la variable REAL. Or dans un REAL les bits ont un rôle précis : signe, exposant, mantisse. Et comme le type WORD contient 16 bits alors que le type REAL contient 32 bits, vous obtiendrez de toute façon n'importe quoi.
Si HMI_SEUIL_NIV_CUVE_OK est une valeur entière (INT) il suffit d'utiliser la conversion INT_TO_REAL().
Par ailleurs, cela me hérisse le poil (et j'en ai beaucoup) quand je vois ce genre d'écriture :
zeze a écrit : ↑21 févr. 2025, 11:39
IF NIV_CUVE < WORD_TO_REAL(HMI_SEUIL_NIV_CUVE_OK) THEN
NIV_OK := TRUE;
ELSE
NIV_OK := FALSE;
END_IF;
Ecrivez plutôt :
Si HMI_SEUIL_NIV_CUVE_OK est bien un niveau maxi à ne pas dépasser...
Ok merci pour l'info je me doutais que c'était une histoire de poids fort/poids faible mais je n'arrivais à avoir l'explication exacte.
Pour mon code, il y a d'autre conditions que je vous ai épargné, c'est pour cela que j'ai utilisé une écriture en ELSE.
Re: Comparaison WORD_TO_REAL Control Expert
Posté : 21 févr. 2025, 20:51
par itasoft
Car mon client souhaitait avoir la virgule au niveau de mon IHM, et je voulais pas mettre mon seuil en real juste pour écrire une valeur entière comprise entre 0 et 100.
---------------------
Dans ce cas faire avec un INT de 0 à 10000 et sur le IHM afficher le INT avec 2 chiffres après la virgule