Spécial cahiers de vacances

Trucs-Astuces-Micro cours sur les automatismes industriels
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2076
Inscription : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Spécial cahiers de vacances

Message par philou77 »

oula, j'ai mal à la tête à cette heure là !

ai pas tout compris steph ! sorry;)

vu que je stocke des valeurs absolue de positions, à un moment le comptage va bien déborder...enfin il me semble..

ai pas compris non plus le mode modulo evoqué par kosbor, re sorry ;)

j'ai encore des progrès à faire !!
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
kosbor
Aguerri de l'automation
Aguerri de l'automation
Messages : 83
Inscription : 23 oct. 2015, 18:29

Re: Spécial cahiers de vacances

Message par kosbor »

-Si on a un DINT (Cas le plus courant DB ou ioddt fabriquant):
donc max (2^31)-1 --> 2147483647 (2#0111_1111_1111_1111_1111_1111_1111_1111)
Si on fait 2147483647+1 --> -2147483648 (2#1000_0000_0000_0000_0000_0000_0000_0000)

Si on fait le comptage nous même dans une tache évènementielle lors du front impulsion codeur on fait :

ValeurCompeurCodeur:=ValeurCompeurCodeur+1) MOD 1 000 000 000 ;



-Si on a un UDINT:
donc max (2^32)-1 --> 4294967295 (2#1111_1111_1111_1111_1111_1111_1111_1111)
Si on fait 2147483647+1 --> 0 (2#0000_0000_0000_0000_0000_0000_0000_0000)

Si on fait le comptage nous même dans une tache évènementielle lors du front impulsion codeur on fait :

ValeurCompeurCodeur:=ValeurCompeurCodeur+1) ;









Dans les 2 cas on aurait pas besoin de faire du modulo
Mais dans le premier cas ce qui sera la majeur partie du temps il faut faire le modulo pour eviter d'avoir des valeurs negative ce qui est beaucoup plus propre mais ça marcherait sans
steph68
Codeur fou
Codeur fou
Messages : 268
Inscription : 21 oct. 2015, 08:23

Re: Spécial cahiers de vacances

Message par steph68 »

Mais dans le premier cas ce qui sera la majeur partie du temps il faut faire le modulo pour eviter d'avoir des valeurs negative ce qui est beaucoup plus propre mais ça marcherait sans
c'est une question d'interprétation du résultat.
les opérations mathématiques addition et soustraction se font de la même façon avec un DINT ou un UDINT, ça ne change absolument rien

ça va changer par contre pour une comparaison (qui n'est qu'une soustraction au final mais on prends en compte le bit de signe dans un cas et pas dans l'autre)
mais là, en l'occurence, ça ne pose aucun problème, car on compare une différence entre 2 mesures (on ne compare pas la mesure directement).

il faut mettre le modulo s'il est plus restrictif que celui de la capacité variable.
si tu règles ta carte de comptage avec un modulo 10000, il faut faire modulo 10000 après la soustraction

mais dans cette application, il ne faut pas configurer de modulo.

@+
kosbor
Aguerri de l'automation
Aguerri de l'automation
Messages : 83
Inscription : 23 oct. 2015, 18:29

Re: Spécial cahiers de vacances

Message par kosbor »

Re,
Apres reflexion la solution de l'exercice utilise un = pour comparé la CONSTANTE + ValeurCouranteCodeur
OK mais dans la pratique hormis dans la tache evenementiel (qui doit avoir le moins de code possible) on tombera rarement sur le = dans la tache principale
Donc on doit travailler avec fenetre - et +:
Je prend l'exemple pour une fenetre de 100 increment:
Au top capteur on est en PV à 2147483647:
-fenetre min 2147483547
-fenetre max -2147483549

Code : Tout sélectionner

IF (ValeurCouranteCodeur>=2147483547  AND ValeurCouranteCodeur<=-2147483549) THEN.........
Donc si on veut un truc qui marche mon idée est:
-de creer de seuil le debordement à 1 000 000 000
-de creer une variable "Overflow" dans la struct du registre
-lorqu'on fait :

Code : Tout sélectionner

ValeurCouranteCodeur:= ValeurCouranteCodeur MOD 1 000 000 000;
IF ImpulsCapteur THEN
	IF (ConstanteDistanceX + ValeurCouranteCodeur + 100 ) >= 1 000 000 000 THEN
		MyRegister[0].Overflow:=true;
	ELSE
		MyRegister[0].Overflow:=False;
	END_IF;		
	MyRegister[0].FenetreMin:=((ConstanteDistanceX + ValeurCouranteCodeur) MOD 1 000 000 000) - 100;
	MyRegister[0].FenetreMax:=((ConstanteDistanceX + ValeurCouranteCodeur) MOD 1 000 000 000) + 100;
	Rol(MyRegister,1);
END_IF;

Donc ensuite dans la boucle principale lorsqu'on fait:

Code : Tout sélectionner

IF Not MyRegister[i].Overflow AND (ValeurCouranteCodeur>=MyRegister[i].FenetreMin AND ValeurCouranteCodeur<=MyRegister[i].FenetreMax)  THEN
	Ejecteur:=true
ELSE_IF  MyRegister[i].Overflow AND (ValeurCouranteCodeur>=MyRegister[i].FenetreMin OR ValeurCouranteCodeur<=MyRegister[i].FenetreMax)  THEN
	Ejecteur:=true
END_IF;
Si quelqu'un a une autre solution?
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: Spécial cahiers de vacances

Message par itasoft »

slts,
@krosb
j'ai l'impression que t n'as encore pas vu la solution exemple donnée plus haut ???
Automaticien privé (de tout)
itasoft@free.fr
kosbor
Aguerri de l'automation
Aguerri de l'automation
Messages : 83
Inscription : 23 oct. 2015, 18:29

Re: Spécial cahiers de vacances

Message par kosbor »

Si tu parles de vider quand la bande est vide si je l'ai vu
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: Spécial cahiers de vacances

Message par itasoft »

non je parle de celle ci

cliquer dessus
solutionCodeur2.JPG
Automaticien privé (de tout)
itasoft@free.fr
kosbor
Aguerri de l'automation
Aguerri de l'automation
Messages : 83
Inscription : 23 oct. 2015, 18:29

Re: Spécial cahiers de vacances

Message par kosbor »

Oui je l'avais vu bien sur
Mais comme dit c'est qqchose de theorique, sans fenetre en pratique ça ne marchera pas
steph68
Codeur fou
Codeur fou
Messages : 268
Inscription : 21 oct. 2015, 08:23

Re: Spécial cahiers de vacances

Message par steph68 »

Mais comme dit c'est qqchose de theorique, sans fenetre en pratique ça ne marchera pas
c'est une simplification un peu brute que @itasoft a fait
dans la pratique, ça tient la route mais ce n'est pas un programme à "l'épreuve des balles" (toutes les situations possibles ne sont pas sous contrôle)
c'est un compromis entre simplicité vs fiabilité

dans les règles de l'art, il faut travailler sur un intervalle (fenêtre) comme tu dis @kosbor

Code : Tout sélectionner

Distance éjecteur - Tolérance < Codeur - Ref mémorisée du codeur < Distance éjecteur + Tolérance
@itasoft ne travaille que sur un seul seuil (et non 2)

Code : Tout sélectionner

Distance éjecteur < Codeur - Ref mémorisée du codeur
ou plutôt (qui revient au même mathématiquement)

Code : Tout sélectionner

Distance éjecteur + Ref mémorisée du codeur < Codeur
pour se débarrasser de la constante (au prix de ne plus conserver l'ordre de tri croissant du registre)

donc si le codeur fait des bonds, plus rien ne fonctionne correctement
maintenant, quelle est la probabilité que le codeur fasse +1000 points par exemple entre deux cycles de scrutation de l'automate ? quasiment nulle ... mais il y a la loi de Murphy (ou loi de l'emmerdement maximum :mrgreen: ) ...

je ne suis pas fan de l'approche de @itasoft mais la simplification vaut sûrement le coup d'y réfléchir ... faut juste pas trop être puriste :lol:

@+
kosbor
Aguerri de l'automation
Aguerri de l'automation
Messages : 83
Inscription : 23 oct. 2015, 18:29

Re: Spécial cahiers de vacances

Message par kosbor »

Autant pour moi je viens de regarder l'aide sur FIND_LT_***
je pensais que ça faisait une comparaison avec =

d'où le 7FFFFFFF lol je suis con
Répondre