Page 1 sur 2

Conversion REAL en 2 entiers

Posté : 28 mars 2019, 12:59
par Nicat
Bonjour,

J'ai une petite question concernant la conversion d'une variable REAL en deux entiers pour la visualisation sur un afficheur

Un exemple : Pour afficher 123456 (décimal) sur l'écran (Soit 1 1110 0010 0100 0000 en binaire), je dois mettre à disposition 2 mots :
-1er : 1 (décimal) soit 1 en binaire...
-2ème : 57920 soit 1110 0010 0100 000 en binaire

Ces 2 entiers sont ensuite assemblés pour former un seul DINT, avec le 1er mot en tant que poids fort


Ma question étant, comment convertir une de mes variables REAL en 2 entiers afin de pouvoir les afficher sur l'écran ?
(J'aimerais bien afficher 312.1 par exemple)
J'avais pensé à convertir en DINT puis à décomposer ce DINT en 2 entiers mais ça ne fonctionne pas comme je veux.

Auriez-vous une petite idée ?


Merci

Re: Conversion REAL en 2 entiers

Posté : 28 mars 2019, 13:20
par philou77
Salut,

Un reel c'est une mantisse et un exposant, cela n'a rien à voir avec les entiers, que ce soit en simple ou double..

il faut passer par une fonction reel - > Dint mais attention, les capacités de comptage sont différentes. si le réel est trop grand, perte de valeur !

Re: Conversion REAL en 2 entiers

Posté : 28 mars 2019, 13:28
par Bruce33
Bonjour,

Les explications sont confuses.
Quel est cet afficheur qui n'est pas capable d'afficher ni un mot flottant ni un mot entier de 32 bits ?

Pour afficher un nombre avec une virgule à partir d'une variable entière, il faut définir un nombre constant de chiffres après la virgule.
Par ex. la variable entière contient 3121 mais on affiche 312.1

Concernant les conversions de type de variable, en supposant que l'on programme avec Unity Pro (maintenant nommé EcoStruxure Control Expert) :
  • La fonction REAL_TO_DINT convertit la valeur réelle en valeur entière. Il faudra multiplier la valeur réelle si l'on veut conserver des chiffres après la virgule.
  • La fonction DINT_AS_WORD permet de décomposer la valeur entière sur 32 bits en deux mots de 16 bits.
Il faut aussi savoir si la valeur peut être négative.

Re: Conversion REAL en 2 entiers

Posté : 28 mars 2019, 14:56
par itasoft
slts,
Unity Pro (maintenant nommé EcoStruxure Control Expert)

j’étais pas au courant du changement de nom, mais exactement le même ??

Re: Conversion REAL en 2 entiers

Posté : 28 mars 2019, 15:35
par Béryl
itasoft a écrit : 28 mars 2019, 14:56 slts,
Unity Pro (maintenant nommé EcoStruxure Control Expert)

j’étais pas au courant du changement de nom, mais exactement le même ??
Oui, c'est à partir de la V14 de Unity.

Re: Conversion REAL en 2 entiers

Posté : 29 mars 2019, 12:21
par Nicat
C'est un écran prévu pour pour communiquer avec des onduleurs en direct (Tout un tas de protocoles propriétaires), mais on peut aussi communiquer en Modbus en lui mettant à disposition les registres suivants :
%MW100 et %MW101 en entiers signés (SINT16 d'après la doc) pour afficher la première ligne etc...

Donc ma problématique est de convertir le REAL en deux INT, sans perdre d'infos (Si je converti ma variable REAL (Ex : 123.45) en DINT, je me retrouve avec 123) --> J'avais testé la solution REAL_TO_DINT et DINT_AS_WORD auparavant mais ça ne fonctionne pas

J'avais pensé à multiplier mon REAL par 100 afin de virer la problématique de la virgule, mais ensuite je ne peux pas la remettre...

Re: Conversion REAL en 2 entiers

Posté : 29 mars 2019, 13:21
par ProfnovA
Bruce33 a écrit : 28 mars 2019, 13:28 Les explications sont confuses.
Quel est cet afficheur qui n'est pas capable d'afficher ni un mot flottant ni un mot entier de 32 bits ?
Je plussoie. Désolé mais je ne comprend pas non plus comment les réels sont affichés. Normalement, c'est la norme i3e 754 qui définit le codage.
Quel est la ref de ton afficheur?

Re: Conversion REAL en 2 entiers

Posté : 29 mars 2019, 13:36
par Bruce33
Est-ce possible d'avoir la référence de cet afficheur ou l'accès à la documentation ?
Nicat a écrit :J'avais testé la solution REAL_TO_DINT et DINT_AS_WORD auparavant mais ça ne fonctionne pas
Qu'est-ce qui ne fonctionne pas ? Quelle valeur indiquait l'afficheur ?

Qu'est-ce qui s'affiche lorsque vous mettez les valeurs suivantes :
- %MW100=0 et %MW101=1
- %MW100=1 et %MW101=0
- %MW100=0 et %MW101=-1
- %MW100=-1 et %MW101=0

Re: Conversion REAL en 2 entiers

Posté : 29 mars 2019, 14:03
par Nicat
Avec ces 2 fonctions l'afficheur indiquait 0000 (Donc pas la valeur que je voulais afficher...)
Qu'est-ce qui s'affiche lorsque vous mettez les valeurs suivantes :
- %MW100=0 et %MW101=1 --> 1
- %MW100=1 et %MW101=0 --> 65536
- %MW100=0 et %MW101=-1 --> Je n'ai pas testé avec une valeur négative et ne suis pas sur place actuellement
- %MW100=-1 et %MW101=0 --> Idem


La référence est un Siebert XC-Board. La doc se trouve ici : https://we.tl/t-7fgeIPP1d8

Re: Conversion REAL en 2 entiers

Posté : 29 mars 2019, 14:16
par djé
Salut,

La solution de la conversion REAL_to_DINT doit fonctionner, mais peut être faut-il changer l'ordre des mots (poids faible poids fort) côté automate.
registre 100 :PF (high)
registre 101 :pf (low)