Comparaison WORD_TO_REAL Control Expert

Forum traitant des automates industriels de marque Schneider - Telemecanique
Répondre
zeze
Asservi son premier moteur
Asservi son premier moteur
Messages : 30
Enregistré le : 01 août 2022, 16:47

Comparaison WORD_TO_REAL Control Expert

Message 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 :D
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7805
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Comparaison WORD_TO_REAL Control Expert

Message 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 ??
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
Bruce33
Dieu du process
Dieu du process
Messages : 930
Enregistré le : 28 oct. 2015, 06:54
Localisation : Pas-de-Calais

Re: Comparaison WORD_TO_REAL Control Expert

Message 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 :

Code : Tout sélectionner

NIV_OK := NIV_CUVE < INT_TO_REAL(HMI_SEUIL_NIV_CUVE_OK);
Si HMI_SEUIL_NIV_CUVE_OK est bien un niveau maxi à ne pas dépasser...
zeze
Asservi son premier moteur
Asservi son premier moteur
Messages : 30
Enregistré le : 01 août 2022, 16:47

Re: Comparaison WORD_TO_REAL Control Expert

Message 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 :

Code : Tout sélectionner

NIV_OK := NIV_CUVE < INT_TO_REAL(HMI_SEUIL_NIV_CUVE_OK);
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.
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7805
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Comparaison WORD_TO_REAL Control Expert

Message 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
Automaticien privé (de tout)
itasoft@free.fr
Répondre