Page 1 sur 1

fonctions Unity

Posté : 25 oct. 2016, 16:08
par md42
Bonjour,

Quelqu'un pourrait m'expliquer la différence entre les fonctions ROR, ROL, SHR, SHL, MASK de Unity ?
Avec un exemple concret d'application se serait mieux!
Merci à tous

Re: fonctions Unity

Posté : 26 oct. 2016, 14:44
par jpratpsft
Salut md42,

L'aide de Unity Pro est assez explicite pour toutes ces fonctions, quel est ton besoin ?
Pour moi, ça marche comme ça:

ROR = Rotate right = Rotation à droite
Il s'agit de décaler le bits d'une variable vers la droite en plaçant les bits décalés du côté poids fort (si décalage de 1):
1000 0000 0000 0101
1100 0000 0000 0010
0110 0000 0000 0001
...

ROL = Rotate left = Rotation à gauche
L'inverse de ROR:
1000 0000 0000 0101
0000 0000 0000 1011
0000 0000 0001 0110
...

SHR = Shift right = Décalage à droite
La même chose que ROR mais sans réutiliser les bits:
1000 0000 0000 0101
0100 0000 0000 0010
0010 0000 0000 0001
...

SHL = Shift left = Décalage à gauche
La même chose que ROL mais sans réutiliser les bits:
1000 0000 0000 0101
0000 0000 0000 1010
0000 0000 0001 0100
...

MASK = Masque = Mais je ne connais pas cette fonction... et elle n'est pas dans l'aide de mon Unity.
Cela dit, elle doit permettre d'appliquer un masque à une donnée pour ne pas changer tous les bits de cette donnée, mais seulement ceux qui sont sensés changer selon un opérateur (OR, AND, XOR, NOT...)

@+

Re: fonctions Unity

Posté : 26 oct. 2016, 16:11
par md42
Merci pour tes explications.

j'ai découvert ces blocs fonctions dans Unity, mais concrètement ça sert à quoi?
j'imagine que c'est forcément pour traiter une valeur analogique?

as tu un exemple d'application précise pour bien comprendre.

a+

Re: fonctions Unity

Posté : 27 oct. 2016, 09:40
par Laurent
Salut,

ces opérateurs permettent de traiter des chaines de bits, c'est pas vraiment fait pour le traitement de valeurs analogiques.

Un exemple bidon, un carte d'entrées récupère jusqu'à 16 informations (des défauts machines), on veut connaître le nombre de défauts présents :

Code : Tout sélectionner

mes_defauts := %I0.0.0:16;

nb_defauts := 0;
masque := 2#0000_0000_0000_0001;

for i := 1 to 16 by 1
do
    if mes_defauts AND masque
    then
        nb_defauts := nb_defauts + 1;
    end_if;
    SHL(in := masque, n := 1);
end_for;
(* la variable nb_defauts indique maintenant le nombre de bits a 1 dans la variable mes_defauts *)
Une variante évitant une variable de masque :

Code : Tout sélectionner

mes_defauts := %I0.0.0:16;
nb_defauts := 0;

for i := 0 to 15 by 1
do
    if mes_defauts AND SHL(in := 1, n := i)
    then
        nb_defauts := nb_defauts + 1;
    end_if;
end_for;
(* la variable nb_defauts indique maintenant le nombre de bits a 1 dans la variable mes_defauts *)

Re: fonctions Unity

Posté : 27 oct. 2016, 10:08
par Cyril93
md42 a écrit : j'imagine que c'est forcément pour traiter une valeur analogique?
a+
analogique ? non pas trop :roll: Tu as quoi comme diplômes ?

mais ça sert souvent et pour tellement de choses différentes qu'il pourrait y avoir des milliers d'exemples.

une utilisation de SHR : compter le nombre de bit à 1 dans un mot

Code : Tout sélectionner

FUNCTION BIT_COUNT : INT
VAR_INPUT
	IN : WORD;
END_VAR

WHILE IN > 0 DO
	IF in.0 THEN Bit_Count := Bit_Count + 1; END_IF;
	in := SHR(in,1);
END_WHILE;

Re: fonctions Unity

Posté : 27 oct. 2016, 10:41
par itasoft
slts,
corrigé, pour le fun, LOL


WHILE IN <> 0 DO
Bit_Count := Bit_Count + (IN AND 1);
in := SHR(in,1);
END_WHILE;

si tu fais IN>0 tu verras pas le bit 15 de IN ( si IN est un INT)

Re: fonctions Unity

Posté : 27 oct. 2016, 12:06
par Cyril93
Que tu prennes le premier bit du mot ou que tu appliques un masque cela fera le même résultat, perso je me sert de cette fonction et elle marche ?? Je suis d'accord avec <> 0 si tu veux compter du INT mais rien ne t’empêches de faire INT_TO_WORD

Edit : on peux faire des fonctions avec Unity ou que des DFB avec une instance ??

Re: fonctions Unity

Posté : 27 oct. 2016, 12:13
par itasoft
slts,
j'ai jamais dis que ça ne donnait pas le même résultat, c'était pour simplifier le code,
ceci dit , tu continu à faire comme tu as l'habitude, et les vaches seront bien gardées.

Re: fonctions Unity

Posté : 27 oct. 2016, 12:14
par Cyril93
Pas de souci,

On peux faire des fonctions avec Unity ou faut faire obligatoirement des DFB avec une instance ?
Réponse : on peux faire que des DFB

code pour le DFB avec :
IN integer Input,
COUNT integer Output,
temp integer private.

Code : Tout sélectionner

COUNT:=0;
temp:=IN;
WHILE temp <> 0 DO
	IF temp.0 THEN COUNT:=COUNT + 1; END_IF;
	temp := SHR(temp,1);
END_WHILE;