[TIA V17] Mot double en 2 mot simple

Forum traitant des automates industriels de marque Siemens.
Avatar du membre
andala
Créateur de langage
Créateur de langage
Messages : 505
Enregistré le : 19 déc. 2016, 10:24
Localisation : Atlantide

[TIA V17] Mot double en 2 mot simple

Message par andala »

Bonjour a tous,
Savez-vous s'il existe un bloc tout fait pour séparer un mot double en 2 mots simples ?

Par exemple :
Je fait un FB avec :
entrée : mot_double_a_separer (DWord)
sortie : mot_simple1 (Word) et mot_simple2 (Word)

mot_simple1 prendrait donc les 16 premiers bits et mot_simple2 les 16 autres.

Je n'ai pas d'autre solution que le séparer en 2 word donc pas besoin de me demander pour quelle raison ;)

Aujourd'hui je fais %MD30 et je renseigne pour mes 2 word %MW30 et 31 mais je voudrais faire un bloc pour que ça fasse le taf tout seul sans avoir besoin d'aller chercher les 2 word consecutif du Dword

Merci d'avance ;)
Une bonne action en entraine toujours une autre
Avatar du membre
ProfnovA
Créateur de langage
Créateur de langage
Messages : 572
Enregistré le : 21 oct. 2015, 08:21

Re: [TIA V17] Mot double en 2 mot simple

Message par ProfnovA »

Ceci fonctionne

DW DWord
W1 Word
W2 Word


#W1 := #DW AND 16#FFFF;
#W2 := SHR(IN := #DW, N := 16);
Avatar du membre
andala
Créateur de langage
Créateur de langage
Messages : 505
Enregistré le : 19 déc. 2016, 10:24
Localisation : Atlantide

Re: [TIA V17] Mot double en 2 mot simple

Message par andala »

J'ai fait comme ça :
pb.jpg
Quelqu'un peux m'expliquer pourquoi, lui, pas fonctionner ? :lol:
Une bonne action en entraine toujours une autre
MiGaNuTs
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1572
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: [TIA V17] Mot double en 2 mot simple

Message par MiGaNuTs »

Euh, je comprends pas pourquoi tu fait aussi compliqué pour faire deux trucs simple.
Tu a juste besoin de faire 2 opérations. Un masque pour garder juste le poids faible, et un décalage de bits (ou une division) pour avoir le poids fort.
En plus en ST ça se fait très facilement.
2023-11-09 16_26_19-Siemens  -  C__Users_New-BDC_Documents_BDC_testSiemens_Projet1_Projet1.png
Avatar du membre
andala
Créateur de langage
Créateur de langage
Messages : 505
Enregistré le : 19 déc. 2016, 10:24
Localisation : Atlantide

Re: [TIA V17] Mot double en 2 mot simple

Message par andala »

Alors...
J'ai essayé de mettre en ST. ça marche pour le #poidsfort mais pour le #poidsfaible non.

J'ai fait un instantané des valeurs :
sur le poids fort je dois avoir 16064 et j'ai bien 16064
sur le poids faible je dois avoir -16375 et j'ai 2427

Pour info j'ai écrit ça :

#Value_1 := DWORD_TO_WORD(#Output_val / 16#10000);
#Value_2 := DWORD_TO_WORD(#Output_val AND 16#FFFF);
Une bonne action en entraine toujours une autre
MiGaNuTs
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1572
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: [TIA V17] Mot double en 2 mot simple

Message par MiGaNuTs »

Tu ne peut pas avoir de valeurs négatives avec des word. Si tu a des valeurs négatives, c'est que c'est des int. C'est le bit de poids fort qui sert de signe dans un int, alors que dans un word (ou un uint) il sert de bit de poids fort.
Du coup si ce que tu veux couper en deux c'est des dint, alors la en effet c'est plus chiant.
J'avoue qu'il faut que je réfléchisse un peu plus a la question, parce que les nombres négatifs c'est un peu pénible a gérer :(
steph68
Codeur fou
Codeur fou
Messages : 275
Enregistré le : 21 oct. 2015, 08:23

Re: [TIA V17] Mot double en 2 mot simple

Message par steph68 »

