fonctions Unity

Forum traitant des automates industriels de marque Schneider - Telemecanique
Répondre
md42
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 116
Enregistré le : 22 mars 2016, 08:54

fonctions Unity

Message 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
jpratpsft
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 124
Enregistré le : 24 nov. 2015, 11:10
Localisation : Blagnac
Contact :

Re: fonctions Unity

Message 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...)

@+
--
Commissaire Bialès : Parlez-moi de vous plutôt…
Odile Deray : Odile. Moi, c'est Odile. Pluto, c'est l'ami de Mickey.
Commissaire Bialès : Ah non, Pluto c'est le chien de Mickey. L'ami de Mickey c'est Dingo.
La cité de la peur
md42
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 116
Enregistré le : 22 mars 2016, 08:54

Re: fonctions Unity

Message 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+
Laurent
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 108
Enregistré le : 20 oct. 2015, 11:16
Localisation : Oise et Ile-de-France / France

Re: fonctions Unity

Message 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 *)
Laurent
Avatar du membre
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Enregistré le : 29 oct. 2015, 14:22
Localisation : IDF

Re: fonctions Unity

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

Re: fonctions Unity

Message 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)
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Enregistré le : 29 oct. 2015, 14:22
Localisation : IDF

Re: fonctions Unity

Message 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 ??
Modifié en dernier par Cyril93 le 27 oct. 2016, 12:13, modifié 1 fois.
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7166
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: fonctions Unity

Message 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.
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Enregistré le : 29 oct. 2015, 14:22
Localisation : IDF

Re: fonctions Unity

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