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 : 7035
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Exercice

Message par itasoft »

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
Inscription : 21 déc. 2017, 11:04

Re: Exercice

Message par Flav »

Quelle est cette fonction LOG? Jamais vue.

Edit: Et si y'a plusieurs bits à un? :p
2e année BTS CRSA
Kallysto
Créateur de langage
Créateur de langage
Messages : 732
Inscription : 27 avr. 2017, 11:11
Localisation : Loin de la civilisation

Re: Exercice

Message par Kallysto »

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 : 7035
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Exercice

Message par itasoft »

slts,
c'est valable que si ya un seul bit à 1
Automaticien privé (de tout)
itasoft@free.fr
steph68
Codeur fou
Codeur fou
Messages : 268
Inscription : 21 oct. 2015, 08:23

Re: Exercice

Message par steph68 »

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
Créateur de langage
Créateur de langage
Messages : 525
Inscription : 21 oct. 2015, 08:21

Re: Exercice

Message par ProfnovA »

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 : 7035
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Exercice

Message par itasoft »

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
Créateur de langage
Créateur de langage
Messages : 525
Inscription : 21 oct. 2015, 08:21

Re: Exercice

Message par ProfnovA »

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 : 7035
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Exercice

Message par itasoft »

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 : 7035
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Exercice

Message par itasoft »

@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