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
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 :D

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.
DIntByteIta.png
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.

Code : Tout sélectionner

ROL(FF00 0000,8)
donnera 0000 00FF
eut été plus clair ainsi :

Code : Tout sélectionner

ROL(FF00 1000,8)
donnera 1000 00FF

Code : Tout sélectionner

SHL(FF00 1000,8)
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.