Your Article has been successfully published.
Engineering Electronics Engineering 635 0 1

Régulation du déplacement d'un moteur en position

Le CODE cest du texte structuree (ST) (une derivee de l'ancien code pascal) qui est tres utilisee dans la programmation des automates.

- ici cest la programmation de tout les parties essenteilles pour le commande du moteur


1-)   (regulateur programmee) surtout tres efficace (^-^)


FUNCTION_BLOCK Verbesserte_PI_Regler
VAR_INPUT
	ek:REAL:=0;
	kp:REAL:=0;
	Tn:REAL:=9999.9;
	T0:REAL:=0;
	Min_Stell:REAL;     (*Kleinster Wert der Stellgröße*)
	Max_Stell:REAL;  (*Grösster Wert der Stellgröße*)
	disk:BOOL;
END_VAR
VAR_OUTPUT
	yk:REAL;
END_VAR
VAR
	kid:REAL:=0;
	Tikorr:REAL:=0.5;
	Intkorr:REAL:=0;
	ek1:REAL:=0;
	yi:REAL:=0;
	yi1:REAL:=0;
	ykk:REAL:=0;
END_VAR

IF disk = TRUE THEN
kid:=kp*T0/(2*Tn);
END_IF

Intkorr:=T0*(ykk-yk)/(Tikorr);
yi:=yi1+kid*ek +kid*ek1- Intkorr;
ek1:=ek;
yi1:=yi;
ykk:=kp*ek+yi;

(*Begrenzung P und I-Anteil*)

IF ykk< Min_Stell THEN
yk:=Min_Stell;
ELSIF ykk>Max_Stell THEN
yk:=Max_Stell;
ELSE
yk:=ykk;
END_IF


2-)  Alimentaion du moteur ceci en en forme de rampe



FUNCTION_BLOCK Rampe
VAR_INPUT
	T_hoch:REAL;
	Endwert:REAL;
	b:REAL;
	Zykulszeit:REAL;
END_VAR
VAR_OUTPUT
	y:REAL;
END_VAR
VAR
	i:REAL;
	a: REAL;
	zyklusAnzahl:REAL;
END_VAR




(*Funktion einer Rame definieren*)

zyklusAnzahl:=T_hoch/Zykulszeit;
a:=Endwert/zyklusAnzahl;

 IF  y< Endwert THEN

y:=a*i+b;
i:=i+1;

END_IF




3-) Seconde alimentation c.a.d soit celle si soit la rampe et celle si a la forme dune function





FUNCTION_BLOCK Fahrkurve
VAR_INPUT
	S0: REAL;
	t_0: REAL;
	Tvs:REAL;    (*Verschliffzeit*)
	Th:REAL;     (*Hochlaufzeit*)
END_VAR
VAR_OUTPUT
	y: REAL;
END_VAR
VAR
	i:INT;
	S1: REAL;
	S2: REAL;
	S3: REAL;
	button: BOOL;
	t:REAL;
	writting:REAL;
END_VAR




(*IF button=TRUE THEN*)
                  IF t>=0 AND t<=Tvs THEN

                           S1:=(S0/(2*Tvs*(Th-Tvs)))*(EXPT(t,2));

                  END_IF

                 IF t>=Tvs AND t<=Th-Tvs  THEN

                           S2:= (S0/(Th-Tvs))*(t-Tvs);

                END_IF
                 IF t>=(Th-Tvs)  AND t<=Th  THEN

                           S3:= (S0/(2*Tvs*(Th-Tvs))) * (EXPT(Tvs,2)-(EXPT(t-Th,2)));

                END_IF
               y:=s1+s2+s3;

i:=i+1;
t:=t_0*i;

(*END_IF*)




4-) ceci cest la commande avant c.a.d ce aui se charge de verifier que le moteur ne perde pas le fil de la tensin dentree



FUNCTION_BLOCK Dt1_glied
VAR_INPUT
	yk:REAL;
	disk:BOOL;
	kd:REAL;
	T:REAL;
	T0:REAL;
END_VAR
VAR_OUTPUT
	xk:REAL:=0;
END_VAR
VAR
	xk1:REAL:=0;
	yk1:REAL:=0;
	c1:REAL;
	d0:REAL;
END_VAR






IF disk=TRUE THEN
	(*Disskretisieren*)
	c1:=(T0-2*T)/(T0+2*T);
	d0:=(kd)/(T+T0/2);
END_IF

