[TwinCAT 3] Transformer 4 octets en un DWORD

Partie du forum pour tout ce qui concerne les automates industriels B&R, Beckhoff, Phoenix Contact etc...
Avatar du membre
maxpeigne
Créateur de langage
Créateur de langage
Messages : 731
Enregistré le : 11 oct. 2015, 17:31
Localisation : Nord pas de calais

[TwinCAT 3] Transformer 4 octets en un DWORD

Message 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 1046 fois
Quelqu'un sait si cette fonction existe?

Merci,
http://automacile.fr - Site et tutoriels sur l'arduino.
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7089
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
Brebiou
Dieu du process
Dieu du process
Messages : 936
Enregistré le : 21 oct. 2015, 08:38

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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
Avatar du membre
maxpeigne
Créateur de langage
Créateur de langage
Messages : 731
Enregistré le : 11 oct. 2015, 17:31
Localisation : Nord pas de calais

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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.
http://automacile.fr - Site et tutoriels sur l'arduino.
MiGaNuTs
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1042
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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);
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7089
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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
Automaticien privé (de tout)
itasoft@free.fr
DurandO
Maître du binaire
Maître du binaire
Messages : 402
Enregistré le : 21 mars 2021, 15:31

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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.
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7089
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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 ???
Automaticien privé (de tout)
itasoft@free.fr
jclavier
Apprend le binaire
Apprend le binaire
Messages : 10
Enregistré le : 13 févr. 2021, 18:26

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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));
Avatar du membre
Bruce33
Créateur de langage
Créateur de langage
Messages : 733
Enregistré le : 28 oct. 2015, 06:54
Localisation : Pas-de-Calais

Re: [TwinCAT 3] Transformer 4 octets en un DWORD

Message 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.
Répondre