Mettre un DINT dans 2 INT
-
le 12/10/2018 à 19:03 Citer ce message
Bonsoir à tous,
J'essaie tant bien que mal à trouver une solution pour découper une valeur de type DINT en 2 mots de type INT sans qu'elle soit localisée.
Je vous demande ça car je lis une valeur d'une centrale de mesure qui est codé sur 32 bits (DINT), le problème, c'est que cette valeur doit être découpée en 2 mots de 16 bits (INT) puis ceux-ci doivent être lu dans le sens inverse pour que je puisse avoir la valeur cohérente.
J'ai essayé en créant un tableau de 32 bool puis avec une boucle récupérer les 16 1er puis avec la seconde les 16 derniers mais cela m'a mis l'automate en HALT donc pas bon du tout.
Auriez-vous une petite idée à me conseiller ?
En vous remerciant à tous d'avance pour votre aide. -
le 12/10/2018 à 20:24 Citer ce message
Bonjour,
Dans votre DINT vos avez déjà vos 2 INT pas besoin de faire de transfert.
Ex si votre DINT est MD0 :
Les 2 INT sont MW0 et MW2.
Pour faire l'essai, mettez tout dans une table de variable et visualisez cela vous aidera sans doute. -
le 12/10/2018 à 20:37 Citer ce message
Bonsoir Jerome et merci pour votre réponse. Dans votre explication je suis d'accord avec vous, cependant dans mon cas et je viens de me rendre compte que j'ai omis cette précision.
Ma valeur est récupéré par une variable, exemple toto, résultat, il ne m'est pas possible de faire ce que vous avez noté.
Merci pour votre aide -
le 13/10/2018 à 00:29 Citer ce message
1- Tu convertie ton double mot toto dans un mot:
mot1:=dint_to_int(toto)
2- Tu reprend ton double mot et tu fais une rotation des 16 permiers bit :
calcul := ROR (toto, 16)
3-Tu convertie ton double mot calcul dans un deuxieme mot pour avoir la seconde partie:
mot2:=dint_to-int(calcul) -
le 13/10/2018 à 12:54 Citer ce message
Bonjour EvangerC,
Merci pour ta réponse, je viens d'essayer ce que tu m'as noté, effectivement cela fonctionne mais mon résultat n'est toujours pas bon, il y a quelque chose que je ne comprends pas.
Quand je fais ceci ça fonctionne :
1) Je créé un variable "test" de type "DINT" avec une adresse "%MW100", ce qui veut dire que ma variable "test" est un double mot (%MW100 et %MW101).
2) J'affecte à ma variable "test" la valeur qui m'est renvoyée par la centrale de mesure (celle-ci est toujours négative), petite précision, c'est un DTM que j'ai créé sur un M580 en "Device Modbus", l'item est de type "DINT" en 32bits soit 4 octets.
3) Je créé une seconde variable "test2" de type "DINT" avec une adresse "%MW102".
4) Quand j'écris %MW102 := %MW101; et que je regarde la valeur de "test2" cela fonctionne correctement et je ne comprends pas pourquoi quand je fais ta procédure ça ne fonctionne pas.
Aurais-tu une idée ?
En te remerciant d'avance. -
le 13/10/2018 à 18:57 Citer ce message
Bonjour JbOne73
Essaye ca en reprenant tes variables
test1 := ROR (test, 16)
Dans cet exemple test1 est test sont tout deux des variables de type DINT
J'ai affecté -2000 a test pour exemple
Quand tu regarde la valeur (en binaire) de ces deux mot tu peut voir que j'ai inversé le mot de poid fort avec le mot de poid faible je lis bien dans test1 le double mot test mais a l'envers. -
le 15/10/2018 à 21:25 Citer ce message
Bonsoir jbOne73,
Essai cette méthode, dans Unity Pro, utilise le FFB "DINT AS WORD" puis "WORD AS DINT" les deux connecté en inversant les mots de poids fort/faible.
a+ -
le 16/10/2018 à 14:46 Citer ce message
Bonjour EvangerC & Pierrozz,
Désolé pour cette réponse aussi tardive et merci à tous les 2 pour votre aide.
J'ai essayé les 2 solutions mais j'avoue que celle de Pierrozz est vraiment plus simple à mettre en oeuvre et elle fonctionne à merveille.
J'ai donc opté pour sa réponse, tout fonctionne parfaitement.
En tout cas, je vous remerciement grandement à tous les 2, votre aide m'a été plus que précieux.
1000 Mercis.
Répondre à ce message