xk:=-c1*xk1+d0*yk-d0*yk1;
yk1:=yk;
xk1:=xk;




5-) ceci cest le facteur de position aui permet de nous liberee la position du moteur



FUNCTION_BLOCK Lageregler
VAR_INPUT
	e0:REAL;
	Kv:REAL;
END_VAR
VAR_OUTPUT
	y1:REAL;
END_VAR
VAR

END_VAR





(*Prgramm wird geschrieben*)     (*lintervalle de programmation vari de -10v a 10v*)

y1:=Kv * e0;

IF (y1 >10) THEN
	y1:=10;
ELSIF (y1< -10) THEN
	y1:=-10;
END_IF






6-) la cest la classe principale ou tout les programmes seront appelee 





PROGRAM PLC_PRG
VAR
(* Ein- und Ausgaenge *)

	(*Encoder:FB_Encoder_5101;*)
	Dt1new:Dt1_glied;
	(*pinew:Pi_Regler;*)
	pi_verbessert:Verbesserte_PI_Regler;
	Lageregler:Lageregler;
	(*pinew2:Pi_Regler;
	pt1new:Pt_1_glied;
	pt2new:pt_2_glied;*)
	Rampe:Rampe;
	fahr:Fahrkurve;

	W:REAL;
	Lage:REAL;
	y1: REAL;
	e0:REAL;
	e1: REAL;
	y:REAL;
	e2: REAL;
	xk: REAL;
	X_aus:REAL;
(*Aufgabe4, 2*)
	N: REAL;
	Anfangswert: REAL:=40;
	e:REAL;
	X1: REAL;
	Schleppabstand:REAL;

	Encodr: PCF8591_AIO;
	Drehzahl:BYTE;
	position:BYTE;
	fZyklusZeit:REAL;
	fAusgang1:REAL;
	fAusgang:BYTE;
END_VAR







(* Zykluszeit *)
fZyklusZeit :=Encodr.t;
(*Parameter des InnenRegler*)
fahr(
	S0:=2 ,
	t_0:=fZyklusZeit  ,
	Tvs:=1.34 ,
	Th:=8,
	y=> W);

Dt1new(
	yk:=W ,
	disk:=TRUE ,
	kd:= 0.908,
	T:= 0.02,
	T0:=fZyklusZeit ,
	xk=>xk );
(*Hier Programm einfügen*)

e1:= W - Lage;

Lageregler(e0:=e1 , Kv:= 1.54, y1=> X1);
Encodr(
	usiAddress:= , 
	CNF:= , 
	OUT:= fAusgang,                  (*(Anfangswert) *)
	IN_A=> Drehzahl , 
	IN_B=> position, 
	IN_C=> , 
	IN_D=> , 
	STATE=> );
	N:=BYTE_TO_REAL(Drehzahl);
	Lage:=BYTE_TO_REAL(position);
	fAusgang:=REAL_TO_BYTE(fAusgang1);
(*Lager_Position*)


e2:= X1 +xk- N;

pi_verbessert(
	ek:= e2,
	kp:=0.46 ,
	Tn:= 0.5,
	T0:=fZyklusZeit  ,
	Min_Stell:= -10,
	Max_Stell:= 10,
	disk:=TRUE ,
	yk=> fAusgang1);
Schleppabstand:=W -Lage;


