[TwinCAT 3] Transformer 4 octets en un DWORD
- maxpeigne
- 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
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? Quelqu'un sait si cette fonction existe?
Merci,
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? Quelqu'un sait si cette fonction existe?
Merci,
http://automacile.fr - Site et tutoriels sur l'arduino.
- itasoft
- 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
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
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
itasoft@free.fr
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
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
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
- maxpeigne
- 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
Je profite de mon vendredi apres midi en mode "fin de semaine" pour ressortir ce sujet...
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.
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.
http://automacile.fr - Site et tutoriels sur l'arduino.
-
- 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
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);
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);
- itasoft
- 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
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
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
itasoft@free.fr
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
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)
eut été plus clair ainsi :
Code : Tout sélectionner
ROL(FF00 1000,8)
Code : Tout sélectionner
SHL(FF00 1000,8)
Voila.
- itasoft
- 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
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 ???
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
itasoft@free.fr
Re: [TwinCAT 3] Transformer 4 octets en un DWORD
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));
asiSource : ARRAY[0..3] OF SINT;
diTarget: DINT;
MEMCPY(destAddr :=ADR(diTarget),srcAddr:=ADR(asiSource),n:=SIZEOF(diTarget));
- Bruce33
- 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
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.