PID autotune - la méthode du relais

Partie du forum pour tout ce qui concerne la partie régulation dans l'industrie. Forum, conseil, astuce et entraide sur les calculs de régulateurs, les différents choix de P, PI ou PID, leur utilisation et la résolution de problèmes..
Avatar de l’utilisateur
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 29 oct. 2015, 14:22
Localisation : IDF

PID autotune - la méthode du relais

Message par Cyril93 »

Bonjour à tous,

Je savais pas trop ou poster, soit dans tutoriel ou régulation ou codesys ?

Le sujet à déjà été évoqué mais comme je viens de retravailler dessus.
J'ai utilisé la méthode de Åström-Hägglund décrite dans les photos ci jointes, elle fonctionne bien et permet de gagner du temps par rapport à Ziegler et Nichols. Elle permet aussi de ne pas trop "pousser" le système et de garder le contrôle sur le process.
Je poste le code réalisé sur Codesys V2.3, j'ai utilisé les fonctions statistiques et mesure de fréquence de la biblio "Util" fourni par 3S.

Code : Tout sélectionner

FUNCTION_BLOCK CALC_PID
VAR_INPUT
	bEN : BOOL;						(* Démarre la séquence par le front montant *)
	rSP : REAL;						(* Point de consigne *)
	rPV: REAL;						(* Mesure process *)
	byCY: BYTE:=20;					(* Nombre de cycle du réglage automatique *)
	bRST: BOOL;						(* Remise à zéro *)
	rL_VAL: REAL;						(* Valeur basse pour la sortie *)
	rH_VAL: REAL;						(* Valeur haute pour la sortie *)
	byPERF: BYTE;						(* Performances des constantes PID : 0=rapides, 1=normales, 2=lentes *)