Du coup si ce que tu veux couper en deux c'est des dint, alors la en effet c'est plus chiant.
:evil: c'est quoi la différence entre un DINT et un DWORD ?

Code : Tout sélectionner

#Value_1 := DWORD_TO_WORD(#Output_val / 16#10000);
#Value_2 := DWORD_TO_WORD(#Output_val AND 16#FFFF);
est-ce que la division arithmétique est autorisée avec un DWORD ?
selon la norme non

le masquage est facultatif, puisqu'un DWORD_TO_WORD le fait déjà implicitement
un shift (SHR) comme ProfnovA l'a écrit est bien mieux pour cette situation

vous apprenez quoi à l'école de nos jours ?
MiGaNuTs
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1572
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: [TIA V17] Mot double en 2 mot simple

Message par MiGaNuTs »

steph68 a écrit : 09 nov. 2023, 18:27 :evil: c'est quoi la différence entre un DINT et un DWORD ?
1 bit ...

Peut être que la bonne question a ce poser n'est pas la en fait.
Peut être que c'est plutôt un truc du genre "quelle est la différence entre un DINT et deux INT" ?
Est ce qu'il y'aurait pas un moment ou je perds une information dans l'histoire ?
steph68 a écrit : 09 nov. 2023, 18:27 vous apprenez quoi à l'école de nos jours ?
De nos jours je sait pas, mais a mon époque on m'a appris qu'une multiplication par 2 puissance n et un décalage de n bits vers la gauche c'est exactement la même chose, et que la division c'est le meme principe.
Peio
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 108
Enregistré le : 22 oct. 2015, 19:51

Re: [TIA V17] Mot double en 2 mot simple

Message par Peio »

Bonjour,
Télécharges la Librairie LGF de Siemens
tu as le bloc LGF_SplitDwordsToWords

Cordialement
steph68
Codeur fou
Codeur fou
Messages : 275
Enregistré le : 21 oct. 2015, 08:23

Re: [TIA V17] Mot double en 2 mot simple

Message par steph68 »

MiGaNuTs a écrit : 09 nov. 2023, 18:57
steph68 a écrit : 09 nov. 2023, 18:27 :evil: c'est quoi la différence entre un DINT et un DWORD ?
1 bit ...
la différence est l'interprétation que tu en fais (nombre signé ou nombre non signé)
tout deux sont sur 32 bits et à l'exception de la division et de la multiplication, les opérations arithmétiques et logiques sont strictement identiques
le microprocesseur s'en cogne que c'est un DINT, un UDINT ou un DWORD

maintenant un BYTE, WORD, DWORD ou LWORD sont des champs de bits (bitfields) réservés aux opérations logiques (AND, OR, XOR, SHL, SHR)
DINT, UDINT et tous les autres types numériques sont réservés aux opérations arithmétiques (+, -, /, *, **, MOD)

cependant, depuis la nouvelle génération S7-1200 / 1500, TIA tolère les opérations arithmétiques sur les bitfields, ainsi que les shifts sur les entiers par exemple.
Du coup si ce que tu veux couper en deux c'est des dint, alors la en effet c'est plus chiant.
c'est pareil, DINT, UDINT ou DWORD ; le code sera le même sauf pour les conversions (DINT_TO_WORD au lieu de DWORD_TO_WORD), uniquement là pour que le compilateur soit content :mrgreen:
De nos jours je sait pas, mais a mon époque on m'a appris qu'une multiplication par 2 puissance n et un décalage de n bits vers la gauche c'est exactement la même chose, et que la division c'est le meme principe.
ma petite pique sur l'école ne s'adressait pas à toi mais à l'auteur du post ;)

oui sauf pour l'extension du bit de signe si le dividende est un type signé.

Code : Tout sélectionner

UDINT#16#FFFF_FF00 / 2 donnera 16#7FFF_FF80
 DINT#16#FFFF_FF00 / 2 donnera 16#FFFF_FF80
SHR_DWORD(IN := 16#FFFF_FF00, N := 1) donnera 16#7FFF_FF80
un shift est aussi beaucoup plus rapide à l'exécution (qui s'en soucie de nos jours ?)
et comme dit plus haut, en principe, un DWORD ne se divise pas

@+
Répondre