Réinitialiser une tempo TON

Forum traitant des automates industriels de marque Wago et du logiciel codesys
JohanComble
Apprend le binaire
Apprend le binaire
Messages : 4
Inscription : 06 févr. 2022, 11:47

Réinitialiser une tempo TON

Message par JohanComble »

Bonjour,

J'ai une fonction CASE utilisée pour lancer une tempo de 5 minutes (ici 10s) trois fois avant de déclarer un défaut pressostat. J'aimerais tuer la tempo à chaque étape de mon case pour éviter qu'elle ne fasse boucler mes étapes à chaque fois. J'ai essayé diverses choses qui n'ont pas marché hélas. Je n'ai plus les idées claires après m'être abruti dessus si longtemps. La tempo est bien tuée mais elle est réécrasée tout de suite car les conditions lui permettent de revenir à TRUE

Code : Tout sélectionner

tempoContactPres(IN:= IoConfig_Globals_Mapping.etatPressAir , PT:=  T#10S);
tempoContactPres2(IN:= Def_Pres_Colle , PT:=  T#10S);
tempoContactPres3(IN:= Def_Pres_Colle2 , PT:=  T#10S);


CASE Cycle_Pres_Colle OF
	0:  
		IF IoConfig_Globals_Mapping.etatPressAir AND NOT IoConfig_Globals_Mapping.marcheVsoufflage AND tempoContactPres.Q THEN
		Def_Pres_Colle:= TRUE;
		Cycle_Pres_Colle :=1;
			IF (Cycle_Pres_Colle = 1) OR (Cycle_Pres_Colle =2) THEN
				tempoContactPres.IN:=FALSE;                                         // Comment tuer la tempo et qu'elle se réinitialise après un cycle 
                                                                                                                          complet?
			END_IF
		ELSE
			Def_Pres_Colle:= FALSE;
			Cycle_Pres_Colle :=0;
	   END_IF
	 
	 1: 
		IF Def_Pres_Colle AND IoConfig_Globals_Mapping.etatPressAir AND NOT IoConfig_Globals_Mapping.marcheVsoufflage AND tempoContactPres2.Q THEN
		Def_Pres_Colle2:= TRUE ;
		Cycle_Pres_Colle :=2;
                         IF (Cycle_Pres_Colle = 0) OR (Cycle_Pres_Colle =2) THEN
				tempoContactPre2s.IN:=FALSE;                                         // Comment tuer la tempo et qu'elle se réinitialise après un cycle 
                                                                                                                          complet?
			END_IF
		ELSE
			Def_Pres_Colle2:= FALSE;
			Cycle_Pres_Colle :=0;
	   END_IF
	  
	 2:
		IF Def_Pres_Colle2 AND IoConfig_Globals_Mapping.etatPressAir AND NOT IoConfig_Globals_Mapping.marcheVsoufflage AND TempoContactPres3.Q  THEN
		Def_Pres_Colle3:= TRUE ;
		Cycle_test_souffle := 0;                            // lance le second test (comparaison souffle pressostat.
		Cycle_Pres_Colle :=0;
                          IF (Cycle_Pres_Colle = 0) OR (Cycle_Pres_Colle =1) THEN
				tempoContactPres3.IN:=FALSE;                                         // Comment tuer la tempo et qu'elle se réinitialise après un cycle 
                                                                                                                          complet?
			END_IF
		ELSE
			Def_Pres_Colle3:= FALSE;
			Cycle_Pres_Colle :=0;
	   END_IF
	   
END_CASE


Merci à l'avance

PS: J'ai essayé les boucles FOR mais sans succès non plus. Oui je débute. ;-)

[EDIT de Brebiou] Ajout balise Code
DurandO
Expert de l'héxadécimal
Expert de l'héxadécimal
Messages : 396
Inscription : 21 mars 2021, 15:31

Re: Réinitialiser une tempo TON

Message par DurandO »

Bonjour,
à quoi servent ton comptage et la fonction case ?
pourquoi ne pas lancer une unique tempo de 10s (5 minutes au final) avec comme variable IN : IoConfig_Globals_Mapping.etatPressAir ?

Après, si tu souhaites absolument garder 3 <<niveaux>> de gravité, tu peux créer une cascade de tempos :
tempoContactPres(IN:= IoConfig_Globals_Mapping.etatPressAir , PT:= T#10S);
tempoContactPres2(IN:= tempoContactPres.Q , PT:= T#10S);
tempoContactPres3(IN:= tempoContactPres2.Q , PT:= T#10S);

Pour info:
1) une tempo pour être initialisée à besoin de voir l'entrée IN = False sur un tour de scrutation.
2) si ton case se fait sur la variable Cycle_Pres_Colle, il est inutile de tester cette même variable dans le cas qui suit ton CASE (voir en rouge ci-dessous)
JohanComble a écrit : 15 févr. 2022, 20:13 CASE Cycle_Pres_Colle OF
0:
IF IoConfig_Globals_Mapping.etatPressAir AND NOT IoConfig_Globals_Mapping.marcheVsoufflage AND tempoContactPres.Q THEN
Def_Pres_Colle:= TRUE;
Cycle_Pres_Colle :=1;
IF (Cycle_Pres_Colle = 1) OR (Cycle_Pres_Colle =2) THEN
tempoContactPres.IN:=FALSE; // Comment tuer la tempo et qu'elle se réinitialise après un cycle
complet?
END_IF
ELSE
Def_Pres_Colle:= FALSE;
Cycle_Pres_Colle :=0;
END_IF
Pour la boucle FOR, je te conseilles de bien comprendre le CASE dans un premier temps.
Durand.O
Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7037
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Réinitialiser une tempo TON

Message par itasoft »

slts,
es que ça veut dire que si le défaut (+tempo) apparaît et disparaît 3 fois de suite alors défaut , si c'est le cas il faut incrémenter un mot à chaque apparition du défaut
ex:

tempoContactPres(IN:= IoConfig_Globals_Mapping.etatPressAir , PT:= T#10S,Q=>EBOOL1);

IF RE(EBOOL1) THEN
INC(%MW0);
END_IF;

DEFAUT:=%MW0>=3;

(*Aquit défaut*)
if BP_Acquit then
%MW0:=0;
end_if;

Dernière modification par itasoft le 15 févr. 2022, 23:36, modifié 2 fois.
Automaticien privé (de tout)
itasoft@free.fr
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2076
Inscription : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Réinitialiser une tempo TON

Message par philou77 »

Salut !

+1 avec Itasoft..

Pour ma part je comprends :

1 Apparition Défaut Provisoire ET NOT RESET -> Lancer Tempo 5 min, Reset = False
2- Fin Tempo -> (défaut provisoire toujours là - c'est implicite vu que le défaut lance la tempo) ET NOT DEFAUT-> Compteur = Compteur +1 , Reset = True
3 - Si plus de défaut provisoire -> Compteur= 0,
4 - Si Compteur >= 3 -> Defaut = 1,
5 - Acquitter le défaut -> Compteur=0;
Code :
Point n° 1
tempoContactPres(IN:= IoConfig_Globals_Mapping.etatPressAir AND NOT Reset, PT:= T#10S);
Reset:=False;

Point N°2
IF tempoContactPres.Q AND IoConfig_Globals_Mapping.etatPressAir AND NOT DEFAUT THEN
Cycle_Pres_Colle :=Cycle_Pres_Colle+1;
Reset:=True;
END_IF;


Point N°3
IF NOT IoConfig_Globals_Mapping.etatPressAir THEN
Cycle_Pres_Colle :=0;
END_IF;


Point N°4 Defaut:= (Cycle_Pres_Colle>=3);
Point N°5 If ACQ THEN Cycle_Pres_Colle:=0; END_IF;

Cette Programmation suppose que le défaut RESTE PRESENT TOUT LE TEMPS et UTILISER UNE TEMPO TON , ce que je suppose être ton cas.
C'est le BOOL Reset qui est dans l'équation de IN de la tempo qui permet de relancer la tempo (par sa mise à VRAI), l'astuce étant de le remettre à Faux tout de suite après avoir lancé la tempo.
Il faut Acquitter le défaut en remettant Compteur à 0
Si le défaut est intermittent, prendre la solution d'itasoft et prévoir une condition pour remettre à 0 le comptage afin de ne pas cumuler les défauts sur une période trop longue !

Ce que je comprend moins c'est le Cycle test souffle.
- Si c'est un test d'un autre défaut dans le même style, faut faire la même chose avec tempo, Reset et compteur différents.
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
DurandO
Expert de l'héxadécimal
Expert de l'héxadécimal
Messages : 396
Inscription : 21 mars 2021, 15:31

Re: Réinitialiser une tempo TON

Message par DurandO »

philou77 a écrit : 15 févr. 2022, 22:22 Pour ma part je comprends :
Et bien tu as de la chance.
Parce que moi je ne comprends toujours pas l'intérêt de compter 3 fois 5 min pour activer un défaut au bout des 15 min.

Si c'est pour traiter un genre de pré-alerte, on peut peut-être lui conseiller quelque chose de simple, des tempos en cascade ou ceci :

Code : Tout sélectionner

tempoContactPres (IN := IoConfig_Globals_Mapping.etatPressAir (*BOOL*),
       PT := T#30m(*TIME*),     
       ET =>temps (*TIME*));
DefColle := (temps>T#5m);
DefColle2 := (temps>T#10m);
DefColle3 := (temps>T#15m);
       
On peut aussi lui conseiller de faire un organigramme décrivant ce qu'il veut faire exactement pour ensuite lui proposer le code qui convient.
Parce qu'on ne sait pas s'il souhaite qu'à la marche soufflage sa tempo soit initialisée, etc...

Durand.O
Gigi
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 145
Inscription : 13 janv. 2022, 22:51
Localisation : Tourcoing

Re: Réinitialiser une tempo TON

Message par Gigi »

Je crois que c'est un truc du genre qu'il veut faire.
En gros si le défaut persiste trois cycle de 5 minutes complet on l'affiche si le défaut disparait pendant les 5 minutes on ne finit pas la tempo et ainsi de suite.(une seule tempo suffit dans ce cas).On a la valeur du compteur a disposition au cas ou.
voir Grafcet ci-dessous.
cycle de trois défaut.png
cycle de trois défaut.png (7.48 Kio) Consulté 1691 fois
[EDIT de Brebiou] Redimensionnement de l'image
C'est en forgeant qu'on devient forgeron !
JohanComble
Apprend le binaire
Apprend le binaire
Messages : 4
Inscription : 06 févr. 2022, 11:47

Re: Réinitialiser une tempo TON

Message par JohanComble »

Merci à tous pour vos propositions et conseils. J'ai appris quelques trucs grâce à vous! C'est là le principal attrait du métier.

Voici la solution testée et qui marche (à la fin des trois tempos je lance le test de variation de température de soufflage):

Code : Tout sélectionner

tempoContactPres (IN := IoConfig_Globals_Mapping.etatPressAir (*BOOL*),PT := T#5M);
tempoContactPres2(IN:= tempoContactPres.Q , PT:= T#5M);
tempoContactPres3(IN:= tempoContactPres2.Q , PT:= T#5M);
	   	 
IF IoConfig_Globals_Mapping.etatPressAir AND NOT IoConfig_Globals_Mapping.marcheVsoufflage AND tempoContactPres.Q THEN
	Def_Pres_Colle := TRUE;
	IF tempoContactPres2.Q THEN
		Def_Pres_Colle2 := TRUE;
	END_IF
	IF tempoContactPres3.Q THEN
		Def_Pres_Colle3 := TRUE;
		TestTempSoufflage:=TRUE;
	END_IF
ELSE
	Def_Pres_Colle :=  FALSE;
	Def_Pres_Colle2 := FALSE;
	Def_Pres_Colle3 :=  FALSE;
	TestTempSoufflage := FALSE;
END_IF

Encore merci à tous

[EDIT de Brebiou] Ajout balise Code
philou77
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2076
Inscription : 21 oct. 2015, 10:00
Localisation : Ile de France

Re: Réinitialiser une tempo TON

Message par philou77 »

DurandO a écrit : 16 févr. 2022, 11:03
philou77 a écrit : 15 févr. 2022, 22:22 Pour ma part je comprends :
Et bien tu as de la chance.
Parce que moi je ne comprends toujours pas l'intérêt de compter 3 fois 5 min pour activer un défaut au bout des 15 min.

Si c'est pour traiter un genre de pré-alerte, on peut peut-être lui conseiller quelque chose de simple, des tempos en cascade ou ceci :

Code : Tout sélectionner

tempoContactPres (IN := IoConfig_Globals_Mapping.etatPressAir (*BOOL*),
       PT := T#30m(*TIME*),     
       ET =>temps (*TIME*));
DefColle := (temps>T#5m);
DefColle2 := (temps>T#10m);
DefColle3 := (temps>T#15m);
       
On peut aussi lui conseiller de faire un organigramme décrivant ce qu'il veut faire exactement pour ensuite lui proposer le code qui convient.
Parce qu'on ne sait pas s'il souhaite qu'à la marche soufflage sa tempo soit initialisée, etc...

Durand.O
Victoire, j'avais bien compris !! LOL

PS : Ma solution fait ce qu'il veux avec une seule tempo ! l'important est qu'il ait réussi a faire ce qu'il désirait.

Sympa aussi et presque plus simple de comparer le ET d'une seule tempo !
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D
Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7037
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Réinitialiser une tempo TON

Message par itasoft »

slts,
Parce que moi je ne comprends toujours pas l'intérêt de compter 3 fois 5 min pour activer un défaut au bout des 15 min.
-------
LOL
Automaticien privé (de tout)
itasoft@free.fr
Répondre