(*(* Zykluszeit *)
fZyklusZeit :=Encodr.t;
(*
fahr(
	S0:= ,(*5*)
	t_0:=fZyklusZeit  ,
	Tvs:= , (*2*)
	Th:=6 , (*6*)
	y=> w1);
(*Hier Programm einfügen*)

 (*Parameter von der rückkopplog von aussen bekommen*)
         Z0:=fAusgang2;
*)
(*Rampefunktion definieren*)

(*Rampe(
	T_hoch:= 10,
	Endwert:= 5,
	b:= 0,
	Zykulszeit:=fZyklusZeit ,
	y=>w1 );*)

(*Rampe(
	T_hoch:= 8,
	Endwert:= 30,
	b:= 0,
	Zykulszeit:=fZyklusZeit ,
	y=>W );
*)

(*Parameter des InnenRegler*)
fahr(
	S0:=30 ,
	t_0:=fZyklusZeit  ,
	Tvs:=1.34 ,
	Th:=8,
	y=> W);

Dt1new(
	yk:=W ,
	disk:=TRUE ,
	kd:= 0.908,
	T:= 0.02,
	T0:=fZyklusZeit ,
	xk=>xk );
(*Hier Programm einfügen*)

e1:= W - Lage;

Lageregler(e0:=e1 , Kv:= 1.54, y1=> X1);
(*
Encoder(
	bSetCounter:= ,
	nSetCounterValue:= ,
	bSetStartPosEnde:= ,
	rSetStartPosValue:= ,
	bSet_Umin_Us:= TRUE,
	rSetStreckeEnde:= Anfangswert,
	nCounterValue=> ,
	rDrehzahl=> N,
	rStrecke=>Lage ,
	bErr=> ,
	nERRID=> );
*)
Encodr(
	usiAddress:= , 
	CNF:= , 
	OUT:= fAusgang,                  (*(Anfangswert) *)
	IN_A=> Drehzahl , 
	IN_B=> position, 
	IN_C=> , 
	IN_D=> , 
	STATE=> );
	N:=BYTE_TO_REAL(Drehzahl);
	Lage:=BYTE_TO_REAL(position);
	fAusgang:=REAL_TO_BYTE(fAusgang1);
(*Lager_Position*)

(*Lage(n:=N , t:= fZyklusZeit , Lage=> lager);*)



e2:= X1 +xk- N;

pi_verbessert(
	ek:= e2,
	kp:=0.46 ,
	Tn:= 0.5,
	T0:=fZyklusZeit  ,
	Min_Stell:= -10,
	Max_Stell:= 10,
	disk:=TRUE ,
	yk=> fAusgang1);
Schleppabstand:=W -Lage;
(*(*Fahrkurve*)
fahr(
	S0:=5 ,(*5*)
	t_0:=fZyklusZeit  ,
	Tvs:= 2, (*2*)
	Th:=6 , (*6*)
	y=> w1);

(*Vorsteuerung*)
Dt1new(
	yk:=w1 ,
	disk:=TRUE ,
	kd:= ,
	T:= ,
	T0:=fZyklusZeit ,
	xk=>xk );

e0:=w1-lager;
Lageregler(e0:=e0 , Kv:= , y1=> y1);

e1:= xk+y1;
n:=fEingang1;   (*Ausgang des Motors*)
e2:=e1-n; (*e2=e1-n;*)

(*new Drehzahlregler*)
pi_verbessert(
	ek:=e2 ,
	kp:= ,
	Tn:= ,
	T0:=fZyklusZeit,
	Min_Stell:= ,
	Max_Stell:= ,
	disk:=TRUE ,
	yk=>y );
y:=fAusgang1;   (*Eingang des Motors*)
(*Lager_Regler*)
Lage(n:=n , t:= fZyklusZeit , Lage=> lager);
*)
(* Einlesen und Ausgabe *)
*)

Le Moteur électriquement parlant peut être alimenté grâce à une source de tension.

Mais le Problème Principal est que en alimentant cela rudimentairement on ne peut controller le déplacement de ce moteur c.a.d si on a une bande sur laquelle on voudrai faire deplacer des carton avec une position exacte jusqua la prochaine station par exemple on devra mettre en entrer une tension bien precise par exemple 30V qui representerons des distances en fonction du point que lon veut atteindre.

Exemple:

j'ai un carton placée sur une bande et j'aimerai le faire se déplacer de 30 mètres. Alors je peux à l'entrée du Moteur mettre 30 Volt (varie en fonction du programme) ceci sera transformé par le circuit de la photo ci dessous pour pouvoir deplacer notre moteur:

A noter ici que notre moteur est muni d'un encodeur qui dispose de certaines entrée et certaines sorties oui seront utiles pour la regulation du moteur.

On a par exemple l'encodeur:

  •  le nombre de tour en seconde
  • la position actuelle du moteur
  • le facteur de deplacement et bien dautres encore.

Grâce à ce système il est possible de commander des grandes stations pour le déplacement d'articles dans les magasins par exemple et aussi pour les tris de cartons par rapport au lieux où ils doivent aller comme par exemple (certains grands magasins comme Amazon ou Tchibo).

Le programme a été par la suite ecrit en langage ST (avec Codesys).

 

Fore more information, Contact me

Published on 29.11.2017
Updated on 29.11.2017

Author

author_picture

Fan des Systemes automatiques

× You should join the community to follow members.

Share this Article on Social Media

1 Like

Liker

0 Comment

You are not logged in. Please sign in to leave a comment.

More Articles from Kevin Gueteu

articles_icon Related Articles