Spécial cahiers de vacances
-
- Mi homme - Mi automate
- Messages : 2076
- Inscription : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: Spécial cahiers de vacances
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 !!
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 !
Re: Spécial cahiers de vacances
-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
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
Re: Spécial cahiers de vacances
c'est une question d'interprétation du résultat.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
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.
@+
Re: Spécial cahiers de vacances
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
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 :
Donc ensuite dans la boucle principale lorsqu'on fait:
Si quelqu'un a une autre solution?
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.........
-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;
- itasoft
- Mi homme - Mi automate
- Messages : 7037
- Inscription : 20 oct. 2015, 10:15
- Localisation : Lyon
- Contact :
Re: Spécial cahiers de vacances
slts,
@krosb
j'ai l'impression que t n'as encore pas vu la solution exemple donnée plus haut ???
@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
itasoft@free.fr
Re: Spécial cahiers de vacances
Si tu parles de vider quand la bande est vide si je l'ai vu
- itasoft
- Mi homme - Mi automate
- Messages : 7037
- Inscription : 20 oct. 2015, 10:15
- Localisation : Lyon
- Contact :
Re: Spécial cahiers de vacances
non je parle de celle ci
cliquer dessus
cliquer dessus
Automaticien privé (de tout)
itasoft@free.fr
itasoft@free.fr
Re: Spécial cahiers de vacances
Oui je l'avais vu bien sur
Mais comme dit c'est qqchose de theorique, sans fenetre en pratique ça ne marchera pas
Mais comme dit c'est qqchose de theorique, sans fenetre en pratique ça ne marchera pas
Re: Spécial cahiers de vacances
c'est une simplification un peu brute que @itasoft a faitMais comme dit c'est qqchose de theorique, sans fenetre en pratique ça ne marchera pas
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
Code : Tout sélectionner
Distance éjecteur < Codeur - Ref mémorisée du codeur
Code : Tout sélectionner
Distance éjecteur + Ref mémorisée du codeur < Codeur
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 ) ...
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
@+
Re: Spécial cahiers de vacances
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
je pensais que ça faisait une comparaison avec =
d'où le 7FFFFFFF lol je suis con