Exercice

Trucs-Astuces-Micro cours sur les automatismes industriels
Répondre
Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2698
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Exercice

Message par itasoft » 05 juil. 2018, 07:48

slts,
un petit exercice pour se détendre
(ou se prendre la tête, LOL)

cliquer dessus pour agrandir
_LOG.JPG
Automaticien privé (de tout)
itasoft@free.fr

Flav
Asservi son premier moteur
Asservi son premier moteur
Messages : 25
Enregistré le : 21 déc. 2017, 11:04

Re: Exercice

Message par Flav » 13 juil. 2018, 15:08

Quelle est cette fonction LOG? Jamais vue.

Edit: Et si y'a plusieurs bits à un? :p
2e année BTS CRSA

Kallysto
Maître du binaire
Maître du binaire
Messages : 457
Enregistré le : 27 avr. 2017, 11:11
Localisation : Loin de la civilisation

Re: Exercice

Message par Kallysto » 13 juil. 2018, 15:27

Flav a écrit :
13 juil. 2018, 15:08
Edit: Et si y'a plusieurs bits à un? :p
Me suis posée la même question mais j'ai voulu être sympa...

Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2698
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Exercice

Message par itasoft » 13 juil. 2018, 15:40

slts,
c'est valable que si ya un seul bit à 1
Automaticien privé (de tout)
itasoft@free.fr

steph68
Forcené des structures
Forcené des structures
Messages : 153
Enregistré le : 21 oct. 2015, 08:23

Re: Exercice

Message par steph68 » 02 août 2018, 06:43

hello,

Code : Tout sélectionner

IF %MW0 <> 0 THEN

	%MW1 := 0;
	%MW0 := %MW0 AND NOT %MW0 + 1; (* isolation du premier bit à 1, ce qui est identique à %MW0 AND -%MW0 *)
	IF (%MW0 AND 16#AAAA) <> 0 THEN %MW1 := %MW1 + 1; END_IF 
	IF (%MW0 AND 16#CCCC) <> 0 THEN %MW1 := %MW1 + 2; END_IF 
	IF (%MW0 AND 16#F0F0) <> 0 THEN %MW1 := %MW1 + 4; END_IF 
	IF (%MW0 AND 16#FF00) <> 0 THEN %MW1 := %MW1 + 8; END_IF 

ELSE

	%MW1 := -1;

END_IF
astuce utilisée:

x AND -x isole le bit à 1 le plus faible
pour éviter des problèmes de conversion si %MW0 est déclaré en type WORD : NOT x + 1 est équivalent à -x

@+

Avatar de l’utilisateur
ProfnovA
Codeur fou
Codeur fou
Messages : 227
Enregistré le : 21 oct. 2015, 08:21

Re: Exercice

Message par ProfnovA » 02 août 2018, 08:31

Allez, c'est bien parce que c'est les vacances...

Code : Tout sélectionner

%MW1:= REAL_TO_INT (1.4427 *LN( INT_TO_REAL (%MW0) ) );

Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2698
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Exercice

Message par itasoft » 02 août 2018, 10:28

ProfnovA a écrit :
02 août 2018, 08:31
Allez, c'est bien parce que c'est les vacances...

Code : Tout sélectionner

%MW1:= REAL_TO_INT (1.4427 *LN( INT_TO_REAL (%MW0) ) );
bien, pas trouvé de quoi dérive la constante 1.4427 , c'est pas la racine de 2 ?
Automaticien privé (de tout)
itasoft@free.fr

Avatar de l’utilisateur
ProfnovA
Codeur fou
Codeur fou
Messages : 227
Enregistré le : 21 oct. 2015, 08:21

Re: Exercice

Message par ProfnovA » 02 août 2018, 13:45

itasoft a écrit :
02 août 2018, 10:28
ProfnovA a écrit :
02 août 2018, 08:31
Allez, c'est bien parce que c'est les vacances...

Code : Tout sélectionner

%MW1:= REAL_TO_INT (1.4427 *LN( INT_TO_REAL (%MW0) ) );
bien, pas trouvé de quoi dérive la constante 1.4427 , c'est pas la racine de 2 ?
Honnêtement, j'ai fait une courbe de tendance excel, c'est pas beau de tricher...

En fait ça correspond à l'expression de départ transformée en ln (base 2).
La constante est 1 / ( ln(10) * log(2) ).
Ca fait réviser un peu ses classiques.

Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2698
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Exercice

Message par itasoft » 02 août 2018, 13:52

slts,
exact, c'est la réciproque de la fonction , va falloir que je révise mes bouquins, lol
Automaticien privé (de tout)
itasoft@free.fr

Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2698
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Exercice

Message par itasoft » 02 août 2018, 19:44

@steph68
ta solution fonctionne, mais si il faut écrire des lignes de programme , on peut faire plus court.

%MW1:=-1;
while %MW0 <>0 do
inc(%MW1);
%MW0:=SHR(%MW0,1);
end_while;

pendant qu'on y est, dans le même principe

(* nombre de bits à 1 dans %MW0 *)
%MW1:=0;
while %MW0 <>0 do
%MW1:=%MW1+(%MW0 AND 1);
%MW0:=SHR(%MW0,1);
end_while;

(* nombre de bits à 0 dans %MW0*)
%MW1:=0;
while %MW0 <>0 do
%MW1:=%MW1+(%MW0 And 1 XOR 1);
%MW0:=SHR(%MW0,1);
end_while;
Automaticien privé (de tout)
itasoft@free.fr

Répondre