END_VAR
VAR_OUTPUT
	bEND: BOOL;						(* Fin séquence *)
	rSQ_VAL: REAL;						(* Sortie onde carrée pour l'exitation du process *)
	rKP: REAL;							(* Gain proportionnel *)
	rTN: REAL;						(* Temps d'intégrale *)
	rTV: REAL;						(* Temps de dérivée *)
END_VAR
VAR
	PU: REAL;							(* Gain ultime *)
	TU: REAL; 						(* Période ultime *)
	b: REAL; 							(* Amplitude de PV *)
	a: REAL;							(* Amplitude de SQ_VAL *)

	b_Stat: STATISTICS_REAL;
	Tu_Freq: FREQ_MEASURE;

	status: BYTE;
	cpt: BYTE;
	TrigEn: R_TRIG;
	TrigEnd: R_TRIG;
	End: BOOL;

END_VAR
VAR CONSTANT
	PI: REAL:=3.14159265358979323846264338327950288;
END_VAR

(*** Séquence autotune ***)

IF bRST THEN
	status:=0;
END_IF

TrigEn(CLK:= bEN);

CASE status OF
0: (* Attente Démarrage autotune *)
	rSQ_VAL:=rL_VAL;
	IF TrigEn.Q THEN
		b_Stat.RESET:=TRUE;
		Tu_freq.RESET:=TRUE;
		rKP:=0;
		rTN:=0;
		rTV:=0;
		cpt:=0;
		bEND:=FALSE;
		status:=1;
		End:=FALSE;
	END_IF

1: (* Onde carrée haute *)
	rSQ_VAL:=rH_VAL;
	IF rPV > rSP THEN
		rSQ_VAL:=rL_VAL;
		cpt:=cpt+1;
		status:=2;
	END_IF

2: (* Onde carrée basse et fin de séquence *)
	IF rPV < rSP THEN
		cpt:=cpt+1;
		IF cpt >= byCY THEN
			status:=1;
			End:=TRUE;
		ELSE
			status:=1;
		END_IF
	END_IF

END_CASE

(*** Calcul des paramètres ***)

(* min/max et freq de PV  *)
b_Stat(
	IN:= rPV,
	RESET:= ,
	MN=> ,
	MX=> ,
	AVG=> );


(* Nbre de période de FREQ_MEASURE *)
Tu_Freq.PERIODS:=(byCY/2)-1;
Tu_Freq.PERIODS:=LIMIT(1, Tu_Freq.PERIODS, 10);

Tu_Freq(
	IN:= rPV > rSP,
	PERIODS:=,
	RESET:= ,
	OUT=> ,
	VALID=> );

b_Stat.RESET:=FALSE;
Tu_freq.RESET:=FALSE;

TrigEnd(CLK:= End AND Tu_Freq.OUT <> 0);

IF TrigEnd.Q THEN
	(* amp de SQ_VAL *)
	a:=rH_VAL-rL_VAL;

	(* amp de PV *)
	b:=b_Stat.MX-b_Stat.MN;

	(* Gain et période ultime *)
	PU:=(4 * b)/(PI * a);
	TU:=1/Tu_Freq.OUT;

	(* Valeur PID *)
	CASE byPERF OF
	0:(* Performances rapides *)
		rKP:= 0.6 * PU;
		rTN:= 0.5 * TU;
		rTV:= 0.125 * TU;

	1:(* Performances normales *)
		rKP:= 0.25 * PU;
		rTN:= 0.5 * TU;
		rTV:= 0.125 * TU;

	2:(* Performances lentes *)
		rKP:= 0.15 * PU;
		rTN:= 0.5 * TU;
		rTV:= 0.125 * TU;
	END_CASE

	bEND:=TRUE;
	status:=0;

END_IF
END_FUNCTION_BLOCK

Edit : Mise à jour du code suite à un bug de mesure de la période
Pièces jointes
RelayMethod1.PNG
RelayMethod2.PNG
RelayMethod3.PNG
Dernière modification par Cyril93 le 04 mai 2016, 11:14, modifié 2 fois.
Lorent2
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 27 déc. 2015, 08:52

Re: PID autotune - la méthode du relais

Message par Lorent2 »

Va falloir que je tente de l'adapter sur un S7-300. Ca peut m’intéresser, mais va falloir que je traduise ton prog.
Si quelquefois tu te sens petit, inutile, démoralisé ou dépressif, n'oublies jamais que tu as été un jour le plus rapide et le meilleur spermatozoïde de ta bande ...
Avatar de l’utilisateur
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 29 oct. 2015, 14:22
Localisation : IDF

Re: PID autotune - la méthode du relais

Message par Cyril93 »

Salut lorent2,
Je peux t'aider si tu veux ?
ll faudra refaire les fonctions FREQ_MEASURE et STATISTICS_REAL. Tu bosses avec Step7 ou Tia Portal ?
Lorent2
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 27 déc. 2015, 08:52

Re: PID autotune - la méthode du relais

Message par Lorent2 »

Ca m'intéresse, je suis sous Step 7
Si quelquefois tu te sens petit, inutile, démoralisé ou dépressif, n'oublies jamais que tu as été un jour le plus rapide et le meilleur spermatozoïde de ta bande ...
Avatar de l’utilisateur
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 29 oct. 2015, 14:22
Localisation : IDF

Re: PID autotune - la méthode du relais

Message par Cyril93 »

Ok je vais voir pour migrer la fonction sur Step7 SCL ;)
Avatar de l’utilisateur
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 29 oct. 2015, 14:22
Localisation : IDF

Re: PID autotune - la méthode du relais

Message par Cyril93 »

Salut,
Pour la fonction Autotune sous STEP7 V5.5, suivre le lien pour downloader les sources SCL.

https://www.sendspace.com/file/wy4jky

J'ai intégré la fonction STATISTICS_REAL directement dans CALC_PID
J'ai tester sur PLCSIM . Donc n'hésitez pas à faire des retours.
Avatar de l’utilisateur
ProfnovA
Créateur de langage
Créateur de langage
Messages : 525
Inscription : 21 oct. 2015, 08:21

Re: PID autotune - la méthode du relais

Message par ProfnovA »

MERCI. Très utile
Avatar de l’utilisateur
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 29 oct. 2015, 14:22
Localisation : IDF

Re: PID autotune - la méthode du relais

Message par Cyril93 »

De rien :D
si tu veux importer les sources dans le TIA (ou pour quelqu'un d'autre), il faut déclarer la variable PI dans les "Constantes utilisateur"
et modifier dans le fb FREQ_MEASURE les lignes suivantes avec ce code.

Ligne 22

Code : Tout sélectionner

#OUT := #OUT + DINT_TO_REAL(#ADIFF[#I]);
Ligne 33

Code : Tout sélectionner

ELSIF #INIT AND #VALID AND TIME_TO_DINT(TIME_TCK()-#OLDT) > REAL_TO_DINT(#OUT*3000) THEN
Avatar de l’utilisateur
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 29 oct. 2015, 14:22
Localisation : IDF

Re: PID autotune - la méthode du relais

Message par Cyril93 »

J'ai migré les fonctions sous Unity Pro, si ça intéresse quelqu'un envoyer moi un MP ;)
Lorent2
Maître du binaire
Maître du binaire
Messages : 484
Inscription : 27 déc. 2015, 08:52

Re: PID autotune - la méthode du relais

Message par Lorent2 »

J'ai enfin réussi à créer mes blocs à partir de tes sources (manque de temps). Juste deux corrections qui sont nécessaires :

Code : Tout sélectionner

FUNCTION_BLOCK CALC_PID
TITLE = 'CALC_PID'
doit être écrit

Code : Tout sélectionner

FUNCTION_BLOCK FB1
TITLE = 'CALC_PID'
pour pouvoir être compilé et créé (également pour la seconde source).

Me reste ensuite à l'implémenter sur ma CPU et à tester sur une boucle actuelle de régul pour voir son comportement physique, en espérant avoir compris le fonctionnement du bloc.
Si quelquefois tu te sens petit, inutile, démoralisé ou dépressif, n'oublies jamais que tu as été un jour le plus rapide et le meilleur spermatozoïde de ta bande ...
Répondre