Traitement de 64 bits sur M340

Forum traitant des automates industriels de marque Schneider - Telemecanique
Répondre
pinpin
Apprend le binaire
Apprend le binaire
Messages : 2
Enregistré le : 17 juin 2016, 10:49

Traitement de 64 bits sur M340

Message par pinpin »

Bonjour.

J'ai un M340 en liaison TCP-IP Modbus avec un débitmètre qui me renvoie des totalisateurs sous la forme suivante :
- 1 valeur non signée de 64 bits reçue coté M340 sur un tableau de 4 Integer qui représente un volume exprimé en litres
- 1 valeur de 64 bits IEEE754 (flottant) reçue coté M340 sur un tableau de 4 Integer qui représente un volume exprimé en mètres cubes
Bien entendu le M340 ne traite pas des valeurs de 64 bits.

Je souhaite convertir ces données sur un UDINT, je m'explique.

J'ai converti les 2 premiers mots de la table du 64 bits non signé vers un UDINT dans lequel je récupère effectivement une valeur à concurrence de la capacité max d'un mot de 32 bits, c'est à dire 4294967295 litres.
Il s'avère que ce n'est pas assez pour mon application, au terme de 2 ans de comptabilisation je ne serai pas loin de dépasser ce volume.
Cela dit si cette valeur était exprimée en mètre cubes depuis le débitmètre le problème ne se poserai pas, j'aurai à ma disposition une valeur qui pourrait aller jusqu'à 4294967295 de mètre cubes... tranquille pendant 2000 ans. Malheureusement une mise à l'échelle n'est pas possible coté débitmètre, et coté automate je n'aurai au maximum que 4294967 de m3 si je divise mon 32 bits par 1000.

En forçant le débitmètre à m'afficher ce qu'un mot de 32 bits peut contenir (4294967295) je n'ai que les 3 premiers mots d'utilisés sur les 4. Le challenge est le suivant :
- trouver le moyen de sortir une valeur avec les 3 premiers mots
- diviser cette valeur par 1000
- placer le résultat dans un UDINT

J'entrevois un moyen mathématique pour le faire, faire du décalage de bits sur le 1er mot, etc... mais je n'ai pas encore trouvé la solution.

Il y a aussi la valeur de 64 bits IEEE754 qui elle ne nécessite pas de conversion d'échelle mais bien qu'ayant trouvé quelques pistes de calcul je n'ai compris la méthode qu'en partie, ça me parait plutôt lourd à réaliser.

Voilà :)
Peut être avez vous été confrontés à ce genre de problème et que vous connaissez une solution ?

Merci d'avance pour vos réponses :)
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: Traitement de 64 bits sur M340

Message par itasoft »

slts,
Une solution parmi d’autres :
Faire un décalage de 10 à droite des 64 bits, ce qui revient à diviser par 1024
Garder les 2 mots des poids faibles pour en faire un UDINT
Multiplier par 1.024 pour avoir le résultat en M3

(*Décalage à DROITE des bits de la TABLE_SOURCE et résultat dans TABLE_RESULT *)
nbD:=10;(*nombre de décalages à faire à droite*)
MOVE_BOOL_AREBOOL(0,TABLE96EBOOL);(*Raz*)
TABLE96EBOOL :=COPY_ARINT_AREBOOL(TABLE_SOURCE, 0, 4, 0);
TABLE_RESULT:=COPY_AREBOOL_ARINT(TABLE96EBOOL, nbD, 64, 0);

TABLE96EBOOL ARRAY[0..195] OF EBOOL
TABLE_SOURCE ARRAY[0..3] OF INT
TABLE_RESULT ARRAY[0..3] OF INT

pour la valeur de 64 bits IEEE754 (flottant) pour le moment je ne vois pas de solution, je cherche
Automaticien privé (de tout)
itasoft@free.fr
pinpin
Apprend le binaire
Apprend le binaire
Messages : 2
Enregistré le : 17 juin 2016, 10:49

Re: Traitement de 64 bits sur M340

Message par pinpin »

J'avais déjà commencé à travailler sur les décalages mais je tournais encore en rond lorsque j'ai lu votre réponse... ce fut la révélation :)

Je l'ai mis immédiatement en pratique et ça fonctionne à merveille moyennant une conversion en flottant pour multiplier le tout de 1.024 et reconversion en UDINT, cela m'assure une capacité affichable de 2147483648 m3... plus qu'il n'en faut conformément à ce que j'attendais.

Travailler en 64 bits sur un automate c'est de l'inédit pour moi.

Une énorme merci pour ce coup de main et pour cette promptitude à répondre.

Bon week end !!!
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: Traitement de 64 bits sur M340

Message par itasoft »

slts,
Après test je remarque que l'arrondi en M3 ne se fait pas correctement,
ex: pour 13450 litres on doit avoir 13 M3 et pour 13550 litres on doit avoir 14 M3
modification pour correction.



nbD:=10;
MOVE_BOOL_AREBOOL(0,TABLE_EBOOLS);
TABLE_EBOOLS :=COPY_ARINT_AREBOOL(TABLE_SOURCE, 0, 4, 0);
TABLE_RESULT:=COPY_AREBOOL_ARDINT(TABLE_EBOOLS, nbD, 64, 0);
(*Calcul pour l'arrondi*)
RETENUE:=INT_TO_REAL(TABLE_SOURCE[0] and 16#03FF)/1024.0;
RESULT1000:=REAL_TO_UDINT((UDINT_TO_REAL(DINT_TO_UDINT(TABLE_RESULT[0]))+RETENUE)*1.024);

(*
TABLE_EBOOLS ARRAY[0..127] OF EBOOL
TABLE_SOURCE ARRAY[0..3] OF INT
TABLE_RESULT ARRAY[0..1] OF DINT
RETENUE REAL
RESULT1000 UDINT (résultat en M3 sur un UDINT)
nbD INT
*)
Automaticien privé (de tout)
itasoft@free.fr
Répondre