Page 1 sur 2
[TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 14 mars 2023, 17:50
par maxpeigne
Bonjour à tous,
Je suis sur Twincat3 et je cherche a transformer 4 SINT en 1 DINT.
J'ai fais une méthode bien dégueulasse, mais je me demandais s'il y avait une fonction prévu pour cela?

- Byte_DWORd.png (6.67 Kio) Vu 4034 fois
Quelqu'un sait si cette fonction existe?
Merci,
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 14 mars 2023, 18:04
par itasoft
slts, connais pas TwinCAT, si la fonction n'existe pas essayer ça si ça marche, c'est pas sur ?
dint1 :=byte1 + SHL(byte2,8) + SHL(byte3,16) + SHL(byte4,24)
essayer aussi avec un OR à la place du +
ps:
ça marche avec le ROL ? c'est un décalage circulaire, les poids forts peuvent se retrouver dans les poids faibles
ex: ROL(FF00 0000,8) ça va donner 0000 00FF
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 16 mars 2023, 11:08
par Brebiou
Salut,
Tu as essayé de faire
VariableConvertie := SINT_TO_DINT(Variable)?
[EDIT] Ah oui mais non, ca ne colle pas avec ce que tu veux faire

Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 28 avr. 2023, 15:15
par maxpeigne
Je profite de mon vendredi apres midi en mode "fin de semaine" pour ressortir ce sujet...
itasoft a écrit : ↑14 mars 2023, 18:04
dint1 :=byte1 + SHL(byte2,8) + SHL(byte3,16) + SHL(byte4,24)
ps:
ça marche avec le
ROL ? c'est un décalage circulaire, les poids forts peuvent se retrouver dans les poids faibles
ex: ROL(FF00 0000,8) ça va donner 0000 00FF
J'ai essayé ta méthode Ita et ça ne fonctionne pas.
Le ROL fonctionne car je le transfère directement dans un DINT. Du coup pour reprendre ton exemple, ça fait pas:
ROL(FF00 0000,8) ça va donner 0000 0000 0000 0000 FF00 0000 0000 0000.
Je verrai bien si un jour j'ai besoin d'utiliser ça. Sinon je créerai une fonction histoire d'alléger un peu le programme.
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 28 avr. 2023, 19:21
par MiGaNuTs
Bonjour.
Question bête: ça ne marche pas juste avec des multiplications et des OR ou des additions ?
Dint := byte1 + (16#100 *byte2) + (16#10000 *byte3) + (16#1000000 *byte4);
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 29 avr. 2023, 14:09
par itasoft
Le ROL fonctionne car je le transfère directement dans un DINT. Du coup pour reprendre ton exemple, ça fait pas:
ROL(FF00 0000,8) ça va donner 0000 0000 0000 0000 FF00 0000 0000 0000.
---------------
et avec ROL(16#FF00 0000 0000 0000,8) ça va bien donner 16#0000 0000 0000 00FF ??
Bon, tout ça pour dire qu'il faut utiliser SHL et non pas ROL
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 04 mai 2023, 13:30
par DurandO
MiGaNuTs a écrit : ↑28 avr. 2023, 19:21
Bonjour.
Question bête: ça ne marche pas juste avec des multiplications et des OR ou des additions ?
Dint := byte1 + (16#100 *byte2) + (16#10000 *byte3) + (16#1000000 *byte4);
Bonjour,
j'aurai attaqué cela de cette manière aussi multiplication par 2^x.
J'ai sans doute en mémoire des restes de calcul
SMC 600 qui m'auront influencés.
donnera 0000 00FF
eut été plus clair ainsi :
donnera 1000 00FF
donnera 1000 0000
Voila.
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 04 mai 2023, 17:12
par itasoft
Slts,
Comme personne n’as compris ce que j’ai voulu dire, je récapitule :
Dans l’exemple à maxpeigne avec ROL ou SHL le résultat sera le même, mais ya aucune raison d’utiliser ROL qui est un décalage circulaire, que on utilise en principe pour inverser les poids forts/poids faibles, est que c’est clair cette fois ???
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 15 juil. 2023, 12:09
par jclavier
Sinon il y a la fonction MEMCPY qui évite de se prendre la tête:
asiSource : ARRAY[0..3] OF SINT;
diTarget: DINT;
MEMCPY(destAddr :=ADR(diTarget),srcAddr:=ADR(asiSource),n:=SIZEOF(diTarget));
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
Posté : 20 juil. 2023, 07:12
par Bruce33
jclavier a écrit : ↑15 juil. 2023, 12:09
Sinon il y a la fonction MEMCPY qui évite de se prendre la tête:
asiSource : ARRAY[0..3] OF SINT;
diTarget: DINT;
MEMCPY(destAddr :=ADR(diTarget),srcAddr:=ADR(asiSource),n:=SIZEOF(diTarget));
Merci pour cette suggestion.
Il faut quand même préciser que cette instruction mal employée peut être dangereuse, elle doit être utilisée quand on a une maitrise certaine du codage des données.