You are on page 1of 57

CAPITOLUL 10

SIMULAREA I CONTROLUL SISTEMELOR LINIARE


Simularea este procesul ce permite studiul unui sistem prin utilizarea
unui model matematic al sistemului fizic. Uzual, simularea este utilizat
pentru analiza sistemelor i luarea deciziilor necesare n scopul realizrii
unor produse ct mai eficiente. Cteva argumente privind necesitatea
etapelor de simulare n diversele faze ale dezvoltrii unui produs sunt:
-unele sisteme sunt extrem de complexe i nelegerea modului n care
diferitele subsisteme interacioneaz ntre ele sau cu exteriorul, nu este
posibil fr utilizarea unui model dinamic;
-dac sistemul supus analizei nc nu a fost construit, utilizarea modelrii
i simulrii permite obinerea unor informaii cu privire la comportarea n
realitate a sistemului;
-simularea permite realizarea de experimente fr ca sistemul real s fie
perturbat, aspect important n cazul unor aplicaii;
-deoarece modelul este simulat pe calculator, experimentele pot fi
realizate n timp compresat sau dilatat. Ca urmare, se pot studia unele
procese ce necesit un timp lung sau procese a cror desfurare este
foarte rapid;
-simularea unui sistem ce urmeaz a fi realizat dar i a unui sistem
existent este util i prin faptul c poate conduce la obinerea unor noi
soluii mai eficiente.
Dei utilizarea simulrii ofer numeroase avantaje, exist i o
serie de dezavantaje ce deriv n bun msur din ateptarea unor
rezultate exagerate:
-simularea nu ofer rezultate utile dac datele de intrare nu sunt suficient
de precise. Chiar dac modelul utilizat este foarte precis, utilizarea unor
date de intrare incorecte conduce la obinerea unor rezultate incorecte.
-simularea nu poate da soluii simple problemelor complexe. Dac
sistemul analizat conine multe componente care interacioneaz, uzual se
ia n considerare fiecare element separat i implicit sunt realizate unele
simplificri. Fr aceste simplificri, modelul poate fi extrem de
complex, cu aceste simplificri modelul poate reprezenta greit realitatea.
Ca urmare nu trebuie ignorate elementele critice ale unui sistem i trebuie
realizat un compromis adecvat ntre precizie i complexitatea modelului.
-simularea nu rezolv problema propriu zis. Simularea poate contribui
doar la nelegerea mai bun a modului de funcionare a unui sistem.
198

Exist numeroase produse soft de simulare, multe dintre ele fiind


dedicate unor domenii specifice de interes. Mediul Delphi poate fi utilizat
pentru a realiza aplicaii simple sau complexe de simulare a unor
componente din structura sistemelor mecatronice. n cadrul acestui
capitol ne vom concentra asupra simulrii utilizrii algoritmilor de
control, considernd sistemele liniare. Desigur, sistemele mecatronice au
n bun msur un caracter neliniar, de aceea n capitolele urmtoare se
vor avea n vedere i controlul acestor sisteme. Putem defini obiectivele
acestui capitol:
-prezentarea i utilizarea componentei TeeChart pentru realizarea
reprezentrilor grafice;
-prezentarea i utilizarea interfeei multidocument ;
-simularea unui proces liniar;
-simularea controlerului bipoziional;
-simularea controlerului proporional-integrativ-derivativ (PID);
-utilizarea metodelor de optimizare;
-identificarea sistemelor liniare (algoritmul celor mai mici
ptrate);
-utilizarea algoritmilor de control adaptiv-predictiv.
10.1 Simularea sistemelor liniare
Pentru a putea simula modul de funcionare a unui sistem, primul
aspect pe care trebuie s l avem n vedere este modul (numeric, grafic,
sau ambele) n care vom face reprezentarea diferitelor semnale ce apar.
Trebuie s avem n vedere faptul c numrul semnalelor sau mrimilor
calculate ce prezint interes poate fi relativ mare. De aceea pentru
nceput ne vom concentra asupra utilizrii unor componente ce pot fi
folosite pentru acest scop, construind aplicaia de la zero.
Vom ncepe prin a denumi formularul principal (proprietatea
Caption): Simularea proceselor liniare. Din bara de componente
Standard se alege i se depune pe formular componenta MainMenu.
Utiliznd mouse-ul se efectueaz dublu clic (sau un clic cu butonul drept)
pe componenta MainMenu. Din meniul flotant ce se deschide se alege
comanda Menu Designer. Se deschide un dreptunghi (care este i
selectat) iar numele primului element din meniu se poate introduce n
proprietatea Caption (n Object Inspector este selectat automat elementul
de meniu) Introducei numele sub forma: &Algoritm; caracterul &
semnific posibilitatea selectrii meniului prin utilizarea combinaiei de
199

taste Alt+A. Apoi apsai tasta Enter. Automat se deschid n dreapta i


sub dreptunghi dou noi dreptunghiuri ce permit continuarea construirii
meniului principal. n acest moment, n faza de proiectare fereastra
aplicaiei poate arta ca n fig. 10.1.

Fig. 10.1: Construirea meniului aplicaiei


Continuai cu urmtoarele elemente pe orizontal: &Parametri,
&Ferestre. Apoi revenii la elementul &Algoritm i construii sub el
urmtoarele elemente: &Activare, &Dezactivare. Pentru &Dezactivare,
se va selecta proprietatea Enabled=False. n execuie, acest element de
meniu nu va putea fi activat dect dac proprietatea Enabled va deveni
Enabled=True (n acest scop, aa cum vom vedea, se va utiliza o
instruciune corespunztoare).
Similar construii elementele: &Dimensiune model ataat sub
elementul &Parametri, i Aranjare &Orizontal, Aranjare &Vertical,
Aranjare n &Cascad, &Aranjare n Bar, &Ieire i Referin,
&Semnal de Control ataate sub elementul &Ferestre.
Asupra posibilitilor de aranjare a ferestrelor se va reveni. De
asemenea se va reveni i asupra modului de construcie a meniului. n
acest moment este important nelegerea modului de construcie a unui
meniu; denumirile elementelor de meniu nu au o importan deosebit. n
aceast faz de proiectare fereastra aplicaiei poate arta ca n fig.10.2.
Executai proiectul i observai ce se ntmpl cnd cursorul
mouse-ului ajunge pe meniu precum i la selecie prin clic.
Apoi deschidei un nou formular utiliznd meniul File, New
Form. Modificai denumirea formularului n Dimensiune model. Din bara
de componente Standard selectai componenta GroupBox (i schimbai
proprietatea Caption n Model) i o depunei pe formular.
200

n componenta GroupBox depunei trei componente Edit pe care


le redenumii Edit_n, Edit_m, Edit_d (proprietatea Name) i tergei
textul (proprietatea Text).
Aceste componente vor permite preluarea dimensiunilor
modelului procesului iar denumirile alese permit o mai uoar nelegere
a programului.

Fig. 10.2: Construcia meniului aplicaiei (continuare)


Modelul este de forma [1], [30], [31]:
y t a1 y t 1 a n y t n b1u t 1 d bm u t m d

(10.1)
unde y(t) este semnalul de ieire, u(t) semnalul de control, m i n sunt
dimensiunile modelului iar d este timpul mort. Aceast form de
reprezentare este convenabil din punct de vedere a implementrii.
Modificai proprietatea Color a formularului alegnd clWhite.
Depunei trei etichete (Label) n stnga fiecrei casete de editare i
alegei pentru proprietile Caption: n= , m= , d=. Depunei dou
butoane pe formular i alegei pentru proprietatea Caption: &Ok
respectiv &Cancel.
Aceste dou butoane vor putea nchide formularul 2 dac
proprietatea ModalResult a butonului se alege mrOk respectiv mrCancel.
201

n acest fel utilizatorul va putea introduce datele n, m, d. Datele vor fi


efectiv preluate dac se d clic pe butonul &Ok.
Afiarea unei ferestre de dialog se realizeaz prin metoda Show
Modal (care suspend execuia programului pn la terminarea
dialogului). Modificai dimensiunile formularului la valorile necesare i
aranjai componentele astfel nct s aib un aspect plcut. O posibilitate
se prezint n fig. 10.3.

Fig. 10.3: Fereastra pentru introducerea dimensiunilor modelului


Vom defini variabilele globale: n, m, d. Pentru aceasta, n Unit1 se
depune dup cuvntul cheie var urmtoarea linie de program:
n,m,d:integer;
De asemenea selectm n meniu Parametri i apoi Dimensiune Model. Ca
urmare se deschide procedura TForm1.Dimensiunemodel1Click (n
Unit1). Se va completa astfel:
procedure TForm1.Dimensiunemodel1Click(Sender: TObject);
var raspuns:integer;
begin
Form2.edit_n.Text:=IntToStr(n);
Form2.edit_m.Text:=IntToStr(m);
Form2.edit_d.Text:=IntToStr(d);
Raspuns:=Form1.ShowModal;
if raspuns = mrOK then
begin //momentan nu facem nimic
end
else if Raspuns = mrCancel then
showMessage('Cancel')
202

else ShowMessage('Eroare');
end;
Executai programul. Se va afia mai nti un mesaj care ne
informeaz c formularul 1 face referire la formularul 2, acesta nefiind
declarat n lista Uses; suntem ntrebai dac acceptm ca Delphi s fac
declaraia respectiv n locul nostru. Evident c acceptm acest ajutor.
Relum execuia. Dac selectm Parametri/Dimensiune Model,
se va afia eroarea (operaie nepermis): Cannot make a visible form
modal. Motivul este c n instruciunea:
Raspuns:=Form1.ShowModal;
n loc de Form2 s-a scris Form1. Corectai i executai din nou
programul. n aceast etap de realizare a programului, n faza de
execuie, ferestrele formularelor pot arta ca n fig. 10.4.

Fig. 10.4: Introducerea datelor referitoare la model


Datele introduse de utilizator (reprezentnd valorile parametrilor
n, m, d) vor fi preluate n procedura asociat evenimentului OnClick al
butonului &Ok. Pentru a vizualiza formularul 2, o posibilitate este
selectarea meniului View/Units i din fereastra View Unit ce se deschide
alegei Unit2. Apoi selectai evenimentul OnClick al butonului &Ok i
modificai procedura asociat evenimentului astfel:
procedure TForm2.Button1Click(Sender: TObject);
begin
203

n:=StrToInt(Edit_n.Text);
m:=StrToInt(Edit_m.Text);
d:=StrToInt(Edit_d.Text);
end;
Executai programul. Vom avea o eroare n Unit2, respectiv
variabila n nu este declarat. Dei variabilele n, m, d au fost declarate n
Unit1 ca variabile globale, n Unit2 ele nu sunt vzute ca atare. Trebuie
adugat urmtoarea declaraie n Unit2:
uses Unit1;
dup:
implementation
Executai programul i selectai meniul Parametri / Dimensiune
Model. Observai ce date putei introduce i cum sunt preluate. Remarcai
faptul c dup introducerea unui set de date, la o nou deschidere a
ferestrei formularului 2, sunt afiate datele introduse anterior. De ce?
Revenii apoi la formularul 1 i modificai culoarea alegnd clWhite.
De asemenea introducei instruciunile necesare pentru
iniializarea variabilelor la activarea Form1 respectiv se utilizeaz
evenimentul OnActivate al formularului:
procedure TForm1.FormActivate(Sender: TObject);
begin
n:=4; m:=3; d:=1;
end;
Reluai execuia programului i urmrii faptul c variabilele n, m,
d primesc valorile de mai sus.
Deschidei un nou formular Form3 utiliznd File/New/Form.
Aceast formular va fi inserat n interiorul formularului principal Form1.
Utilizatorul va putea deschide Form3 (i alte formulare) n interiorul
acestui formular principal. Scopul este vizualizarea evoluiei mai multor
semnale din proces, ce au o legtur logic ntre ele. Denumii noul
formular: Evoluia semnalului de referin i a ieirii (proprietatea
Caption a formularului). Fereastra principal se numete fereastr
printe. Ferestrele secundare ce vor fi deschise n interiorul ferestrei
principale se numesc ferestre copil.
O astfel de aplicaie se numete Multiple Document Interface
(MDI) adic interfa multidocument. Formularul principal Form1 va
204

trebui s aib proprietatea FormStyle egal cu fsMDIForm (adic stilul


formularului se transform din fereastr normal n fereastr printe).
Formularul secundar Form3 va avea aceast proprietate egal cu
fsMDIChild. Utilizai inspectorul de obiecte pentru modificarea acestor
valori. De asemenea modificai i culoarea formularului Form3 n
clWhite.
Executai programul. Vei constata c pe formularul principal se
depune automat i formularul secundar Form3 (fig. 10.5). De fapt
fereastra formularului ar trebui s se deschid doar la dorina
utilizatorului dup ce alege din meniul principal Ferestre i apoi
submeniul Iesire i referinta. Pentru a realiza acest mod de lucru trebuie
ca fereastra copil s nu fie afiat automat n momentul lansrii n
execuie a aplicaiei. Soluia este mutarea ferestrei copil din lista
formularelor create automat n lista formularelor disponibile. Se va
utiliza fereastra de dialog Project/Options/Forms, i se trage Form3 n
lista formelor accesibile.

Fig. 10.5: Interfaa multidocument


Lansai din nou programul i urmrii ce se ntmpl. Form3 nu
se poate afia deocamdat. Pentru aceasta, n faza de proiectare, n
formularul principal Form1 se d un clic pe submeniul Ferestre/Ieire i
Referin i n procedura ce se deschide completai:
procedure TForm1.Iesiresireferinta1Click(Sender: TObject);
var Copil:TForm3;
begin
Copil:=TForm3.Create(Self);
Copil.Show;
end;
205

Executai programul i vei obine o eroare:


[Error] Unit1.pas(74): Undeclared identifier: 'TForm3'.
Trebuie declarate manual cele dou uniti Unit1 n Unit3 i invers
dup cum urmeaz:
-n Unit3 dup: implementation introducei: uses Unit1;
-n Unit1 dup: implementation introducei: uses Unit2, Unit3;
Executai programul i urmrii efectele. Deocamdat nu putem nchide
formularul Form3 cnd dorim. Vom da un clic pe evenimentul OnClose
asociat formularului Form3 i completm:
procedure TForm3.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
if MessageDlg('Se inchide fereastra?', mtConfirmation,
[mbYes,mbNo], 0) = mrYes
then Action := caFree else Action := caNone;
end;
Att fereastra printe ct i fereastra copil pot avea un meniu
propriu. Meniul ferestrei printe este ntotdeauna actualizat, astfel c la
un moment dat n linia meniului ferestrei printe vor apare elementele de
meniu ale ferestrei copil active (elementele de meniu corespunztoare
ferestrelor copil inactive devin invizibile).
Depunei pe formularul 3 o component meniu i construii un
singur cmp numit Iesire i Referin. Executai programul. Observai ce
se ntmpl dac nchidei aplicaia cu sau fr formularul 3 deschis. S-ar
putea ca, n funcie de versiunile de programe utilizate, s apar unele
probleme. Din acest motiv, este recomandabil ca la nchiderea aplicaiei
s utilizm o fereastr de dialog. Completai evenimentul OnClose al
formularului principal astfel:
procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
if MessageDlg('Terminare program ?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes then Action := caFree
else Action := caNone;
end;
206

ncercai acum programul i observai c aplicaia se nchide


elegant i fr mesaje de eroare.
Vom insera pe formularul 3 o component Chart din paleta de
componente Aditional (are simbol un cerc colorat diferit pe sectoare de
cerc). Aceast component ne va permite realizarea graficelor n dou
axe. Alegei urmtoarele proprieti ale lui Chart1:
- Align: alClient adic Chart1 va ocupa tot spaiul ferestrei.
ncercai i alte variante de alegere i urmrii efectul. n final revenii la
alClient;
- Color: alegei clWhite. ncercai i alte variante;
- BackColor: alegei clWhite. ncercai i alte variante;
- View3D: alegei False (aici ne intereseaz grafice 2D).
Vom utiliza o alt variant de stabilire a proprietilor, cu ajutorul unui
clic dat cu butonul drept al mouse-lui pe componenta Chart. Se va
deschide un meniu derulant din care alegei Edit Chart. Acelai efect l
obinem cu ajutorul unui dublu clic cu butonul stng al mouse-lui. Se
deschide fereastra ce permite editarea proprietilor Chart-ului (fig.10.6).

Fig. 10.6: Editarea componentei Chart


207

Utiliznd butonul Add, se deschide un meniu din care se poate


alege forma graficului. Fr a bifa butonul 3D, alegei un grafic de tip
Line. Repetai operaiile pentru 3 astfel de grafice suprapuse (putei
utiliza n fereastra Editing Chart1 comanda Clone).
Alegei apoi Legend i dai un clic. Se va deschide un submeniu
n care debifai &Visible. n aplicaia final care o vom realiza nu ne
intereseaz afiarea legendei pe chart deoarece informaiile referitor la
graficele realizate vor fi date n alte moduri. Din motive similare alegei
Title i debifai Visible. Evident c ulterior pot fi ncercate i alte setri
posibile cu scopul de a gsi soluiile considerate optime pentru realizarea
aplicaiilor.
ncercai s modificai i proprietile Margin (Bottom, Left,
Right, Top) direct n Object Inspector (fiind selectat Chart1), sau cu clic
buton dreapta pe Chart i apoi alegei Edit Chart i General. Alegei:
3,3,3,10 pentru Bottom, Left, Right, Top.
Vom alege un timer (simbol ceas) din grupul de componente
System i l depunem pe formularul 3.
n programul principal (formularul 1) se definesc urmtoarele
constante i variabile ce vor fi utilizate n cele ce urmeaz:
nainte de seciunea Var se adaug:
const
nmem = 400;
{numr puncte grafice ce vor fi memorate}
npuncte =200;
{numr puncte grafice ce vor fi afiate}
n seciunea Var se adaug:
date_y: array[0..nmem] of real; {vector date memorate ieire}
date_yr : array[0..nmem] of real; {vector date memorate referin}
indm:integer; {numrul punctului de eantionare ce se va aduga}
Sunt necesare cteva comentarii. Pentru a simula comportarea
unui proces, este necesar ca semnalul (sau semnalele) de intrare n proces
s fie cunoscute (sau generate printr-o procedur specific). Semnalul
(sau semnalele) de ieire sunt calculate pe baza modelului procesului (de
exemplu pe baza ecuaiei 10.1). Pentru o reprezentare sub form grafic,
este necesar ca aceste date s fie memorate n timp (de fapt la fiecare
interval de eantionare, procesul fiind considerat discret). Ca urmare
constantele i variabilele definite mai sus sunt utilizate pentru a putea
reprezenta grafic comportarea procesului.
208

n cazul utilizrii unui sistem de calcul pentru controlul unui


proces, datele de la i spre proces se citesc (se transmit) la un interval de
timp bine definit numit interval de eantionare. n practic alegerea
intervalului de eantionare depinde de mai muli factori (natura
procesului, natura i mrimea zgomotului, timpul de calcul necesar
algoritmului de control etc.). n cazul simulrii, alegerea intervalului de
eantionare depinde i de viteza de calcul i de cerinele privind modul de
afiare a datelor. n formularul Form3 selectm timerul i prin dublu clic
pe icoana timer-ului se deschide procedura asociat evenimentului
OnTimer al timer-ului. Modificm procedura astfel:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
PasGrafic;
end;
n procedura pasgrafic se vor face calculele necesare pentru
afiarea evoluiilor semnalelor de ieire i de referin. Mai nti se fac
urmtoarele iniializri n procedura asociat evenimentului OnActivate
al formularului principal Form1:
indm:=0; {inializare indice in memoria date de afisare}
for i:=0 to nmem do {secventa introdusa temporar}
begin
date_y[i]:=i mod 50;
date_yr[i]:=i mod 20;
end;
Dup cum se observ, semnalul de referin i semnalul de ieire
sunt iniializate cu valori sub forma unui dinte de ferestru, prin utilizarea
operaiei modulo (mod). Vom scrie secvena de program ce va fi apelat
n procedura asociat evenimentului OnTimer:
procedure TForm3.PasGrafic;
var i:integer;
begin
{desenarea punctelor celor doua grafice series1 si series2}
series1.addxy(indm,date_yr[indm],'',clblue);
series2.addxy(indm,date_y[indm],'',clred);
209

{ temporar n procedur modificm indice date (indm) i datele


afisate}
indm:=indm+1;
if indm > nmem then indm:=0;
end;
Pentru desenarea punctelor graficului se utilizeaz metoda Addxy.
Cei trei parametri reprezint: numrul punctului pe axa orizontal,
valoarea graficului n acel punct i culoarea punctului desenat. Vor fi
reprezentate dou curbe (semnalul de ieire i referina). De asemenea
procedura trebuie declarat astfel:
Dup: procedure Timer1Timer(Sender: TObject);
se introduce: procedure PasGrafic;
ncercai funcionarea programului. Se va genera eroarea:
[Error] Unit1.pas(80): Undeclared identifier: 'i'.
Evident, n procedura TForm1.FormActivate, n seciunea var, trebuie
declarat variabila i (de tip integer). Lansai n execuie programul i din
meniu alegei Ferestre/Iesirea si referinta. Observai ce se ntmpl. La
fiecare secund, procedura PasGrafic deseneaz cte un punct din cele
dou grafice ce implementeaz funcia dinte de ferestru. ncercai s
modificai proprietatea Interval a timer-ului precum i valorile
elementelor tablourilor date_y i date_yr. Urmrii modul de lucru a
metodei Addxy ce permite desenarea punctelor. Dup 110 secunde
graficele realizate pot arta ca n fig. 10.7.

210

Fig. 10.7: Generarea semnalelor de tip dinte de fierstru


Vom modifica iniializrile vectorilor date_y i date_yr n
procedura asociat evenimentului OnActivate din formularul principal
Form1 prin utilizarea de valori aleatoare:
{Temporar numai}
randomize;
for i:=0 to nmem do
begin
date_y[i]:=random(250);
date_yr[i]:=random(250);
end;
La execuie se constat faptul c pe Chart sunt desenate dou
curbe ce au valori aleatoare.
Vom modifica ultima instruciune din TForm3.PasGrafic astfel:
if indm > nmem then
begin
indm:=0;
for i:=0 to nmem do
begin
date_y[i]:=random(250);
date_yr[i]:=random(250);
211

end;
end;
Ce constatai? Pentru a nu atepta prea mult timp, este
recomandabil s utilizai timer-ul setat pe valoare foarte mic. ncercai
s nchidei i apoi s redeschidei fereastra chart-ului. Dup un timp vei
constata c apar unele ciudenii. De ce?
S modificm caracteristicile chart-ului astfel nct dimensiunile
pe axe s nu se modifice adic s fie fixe. Este un mod mai comod de
lucru. Alegei proprietatea BottomAxis a chart-ului. Are un semn + n
fa. Acesta semnific faptul c dac se d clic pe + se vor deschide alte
proprieti. Dai clic. La proprietatea Automatic alegei False. Vei
constata c se modific automat i proprietile AutomaticMaximum i
AutomaticMinimum. Modificm i proprietile Maximum respectiv
Minimum. Alegei 200 respectiv 0.
n mod similar modificm caracteristicile pentru LeftAxis.
Alegem Automatic=False, Maximum=250, Minimum=0. Toate aceste
modificri fixeaz dimensiunile vizibile ale celor dou axe ceea ce face
ca evoluia graficelor s poat fi mai uor urmrit. Evident c, dac se
impune, din cnd n cnd dimensiunile vizibile ale celor dou axe pot fi
modificate. Rulai din nou programul i observai modificrile. Avei
rbdare dup ce chart-ul se umple o dat cu date. De ce se ntmpl ceea
ce se ntmpl?
Introducei acum urmtoarea secven la nceputul procedurii
TForm3.Pasgrafic:
Chart1.BottomAxis.Maximum:=npuncte*(1+indm div npuncte);
Chart1.BottomAxis.Minimum:=npuncte*(indm div npuncte);
Vei observa c dup 200 de pai se modific automat etichetele
pe axa orizontal de la 0..200 la 200..400. Totui dup pasul 400 se
genereaz eroarea: Axis Maximum value must be >= Minimum. Motivul
este c variabila indm ce indic dimensiunea vectorului de memorare a
datelor ce sunt afiate, este limitat prin program la valoarea nmem=400
(evident c aceste constante pot fi modificate de programator).
Prin urmare, dup ce prin program se execut indm=0 (n
procedura TForm3.PasGrafic), la urmtorul apel al procedurii se
genereaz eroarea de mai sus. O soluie este inversarea ordinii de
execuie a celor dou instruciuni de mai sus n care se calculeaz
212

parametrii Maximum i Minimum pentru Chart1.BottomAxis. O soluie


mai general pentru a corecta acest lucru este introducerea la nceputul
procedurii PasGrafic a secvenei:
{ etichetarea axei orizontale (axa absciselor) }
if indm=0 then
begin
{s-a umplut chartul cu date}
series1.Clear; series2.Clear;
with Chart1.BottomAxis do
begin
min:=Minimum;
Minimum:=0;
Maximum:= Maximum-min;
end;
end;
i declararea variabilei locale min de tip double;.
Graficele ce rezult utilizeaz ntre puncte linii oblice. Uneori e
preferabil s se utilizeze doar linii orizontale i verticale (de exemplu
dac se afieaz semnalul de control, acesta ntre momentele de
eantionare este constant). Pentru aceasta la afiare se utilizeaz:
series1.addxy(indm-1,date_yr[indm],'',clblue);
series1.addxy(indm,date_yr[indm],'',clblue);
series2.addxy(indm-1,date_y[indm],'',clred);
series2.addxy(indm,date_y[indm],'',clred);
O alt variant mai elegant este urmtoarea: dai clic dreapta pe
chart, alegei Edit Chart, Series, Series1 i bifai Stairs din dreptunghiul
Line Mode. Acest lucru semnific grafic n trepte. ncercai s observai
i efectul bifrii butonului Inverted.
Deschidei un nou formular, Form4. l redenumii: Evoluia
semnalului de control. V ntoarcei n formularul 3. Selectai chartul.
Utilizai comanda de copiere Ctrl+C apoi v ntoarcei pe formularul 4 i
utilizai Ctrl+V (paste). Chart-ul utilizat pentru formularul 4 este similar
cu cel utilizat pentru formularul 3, deci e mai simplu s-l copiem. Punem
pe formular o component meniu i o component timer. Componenta
meniu va avea deocamdat un singur cmp numit Semnal de control.
Pentru evenimentul FormClose al lui Form4 copiai instruciunile
evenimentului FormClose al formularului Form3. De asemenea copiai
213

procedura PasGrafic precum i declaraia ei (dar nu uitai s o redenumii


TForm4.PasGrafic;). Practic (momentan) vom utiliza aceiai procedur
n ambele formulare, dar ulterior ele vor fi diferite. n procedura asociat
evenimentului OnTimer (componenta Timer din Form4) introducei
instruciunea:
pasgrafic;
De
asemenea
dup
instruciunea
implementation introducei instruciunea uses unit1 iar n Unit1
completai uses cu Unit4.
Executai programul. ncercai diferite valori pentru proprietatea
interval a timerelor din Form3 respectiv Form4. De exemplu alegei
pentru timer-ul din formularul 3 proprietatea Interval=1000 iar pentru
timer-ul din formularul 4 proprietatea Interval=50; Vei constata faptul c
forma graficului este influenat de valorile acestor proprieti. De ce?
Sugestie: Invalidai temporar timerul din Form4 modificnd in
inspectorul de obiecte proprietatea Enabled=False; Nu mai apare
influena.
La execuie vei constata faptul c fereastra Semnal de control
nu se poate deschide. Trebuie modificat astfel nct s devin fereastr
copil. Pentru aceasta trebuie modificat proprietatea FormStyle a
formularului 4 (se alege fsMDIChild), trebuie trecut formularul n lista
formularelor accesibile (se utilizeaz Project/Options, etc.). Este posibil
s avei dificulti cu selectarea formularului 4 deoarece chart-ul ocup
tot formularul. O modalitate simpl este selectarea casetei derulante
aflat pe prima poziie n inspectorul de obiecte i apoi se alege Form4
(fig. 10.8).

Fig. 10.8: Selectarea componentelor acoperite


214

n formularul principal se d clic pe elementul de meniu Semnal


de control i se completeaz procedura:
procedure TForm1.Semnaldecontrol1Click(Sender: TObject);
var Copil:TForm4;
begin
Copil:=TForm4.Create(Self);
Copil.Show;
end;
Se execut programul. Se constat c cele dou formulare copil
nu pot fi puse simultan pe formularul principal. Formularul principal i
formularele copil au meniuri proprii. Pentru a realiza interclasarea
meniurilor trebuie gestionat proprietatea GroupIndex a componentelor
MainMenu.
Se recomand ca pentru meniul asociat ferestrei printe aceast
proprietate s aib valoarea 0 respectiv 1 pentru ferestrele copil.
Ca urmare, pentru evenimentele OnActivate din formularele 3 i 4 se
completeaz (n formularul principal aceast proprietate are valoarea 0):
procedure TForm3.FormActivate(Sender: TObject);
begin
IesiresiReferinta1.GroupIndex:=1;
end;
procedure TForm3.FormActivate(Sender: TObject);
begin
IesiresiReferinta1.GroupIndex:=1;
end;
Executai programul. Vei constata c cele dou ferestre copil pot
fi mutate, trase, modificate n dimensiuni.
Selectai formularul principal. Selectai MenuDesigner. Apoi dai
clic pe Ferestre i AranjareOrizontal. Dai dublu clic i n procedura ce
se deschide completai:
procedure TForm1.AranjareOrizontala1Click(Sender: TObject);
begin
TileMode:=tbHorizontal; {vezi help-ul pentru TileMode si Tile}
215

Tile;
end;
Executai din nou programul. Dup ce activai cele dou ferestre
copil, dac dai clic pe Aranjare Orizontal, cele dou ferestre copil vor
ocupa frete tot spaiul disponibil. Modificai proprietatea
WindowState a formularului principal n wsMaximized. n execuie,
formularul principal va ocupa tot ecranul. Verificai acest lucru.
Modificai proprietatea Interval a timerului (n formularele 3 i 4)
la valoarea 100. n desenarea graficelor apare o surs de eroare datorit
faptului c variabila indm ce specific indicele valorii ce se introduce n
grafic, este incrementat att n Unit3 ct i n Unit4.
Pentru a sincroniza cele dou uniti vom muta incrementarea
acestei variabile n Unit1. Deci vom elimina din procedurile PasGrafic
din Unit3 respectiv Unit 4 secvenele:
indm:=indm+1;
if indm > nmem then
begin
indm:=0;
for i:=0 to nmem do
begin
date_y[i]:=random(250);
date_yr[i]:=random(250);
end;
end;
i n formularul 1 depunem un timer i alegem proprietatea Interval egal
cu 10000. Pentru evenimentul OnTimer introducem secvena eliminat
din procedurile PasGrafic. Executai programul. Se va genera o eroare
Undeclared identifier. Dup ce o eliminai, vei constata faptul c o
dat la 10 secunde cele dou grafice sunt remprosptate. Dar ntre dou
apeluri la 10 secunde, procedurile PasGrafic sunt apelate la fiecare
interval dat de proprietile Interval ale timerelor formularelor 3 i 4.
Putei verifica acest lucru! Putei utiliza n acest scop cte o etichet pe
formularele 3 i 4; n etichet putei scrie numrul apelului. De exemplu
n procedura TForm3.PasGrafic introducei temporar urmtoarele
instruciuni:
test:=test+1; {nu uitai declararea variabilei test de tip integer}
216

Label1.Caption:=Test +IntToStr(test);
Practic acest apel este inutil, ncarc programul (De ce?). Soluia
este validarea din formularul principal a timerelor din formularele 3 i 4.
Introducem n formularul principal n seciunea var declaraia:
ceas3,ceas4:boolean; {variabile pentru validare timere formulare}
De asemenea n procedura TForm1.FormActivate vom introduce
instruciunile:
ceas3:=false;ceas4:=false;{init. variabile pt.validare timere formular}
n procedura TForm1.Timer1Timer introducem instruciunile:
Ceas3:=True; Ceas4:=True;
n procedurile TForm3.Timer1Timer respectiv TForm4.Timer1Timer
apelul procedurii PasGrafic se modific astfel:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
if ceas3 then {similar si pentru formularul 4}
begin
PasGrafic;
ceas3:=false;
end;
end;
Ca urmare, n formularul principal, cnd trece timpul dictat de
timer1 (fixai timer1.interval=1000), se activeaz procedura asociat n
care se valideaz ceas3 respectiv ceas4. Dup terminarea aciunilor din
unit1, se vor executa aciunile asociate din unit3 respectiv unit4.
Deoarece timerele sunt validate (fixai timer1.interval=100 n ambele
uniti), se vor executa aciunile asociate timerelor. Trebuie precizat
faptul c cele dou grafice asociate formularelor 3 i 4 trebuie s lucreze
simultan. Dac executm programul vom observa faptul c graficele sunt
desenate doar din momentul n care deschidem ferestrele asociate.
Mediul Delphi ofer numeroase soluii pentru realizarea unor aciuni.
Putei studia dac nu se poate renuna la variabilele ceas3, ceas4 prin
utilizarea proprietilor enabled ale timerelor.
217

Vom sincroniza cele dou chart-uri. Vom introduce o variabil


global alg_on n seciunea var din formularul principal:
alg_on : boolean; { validare/invalidare algoritm conducere}
De asemenea n procedura TForm1.FormActivate introducem:
alg_on:=False; {initial invalidam algoritm conducere}
Pe formularul 1, selectai MenuDesigner, Algoritm i dai dublu clic pe
Activare. Se deschide o procedur pe care o completai astfel:
procedure TForm1.Activare1Click(Sender: TObject);
begin
Activare1.Enabled:=False;
Dezactivare1.Enabled:=True;
if alg_on = False then alg_on := True;
end;
De asemenea modificai procedura TForm3.Timer1Timer din Unit3 i
similar n Unit4 astfel:
procedure TForm3.Timer1Timer(Sender: TObject);
begin {similar pentru formularul 4}
if alg_on and ceas3 then
begin
PasGrafic;
ceas3:=false;
end;
end;
Executai acum programul. Vei constata faptul c cele dou
grafice nu vor porni din origine. Motivul este faptul c n formularul
principal, n procedura asociat timer-ului, incrementarea variabilei indm
trebuie realizat doar dac alg_on=true. Vom modifica procedura
TForm1.Timer1Timer astfel:
procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
218

if alg_on=true then
begin
indm:=indm+1;
if indm > nmem then
begin
indm:=0;
for i:=0 to nmem do
begin
date_y[i]:=random(250);
date_yr[i]:=random(250);
date_u[i]:=random(250);
end;
end;
Ceas3:=True; Ceas4:=True;
end;
end;
n plus, n procedura TForm1.FormActivate, n ciclul for, introducei
instruciunea:
date_u[i]:=random(250);
De asemenea trebuie declarat date_u ca variabil global iar n
formularul 4 se va afia doar date_u. Pstrai la afiare n procedura
pasgrafic din Unit4 doar:
{afisare}
series1.addxy(indm,date_u[indm],'',clred);
Executai acum programul. Vei constata c dup ce nchidem o
fereastr, dac o redeschidem ea va afia doar o poriune din semnal.
Similar, dac n momentul validrii algoritmului ferestrele nu sunt
deschise, la deschidere ele vor afia semnalul trunchiat. Concluzia este c
la activarea formularului ce conine un chart, graficul trebuie redesenat n
totalitate nu numai
ultimul
punct. Modificai
procedura
TForm3.FormActivate astfel:
procedure TForm3.FormActivate(Sender: TObject);
var i:integer;
begin
219

IesiresiReferinta1.GroupIndex:=1;
Chart1.BottomAxis.Maximum:=npuncte;
if indm>0 then
begin
for i:=Round(Chart1.BottomAxis.Minimum) to indm-1 do
begin
series1.addxy(i,date_yr[i],'',clblue);
series2.addxy(i,date_y[i],'',clred);
end;
series1.active:=true;
series2.active:=true;
end;
end;
Similar pentru TForm4.FormActivate:
procedure TForm4.FormActivate(Sender: TObject);
var i:integer;
begin
Semnaldecontrol1.GroupIndex:=1;
Chart1.BottomAxis.Maximum:=npuncte;
if indm>0 then
begin
for i:=Round(Chart1.BottomAxis.Minimum) to indm-1 do
series1.addxy(i,date_u[i],'',clred);
series1.active:=true;
end;
end;
Se mai observ faptul c graficele nu pornesc din origine. Dac nchidem
i apoi redeschidem ferestrele ce conin chart-urile, graficele sun afiate
corect. De ce se ntmpl acest lucru? Modificai instruciunile indm:=0;
din Unit1 n indm:=-1; De ce funcioneaz acum corect?
Selectai formularul principal i MenuDesigner. Selectai
Algoritm i apoi dai dublu clic pe Dezactivare. Se deschide o procedur
n care completai:
procedure TForm1.Dezactivare1Click(Sender: TObject);
begin
220

alg_on:=False;
Activare1.Enabled:=True;
Dezactivare1.Enabled:=False;
end;
Vei constata faptul c algoritmul poate fi activat/dezactivat de utilizator.
n practic se face o distincie ntre datele referitoare la procesul
urmrit sau/i condus i datele privitoare la modelul matematic al
procesului. Totdeauna vor exista diferene mai mici sau mai mari ntre
datele furnizate de procesul real i datele furnizate de modelul procesului.
Din acest motiv, n simulri se utilizeaz dou categorii de date: cele
referitoare la procesul real condus i cele referitoare la modelul acestui
proces. De cele mai multe ori tocmai efectele acestei diferene ntre
proces i model este studiat prin simulare. Pentru a nu obine rezultate i
concluzii false trebuie realizat o separaie clar ntre datele ce privesc
procesul real i datele ce privesc modelul procesului.
Vom modifica n procedura TForm1.FormActivate iniializrile
prin nlocuirea secvenei de program:
for i:=0 to nmem do
begin
date_y[i]:=random(250);
date_yr[i]:=random(250);
date_u[i]:=random(250);
end;
cu:
np:=4; mp:=3;dp:=1; {dimensiuni proces}
for i:=0 to nmem do
begin
date_y[i]:=0;
date_yr[i]:=0;
date_u[i]:=0;
end;
ap[1]:=-2.434927; ap[2]:=1.976289; ap[3]:=-0.5346799;
bp[1]:=0.000948003; bp[2]:=0.004438182; bp[3]:=0.001296496;
yr[0]:=200;
u[0]:=200;
221

De asemenea adugai n seciunea Var din Unit1:


np,mp,dp:integer; { dimensiune proces }
ap,bp: array[0..10] of real; {coeficienti ecuatie proces}
y,u,yr: array[0..20] of real; {vectori iesire, comanda, referinta}
Practic, prin instruciunile de mai sus, am introdus datele
referitoare la procesul real pe care l vom studia precum i iniializrile
necesare. S-a utilizat ecuaia unui proces termic [1]. Se observ c s-au
realizat iniializrile necesare pentru a studia rspunsul la treapt al
sistemului.
Vom realiza operaiile necesare pentru a putea modifica aceste
date privitoare la ecuaia procesului. n procedura:
procedure TForm1.Dimensiunemodel1Click(Sender: TObject);
vom introduce:
Form2.edit_np.Text:=IntToStr(np);
Form2.edit_mp.Text:=IntToStr(mp);
Form2.edit_dp.Text:=IntToStr(dp);
Trebuie introduse n formularul 2, componentele necesare pentru
preluarea/afiarea datelor referitoare la proces, similar cu componentele
utilizate pentru modelul procesului (respectiv un GroupBox i trei Edituri (vezi instruciunile de mai sus). Se poate face simplu prin copiere i
apoi se modific Caption-ul GroupBox-ului n Proces i corespunztor
se modific etichetele. Se modific i numele celor trei Edit-uri n
Edit_np, Edit_mp, Edit_dp. Dup ce modificm i Caption-ul ferestrei,
fereastra formularului 2 va avea aspectul din fig.10.9.

222

Fig. 10.9: Introducere date model i proces


Modificai i:
procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
if alg_on=true then
begin
indm:=indm+1;
if indm > nmem then indm:=0;
pas_conducere(); //procedura pentru simularea procesului
date_y[indm]:=y[0];
date_yr[indm]:=yr[0];
date_u[indm]:=u[0];
Ceas3:=True;
Ceas4:=True;
end;
end;
Construii procedura pentru simularea funcionrii procesului:
procedure TForm1.Pas_Conducere();
var i:integer;
begin
for i:=np+dp downto 1 do y[i]:=y[i-1]; {deplasare semnale in timp}
for i:=mp+dp downto 1 do u[i]:=u[i-1];
y[0]:=0; {calculam semnalul de iesire in y[0]}
for i:=1 to np-1 do y[0]:=y[0]-ap[i]*y[i];
for i:=1 to mp do y[0]:=y[0]+bp[i]*u[i+dp];
end;
Trebuie introdus nainte de seciunea Private i declaraia:
procedure Pas_Conducere();
Executai programul. Vei constata c ateptai prea mult pentru a
obine rspunsul sistemului la un semnal de intrare de tip treapt. Putei
modifica setrile proprietii Interval a celor trei timere astfel: 100 pentru
223

timer-ul formularului 1 i 10 pentru timer-ele formularelor 3 i 4.


ncercai i valorile 10 (pentru timer-ul formularului 1) respectiv 100
(timer-ele formularelor 3 i 4). Executai programul. Vei constata o
funcionare incorect. De ce? De asemenea trebuie s fii ateni la selecia
timerelor.
Alte aspecte care deranjeaz sunt: faptul c semnalul treapt de
control nu are un aspect vizibil de treapt precum i faptul c valoarea 0 a
ieirii pe grafic coincide cu valoarea minim ce poate fi afiat. Pentru
primul aspect modificai n procedura TForm1.FormActivate
instruciunea
u[0]:=200;
n
u[0]:=0;
iar
n
procedura
TForm1.Timer1Timer dup instruciunea indm:=indm+1; introducei:
if indm=5 then u[0]:=200;
Pentru al doilea aspect, modificai n Form3 i Form4 pentru
Chart1 proprietile LeftAxis.Minimum= -5 i LeftAxis.Maximum= 255.
Deocamdat sistemul este deschis, nu se utilizeaz un algoritm de
control. Vom ncerca s urmrim ce se ntmpl cnd modificm valoarea
semnalului de control. Pentru aceasta, o metod posibil este utilizarea
evenimentelor asociate mouse-lui. Poziia mouse-lui poate fi urmrit pe
baza evenimentului OnMouseMove al chart-ului din formularul 4:
procedure TForm4.Chart1MouseMove(Sender: TObject; Shift:
TShiftState; X,Y: Integer);
begin pozx:=x;pozy:=y; end;
Variabilele pozx, pozy pot fi declarate ca variabile globale n
seciunea Var din Unit-ul 1:
pozx,pozy:integer; {pozitie mouse}
Valoarea semnalului de control se va modifica la dublu clic astfel:
procedure TForm4.Chart1DblClick(Sender: TObject);
var m,n:real; i:integer;
begin
with Chart1.ChartRect do
if ((pozy<= Bottom) and (pozy>= Top)
and (pozx>= Left) and (pozx <= Right)) then
224

begin {am testat dac mouse-ul este in interiorul Chart-ului}


m:=(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum)/
(Top-Bottom);
n:=(Chart1.LeftAxis.Maximum-m*Top);
u[0]:=round(m*pozy+n); {semnalul de control}
end;
end;
Se observ c, atunci cnd cursorul mouse-lui se gsete n
interiorul chart-ului, noua valoare a semnalului de control se calculeaz
n funcie de poziia pe axa vertical a cursorului mouse-lui, i de
proprietile LeftAxis.Maximum, LeftAxis.Minimum, ChartRect.Top i
ChartRect.Bottom ale chart-ului. Se utilizeaz o interpolare liniar prin
folosirea unei funcii de gradul 1:
y mx n

(10.2)

Coeficienii m i n vor fi identificai din condiiile problemei:

Chart1.LeftAxis.Maximum m Chart1.Chart Re ct.Top n


Chart1.LeftAxis.Minimum m Chart1.Chart Re ct.Bottom n

iar noua valoare a semnalului de control se obine din:


u 0 m pozy n

(10.3)

n mod similar se utilizeaz mouse-ul pentru modificarea


referinei. Putei ncerca acest lucru ca exerciiu. Practic procedura
TForm3.Chart1DblClick
va
fi
identic
cu
procedura
TForm4.Chart1DblClick cu excepia ultimei instruciuni care se
nlocuiete cu:
yr[0]:=round(m*pozy+n); {noua referinta}
Executai programul i urmrii ce se ntmpl atunci cnd
modificai valoarea semnalului de control sau a referinei. Avei n vedere
faptul c deocamdat factorul de amplificare al procesului ales este
unitar. Vei constata ns c citirea valorii noi a referinei sau nu se face,
sau se face greit. Motivul este faptul c n formularul 3 nu se citete
poziia mouse-lui. Practic va trebui s utilizm i evenimentul
OnMouseMove al chart-ului din formularul 3, utiliznd aceleai
instruciuni ca n formularul 4. S mai facem o observaie: n procedura
225

TForm4.Chart1DblClick se utilizeaz variabilele locale m,n; exist ns


i variabilele globale m,n n programul principal. Acest lucru poate
conduce la confuzii. ntr-o procedur variabilele locale au ntietate fa
de cele globale (putei verifica acest lucru!) prin urmare dac nu
redenumim variabilele locale nu vom putea utiliza n procedur
variabilele globale (care n cazul de mai sus reprezint dimensiuni ale
modelului procesului). Putei redenumi aceste variabile locale pentru a se
evita eventualele confuzii.
10.2 Simularea utilizrii controlului bipoziional
Vom introduce cel mai simplu control posibil n bucl nchis i
anume controlul bipoziional (on/off). Pentru aceasta, n procedura
TForm1.PasConducere() introducei nainte de sfrit:
if y[0]>yr[0] then u[0]:=umin else u[0]:=umax;
Se declar variabilele umin respectiv umax n seciunea Var din Unit 1:
umin,umax:integer; {valorile minima/maxima semnal de control}
i se iniializeaz n TForm1.FormActivate:
umin:=0;umax:=250;
Executai programul i urmrii ce se ntmpl. Vei observa c
semnalul de ieire oscileaz n jurul referinei. Forma i amplitudinea
oscilaiei depinde de punctul de funcionare (fig. 10.10).

226

Fig. 10.10: Control bipoziional-semnale


Reducerea oscilaiei ar putea fi realizat prin alegerea
corespunztoare a valorilor umax respectiv umin. Vom utiliza mouse-ul. n
procedura TForm4.Chart1DblClick n locul instruciunii:
u[0]:=round(m*pozy+n);
introducem:
i:=round(m*pozy+n);
if i>(umax+umin)/2 then umax:=i else umin:=i;
Vom gsi prin ncercri repetate valoarea necesar a semnalului
de control. ns la modificarea referinei, este posibil ca algoritmul s nu
funcioneze (fig.10.11). O soluie simpl este revenirea la valorile iniiale
ale valorilor umax i umin; o soluie mai elaborat ar putea fi scderea
treptat a valorii umin respectiv creterea treptat a valorii umax.

227

Fig. 10.11: Variant de control


Proiecte propuse
1. Atunci cnd se utilizeaz controlul bipoziional, reducerea oscilaiilor
poate fi realizat prin modificarea treptat a valorilor umax, umin. O
posibilitate este urmtoarea: se msoar on-line intervalele de timp n
care semnalul de ieire este mai mare respectiv mai mic dect semnalul
de referin, apoi pe baza celor doi timpi i a valorilor umax, umin se
modific corespunztor valorile umax, umin astfel nct diferena ntre
acestea s scad. La urmtorul pas de eantionare se vor utiliza noile
valori umax, umin. Acest algoritm trebuie s conin i secvene care s
permit evitarea i ieirea din situaiile dificile. De exemplu, diferena
ntre umax i umin trebuie s fie mai mare dect o valoare minim stabilit
de utilizator; dac se ntmpl ca cele dou valori umax, umin s fie ambele
mai mari sau ambele mai mici dect valoarea medie final a semnalului
de control (vezi fig. 10.11) atunci algoritmul trebuie s modifice umax, umin
sau pe ambele.
2. Se poate imagina i urmtorul procedeu: se construiete un tabel cu
valorile medii ale semnalului de control pentru diferite valori ale
semnalului de referin; acest tabel va fi utilizat pentru obinerea
semnalelor umax, umin funcie de valoarea semnalului de referin. Care
sunt limitele i dezavantajele acestui mod de lucru? Realizai aplicaia
necesar. Putei realiza automat acest tabel?
228

10.3 Simularea controlului proporional-integrativ-derivativ (PID)


n aceast aplicaie vom utiliza algoritmul de control PID.
Pornind de la aplicaia precedent, pentru nceput s comentm ultimele
instruciuni introduse ce permiteau modificarea valorilor umax i umin, iar n
procedura PasConducere din unit-ul 1 s comentm instruciunea:
if y[0]>yr[0] then u[0]:=umin else u[0]:=umax;
n locul acesteia vom introduce o instruciune ce implementeaz
una din formele numerice ale algoritmului de control PID [2], [23]:
u[0]:=u[1]+kp*(yr[0]-y[0]-yr[1]+y[1])+ki*(yr[0]-y[0])kd*(y[0]-2*y[1]+y[2]); {pid}
Declarai variabilele kp,ki,kd n seciunea Var din Unit 1:
kp,ki,kd:real; {coeficienti PID }
Deschidei un nou formular din meniul File, New Form.
Modificai denumirea formularului (Caption) n Comanda si Simulare.
Depunei pe formular cte o component Label, Edit i ScrollBar pentru
fiecare din parametrii kp,ki,kd. De asemenea formularul va conine i
dou butoane Ok (cu proprietatea ModalResult=mrOk) respectiv Cancel
(cu proprietatea ModalResult=mrCancel).
Introducei un nou element de meniu n meniul principal din
formularul 1, sub elementul de meniu Parametri/DimensiuneModel pe
care l denumii Comanda si Simulare. Legai formularul de meniul unitului 1 respectiv Parametri/Comand i Simulare astfel:
procedure TForm1.Comandasisimulare1Click(Sender: TObject);
var Raspuns:integer;
begin
Form5.Edit1.Text:=FloatToStrF(kp,ffGeneral,4,4);
Form5.Edit2.Text:=FloatToStrF(ki,ffGeneral,4,4);
Form5.Edit3.Text:=FloatToStrF(kd,ffGeneral,4,4);
Raspuns:=Form5.ShowModal;
if raspuns = mrOK then
begin
229

kp:=StrToFloat(Form5.Edit1.Text);
ki:=StrToFloat(Form5.Edit2.Text);
kd:=StrToFloat(Form5.Edit3.Text);
end;
end;
Comentai i instruciunea if indm=5 then u[0]:=200; din
procedura TForm1.Timer1Timer. Executai programul. Vei constata c
valoarea semnalului de control i implicit a ieirii nu se modific.
Modificai kp=1 pstrnd ki=0, kd=0 i urmrii efectul. Executai
programul. Vei constata c att semnalul de control ct i cel de ieire
vor crete rapid i vor depi valorile maxime admise n Chart-uri.
n aceast etap se pot aduga etichete n care s se afieze
valoarea actual a semnalelor de referin, ieire, control (rmne ca
exerciiu pentru cititor). Un motiv este faptul c semnalul de referin nu
este deplasat n timp, ceea ce conduce la un calcul greit a semnalului de
control. Trebuie introdus instruciunea:
for i:=np+dp downto 1 do yr[i]:=yr[i-1];
nainte de sfritul procedurii PasConducere. Un alt motiv este faptul c
n realitate semnalul de control poate lua valori limitate. De aceea trebuie
introduse instruciunile:
if u[0]>umax then u[0]:=umax; if u[0]<umin then u[0]:=umin;
Urmrii ce se ntmpl dac se alege kp=1. Putei alege i alte valori.
Se observ c utiliznd doar componenta P a controlerului PID,
exist o eroare staionar. De asemenea se observ c pentru acest tip de
algoritm PID, n cazul n care ki=0 i kd=0, modificarea coeficientului kp
va avea efect doar dac se modific referina.
Pentru a urmri mai uor efectul modificrii parametrului kp i ulterior a
parametrilor ki i kd este util ca semnalul de referin s fie de tip
dreptunghiular. Vom alege ca la fiecare 75 de perioade de eantionare,
semnalul de referin s se modifice. Procedura PasConducere este:
procedure TForm1.PasConducere();
var i:integer;
begin
{deplasare semnale in timp}
230

for i:=np+dp downto 1 do y[i]:=y[i-1];


for i:=mp+dp downto 1 do u[i]:=u[i-1];
y[0]:=0; {calcul semnal de iesire}
for i:=1 to np-1 do y[0]:=y[0]-ap[i]*y[i];
for i:=1 to mp do y[0]:=y[0]+bp[i]*u[i+dp];
u[0]:=u[1]+kp*(yr[0]-y[0]-yr[1]+y[1])+ki*(yr[0]-y[0])-kd*(y[0]2*y[1]+y[2]);{pid-calcul semnal de control}
if u[0]>umax then u[0]:=umax; {limitare semnal de control}
if u[0]<umin then u[0]:=umin;
for i:=np+dp downto 1 do yr[i]:=yr[i-1]; {referinta dreptunghiulara}
if indm mod 150 =0 then yr[0]:=75
else if indm mod 75 =0 then yr[0]:=175;
end;
Putei ncerca diverse valori pentru parametrii kp, ki, kd. Se pot
introduce i faciliti cum ar fi modificarea valorilor cu ajutorul celor trei
componente ScrollBar. Alegei urmtoarele proprieti pentru aceste
componente: Max=200, Min=50, Position=100. Se utilizeaz
evenimentul OnChange (similar pentru ScrollBar2 i ScrollBar3):
procedure TForm5.ScrollBar1Change(Sender: TObject);
begin
kp:= kp1*ScrollBar1.Position/100;
Edit1.Text:=FloatToStrF(kp,ffGeneral,4,4);
end;
unde valorile kp1, ki1, kd1 se iniializeaz la activarea formularului (i
evident c trebuie declarate n seciunea Var a Unit-ului 5:
procedure TForm5.FormActivate(Sender: TObject);
begin
kp1:=kp; ki1:=ki; kd1:=kd;
end;
n acest mod, valorile iniiale ale parametrilor kp, ki, kd pot fi
modificate prin multiplicare cu un factor cuprins ntre 0.5 i 2. Pentru a
putea face modificri mai accentuate, se poate utiliza un buton (avnd
caption-ul Refresh) care la evenimentul OnClick s realizeze
iniializarea valorilor parametrilor necesari:
procedure TForm5.Button3Click(Sender: TObject);
begin
231

kp:=StrToFloat(Form5.Edit1.Text);
ki:=StrToFloat(Form5.Edit2.Text);
kd:=StrToFloat(Form5.Edit3.Text);
kp1:=kp; ki1:=ki; kd1:=kd; ScrollBar1.Position:=100;
ScrollBar2.Position:=100;ScrollBar3.Position:=100;
end;
Putei ncerca urmtoarele puncte de pornire: (kp=1.15, ki=0.08,
kd=2), (kp=0.805, ki=0.0688, kd=1.867). Vei constata c valorile
parametrilor influeneaz suprareglajul, timpul de cretere etc.(fig.10.12).
Evident c parametrii kp, ki, kd pot fi modificai utiliznd doar
casetele de editare (e o variant mai greoaie), dar se pot imagina i alte
variante de modificare a acestor parametri.
Prin urmare alegerea optim a lor depinde i de performanele
impuse sistemului de control. Pentru a evita saturarea semnalului de
control, modificai semnalul de referin astfel:
if indm mod 150 =0 then yr[0]:=100
else if indm mod 75 =0 then yr[0]:=150;
Acordarea controlerului se poate face prin utilizarea metodei
experimentale Ziegler-Nichols. O alt variant mult mai eficient n
condiiile utilizrii tehnicii de calcul este definirea unui indice de
performan i utilizarea unei metode de optimizare. Se poate utiliza o
metod de grid. Se alege domeniul de variaie pentru cei trei parametri i
se mparte fiecare domeniu de variaie n n pri egale. Se calculeaz
pentru fiecare triplet al parametrilor valoarea unei funcii de performan
i se alege acel triplet ce minimizeaz funcia de performan. Metoda
este ineficient din punct de vedere al timpului de calcul, dar, spre
deosebire de cazul altor metode, ansele de a gsi minimul global sunt
mult mai mari. Se utilizeaz un buton suplimentar ce are Caption-ul
Optimizare. Ca urmare formularul 5 ce permite modificarea parametrilor
controlerului are aspectul din fig. 10.13.

232

Fig. 10.12: Utilizarea controlului PID

Fig. 10.13: Fereastra pentru alegerea parametrilor i optimizare


Procedura ce permite optimizarea alegerii parametrilor controlerului este:
procedure TForm5.Button4Click(Sender: TObject);
const n=100;
var i,j,k,i1:integer;
kp0,kp2,ki0,ki2,kd0,kd2:double;
pas1,pas2,pas3:double;
suma,minsuma:double;
begin
233

// pasi pentru realizarea grid-ului


kp0:=kp/2; kp2:=2*kp; pas1:= (kp2-kp0)/n;
ki0:=ki/2; ki2:=2*ki; pas2:= (ki2-ki0)/n;
kd0:=kd/2; kd2:=2*kd; pas3:= (kd2-kd0)/n;
minsuma:=100000;
for i:=0 to n do
for j:=0 to n do
for k:=0 to n do
begin
kp:=kp0+i*pas1; //calculam un nou triplet kp,ki,kd
ki:=ki0+j*pas2;
kd:=kd0+k*pas3;
for i1:=0 to 5 do begin y[i1]:=100; u[i1]:=100; yr[i1]:=100; end;
suma:=0; yr[0]:=150; //conditii initiale
i1:=1;
while (i1<=75) and (suma<minsuma) do
begin
Form1.Pas_Conducere;
suma:=suma+i1*abs(y[0]-yr[0]); //functie de cost
if (u[0]=umax) or (u[0]=umin) then suma:=suma+100000;
i1:=i1+1;
end;
if (i+j+k=0) then begin
minsuma:=suma;kp2:=kp;ki2:=ki;kd2:=kd;
end
else if suma<minsuma then
begin
minsuma:=suma; kp2:=kp;ki2:=ki;kd2:=kd;
end;
end;
kp:=kp2;ki:=ki2;kd:=kd2;
//var. cu indicele 1 sunt utilizate pentru ScrollBar-uri
kp1:=kp;ki1:=ki;kd1:=kd;
Edit1.Text:=FloatToStrF(kp,ffGeneral,4,4);
Edit2.Text:=FloatToStrF(ki,ffGeneral,4,4);
Edit3.Text:=FloatToStrF(kd,ffGeneral,4,4);
end;
n procedur, primul pas este realizarea gridului, respectiv gsirea
limitelor pe cele trei direcii de deplasare i a pailor de deplasare. De
234

exemplu, pentru parametrul kp, valorile ce vor fi testate sunt ntre kp/2 i
2*kp. Acest interval se mparte n n puncte, aici s-a ales n=100. Similar sa procedat pentru parametrii ki i kd. Se obin astfel paii de deplasare pe
cele trei direcii de cutare. Dup cum se observ, pentru a nu complica
programul, att pentru definirea spaiului de cutare i a pailor dar i
ulterior, s-au utilizat unele constante ce ar putea fi alese de utilizator
(programul poate fi dezvoltat de cititor).
Dup ce se iniializeaz variabila minsuma cu o valoare foarte
mare (sunt i alte posibiliti, de exemplu minsuma:=maxlongint) se
intr n ciclul triplu n care are loc cutarea tripletului (kp,ki,kd) optim.
Pentru un triplet (kp,ki,kd) se calculeaz o funcie de performan
(funcie de cost). n program s-a ales calculul ponderat a ariei absolute a
abaterii. Pentru acest calcul se realizeaz mai nti fixarea condiiilor
iniiale respectiv att ieirea, referina ct i semnalul de intrare au
valoarea 100, procesul aflndu-se n regim staionar, apoi se alege noua
valoare de referin avnd valoarea 150. Apoi, utiliznd un ciclu while se
simuleaz rspunsul sistemului pentru 75 de pai i se calculeaz funcia
de cost.
Pot fi fcute unele observaii. Prima observaie este legat de
modul de alegere a funciei de cost. Se utilizeaz calculul ponderat a ariei
abaterii; din modul de calcul se observ c eantioanele mai apropiate de
regimul staionar au o pondere mai mare respectiv sunt nmulite cu
numrul eantionului (i1). n acest fel se penalizeaz puternic existena
unei erori staionare.
A doua observaie se refer la penalizarea cazului n care la un
moment dat n simulare trebuie limitat semnalul de control rezultat.
Explicaia este urmtoare: prin limitarea semnalului de control s-ar putea
s obinem un triplet optim (kp,ki,kd) care n alte condiii de funcionare
(de exemplu alt valoare de referin) s funcioneze departe de optim.
A treia observaie se refer la alegerea utilizrii unui ciclu while
(i nu a unui ciclu for). Motivul este urmtorul: este posibil s nu fie
nevoie s simulm comportarea procesului pe toi cei 75 de pai deoarece
la un moment dat s-ar putea ca funcia de cost s aib o valoare mai mare
dect funcia de cost gsit optim pn la acel moment
(suma>minsuma). Abandonarea simulrii pentru respectivul triplet va
conduce la scderea timpului de calcul care oricum poate fi mare, de
ordinul zecilor de secunde.
n fig.10.14 se prezint rezultatele obinute pornind de la valorile
iniiale (kp=1.15, ki=0.08, kd=2). Menionm c procedura de optimizare
235

a fost aplicat de mai multe ori (clic pe butonul Optimizare). Intuitiv ne


dm seama de faptul c nu am ajuns ntr-un minim local prin faptul c,
cel puin pe o direcie, prin optimizare s-a gsit un punct situat la limita
domeniului curent de cutare.

Fig. 10.14: Cutarea optimului


n acest caz procesul de optimizare se va relua. De asemenea trebuie avut
n vedere faptul c minimul obinut este un minim local. Utilizatorul
poate alege i alte puncte (triplete (kp, ki, kd) ) iniiale.
Proiecte propuse
1. Implementai o metod mai eficient de cutare a parametrilor
controlerului PID (Powel, Rosenbrook etc. [11]). Eventual cutai soluii
ale problemelor de optimizare utiliznd Internetul.
2. Studiai toolbox-ul NCD (NonLinear Control Design) din mediul
Matlab i utilizarea lui n optimizarea parametrilor controlerului PID.
3. Realizai o aplicaie ce v permite alegerea parametrilor procesului.
10.4 Identificarea sistemelor liniare
236

Modelarea sistemelor are aplicaii n domenii extrem de variate:


industrie, economie, biologie, medicin etc. Modelul matematic poate fi
definit ca reprezentnd un set de relaii ntre variabilele fizice ale
sistemului analizat sub forma unor structuri matematice de tipul
ecuaiilor algebrice, difereniale, ecuaii cu diferene finite etc., funcie de
tipul modelului utilizat: static, dinamic. n determinarea modelului
matematic se utilizeaz o combinaie adecvat de procedee teoretice i
experimentale. n urma analizei teoretice se determin n general un
sistem de ecuaii difereniale ordinare i/sau cu derivate pariale, sistem
ce reprezint modelul teoretic al procesului avnd structura i parametrii
determinai.
Analiza experimental i propune determinarea modelului
matematic pe baza msurtorilor efectuate asupra variabilelor ce
caracterizeaz evoluia sistemului ntr-un anumit regim. Se msoar
mrimile de intrare i de ieire i se evalueaz printr-o procedur de
identificare legtura ntre variabilele msurate. Mrimile de intrare pot fi
semnalele n funcionarea normal a sistemului sau pot fi introduse n
mod artificial. Uzual se utilizeaz modelele descrise prin intermediul
ecuaiilor cu diferene ca de exemplu ARX (AutoRegresive), ARMAX
(AR de medie alunectoare), modele n spaiul strilor. Dac n ecuaia
(10.1) se alege ordinul modelului (n,m,d) i se culeg datele de intrare i
de ieire n/din proces, pentru a gsi parametrii modelului se poate utiliza
algoritmul celor mai mici ptrate [10], [30], [31]. O posibilitate eficient
i rapid de lucru o ofer toolbox-ul System Identification din mediul
Matlab. Utiliznd mediul Delphi putem obine o soluie ieftin i foarte
rapid din punct de vedere a timpului de calcul.
Facem urmtoarele notaii:
t - vector cu n+m elemente al parametrilor modelului (notat theta n
listing). Primii n parametri corespund ieirii, urmtorii m parametri
corespund intrrii.
t - vector cu n+m elemente (notat Fi in listing) ce conine n valori
ale ieirii msurate i m valori ale intrrii.
P t - matricea de covarian [30] de dimensiune n+m. Este notat pp n
listing.
a t , t - parametri ai algoritmului de identificare (notai aa respectiv
lambda n listing).
Algoritmul de baz [10],[30]:

237

t t 1

a( t )P t 2 t d

t a t t d T P t 2 t d

y t t d

t 1

(10.4)
P t 1

a t P t 2 t d t d T P t 2
1
P t 2

t
t a t t d T P t 2 t d

(10.5)
Se observ c vectorul parametrilor modelului la momentul actual
este egal cu vectorul parametrilor modelului la momentul precedent plus
un factor de corecie ce depinde de diferena ntre ieirea actual i
ieirea estimat la momentul precedent pentru momentul actual. n
algoritm este utilizat i o matrice P, numit matricea de covarian, care
se calculeaz iterativ cu cea de a doua relaie. Nu insistm aici asupra
aspectelor teoretice pe baza crora s-au obinut relaiile de mai sus,
informaii complete se pot gsi n [10], [30]. n implementarea relaiilor
de mai sus s-a notat delta y t t d T t 1 .
Procedura ce realizeaz etapa de identificare este urmtoarea:
procedure TForm1.Identificare_cmmp(var theta:vector; fi:vector;
var pp:matrice;n,m:integer;delta,aa,lambda:real);
var i,j,k1,nab:integer;
temp,temp1:array[0..20 , 0..20] of real ;
ppfi:array[0..20] of real;
temp0:real;
begin
// modul identificare
nab:=n+m;
//Calculam produsul P(t)*Fi(t)
for i:=1 to nab-1 do
begin
ppfi[i]:=0;
for j:=1 to nab-1 do ppfi[i]:=ppfi[i]+pp[i][j]*fi[j];
end;
//Calculam produsul Fi(transpus)*P(t)*Fi(t)
temp0:=0;
for i:=1 to nab-1 do temp0:=temp0+fi[i]*ppfi[i];
temp0:=lambda+aa*temp0; // am calculat numitorul
238

for i:=1 to nab-1 do //calculam noul vector theta


theta[i]:=theta[i]+aa*ppfi[i]*delta/temp0;
//Calculam noua matrice de covarianta notata pp
for i:=1 to nab-1 do
for j:=1 to nab-1 do temp[i][j]:=ppfi[i]*fi[j];
for i:=1 to nab-1 do
for j:=1 to nab-1 do
begin
temp1[i][j]:=0;
for k1:=1 to nab-1 do
temp1[i][j]:=temp1[i][j]+temp[i][k1]*pp[k1][j];
end;
for i:=1 to nab-1 do
for j:=1 to nab-1 do
pp[i][j]:=(pp[i][j]-aa*temp1[i][j]/temp0)/lambda;
end;
Prototipul procedurii este:
procedure identificare_cmmp(var theta:vector; fi:vector;
var pp:matrice; n,m:integer;delta,aa,lambda:real);
Procedura modificat PasConducere:
procedure Tform1.PasConducere();
var i,nab:integer;
begin
nab:=n+m;
delta:=y_masurat-y[0];//abaterea de model
y[0]:=y_masurat;
Identificare_cmmp(theta,fi,pp,n,m,delta,aa,lambda);
for i:=0 to n-1 do a[i]:=theta[i]; //valori noi parametri model
for i:=n to nab-1 do b[i-n]:=theta[i];
{deplasare semnal de control in timp}
for i:=20 downto 1 do u[i]:=u[i-1];
{calcul semnal de control}
u[0]:=u[1]+kp*(yr[0]-y[0]-yr[1]+y[1])+ki*(yr[0]-y[0])-kd*(y[0]2*y[1]+y[2]);{pid}
{limitare semnal de control}
239

if u[0]>umax then u[0]:=umax;


if u[0]<umin then u[0]:=umin;
{deplasam semnal de iesire in timp}
for i:=20 downto 1 do y[i]:=y[i-1];
{calcul semnal de iesire conform ecuaiei procesului real }
y[0]:=0;
for i:=1 to np-1 do y[0]:=y[0]-ap[i]*y[i];
for i:=0 to mp-1 do y[0]:=y[0]+bp[i]*u[i+dp];
y_masurat:=y[0];
{calcul semnal iesire estimat conform ecuaiei modelului procesului}
y[0]:=0;
for i:=1 to n-1 do y[0]:=y[0]-a[i]*y[i];
for i:=0 to m-1 do y[0]:=y[0]+b[i]*u[i+d];
//construiesc vectorul fi
for i:=0 to n-1 do fi[i]:=-y[i];
for i:=0 to m-1 do fi[i+n]:=u[i+d];
{referinta dreptunghiulara}
for i:=np+dp downto 1 do yr[i]:=yr[i-1];
if indm mod 150 =0 then yr[0]:=75
else if indm mod 75 =0 then yr[0]:=175;
end;
n procedura FormActivate se introduc instruciunile:
//parametri controler
kp:=1.15;ki:=0.08;kd:=2;
//initializare parametri model proces
a[1]:=0; a[2]:=0; a[3]:=0;
b[1]:=0; b[2]:=0; b[3]:=0;
for i:=1 to n+m-1 do theta[i]:=0;
theta[0]:=1; //initializare vector theta
for i:=0 to n+m-1 do // initializare matrice de covarianta
begin for j:=0 to n+m-1 do
begin
pp[i][j]:=0;
if(i=j) then pp[i][j]:=100;
end;
end;
//initializare parametri algoritm de identificare
240

lambda:=0.98;aa:=1;y_masurat:=0;
Pentru afiarea diferenei ntre semnalul de ieire la momentul
actual calculat pe baza ecuaiei procesului real i valoarea estimat a
semnalului de ieire la momentul actual, estimaie bazat pe ecuaia
modelului procesului i a parametrilor acestei ecuaii, n formularul 3
depunem o etichet. n aceast etichet vom nscrie aceast diferen;
aceast operaie va fi ultima instruciune din procedura Timer1Timer din
formularul 3. Instruciunea este:
Label1.Caption:='Eroarea de predicie este: +
FloatToStrF(delta,ffGeneral,4,4);
n cazul n care procesul de identificare se desfoar cu succes, aceast
diferen va tinde la 0.
Proiecte propuse
1. Afiai sub form grafic componentele vectorilor A i B, att n cazul
procesului real ct i n cazul modelului procesului (de preferin
utiliznd dou componente Chart dar i sub form numeric). Eventual
utilizai noi elemente de meniu n meniul principal.
2. Pentru meniul Parametri/Parametri_CMMP, facei operaiile necesare
astfel nct utilizatorul s poat introduce parametrii a t , t (notai
n listing cu aa respectiv lambda).
3. Ce se ntmpl dac procesul i modelul nu au aceiai structur
respectiv tripletele (np,mp,dp) i (n,m,d) difer?
4. n practic semnalele sunt afectate de zgomote; n plus apar probleme
legate de liniaritate. Simulai astfel de cazuri i urmrii cum lucreaz
algoritmul de identificare. Putei simula zgomotul utiliznd o instruciune
de tipul: y_masurat:=(250*y_masurat+random(100))/250;
10.5 Algoritmi de control adaptiv-predictiv. Utilizarea simulrii
on-line i a controlului bazat pe reguli.
Metoda de control adaptiv predictiv bazat pe model este din ce n
ce mai utilizat n special n conducerea proceselor lente neliniare sau/i
cu timp mort semnificativ. Comparativ cu alte metode de control, metoda
permite realizarea unor performane de control mult mai bune.
Dezavantajul potenial major este legat de timpul de calcul necesar
241

pentru identificare i pentru calculul valorii semnalului de control.


Datorit ns progreselor n domeniul tehnicii de calcul, metoda se aplic
din ce n ce mai mult i n cazul proceselor rapide. Metoda utilizeaz un
model al procesului condus cu scopul obinerii semnalului de control prin
minimizarea unei funcii de cost.
n [1] s-a propus un algoritm de control destinat aplicaiilor n
care valoarea semnalului de referin este constant pentru perioade lungi
de timp dar se poate modifica arbitrar. S presupunem c este posibil din
punct de vedere a timpului de calcul ca algoritmul s calculeze la fiecare
pas de eantionare prediciile semnalului de ieire i valorile funciei de
cost, pentru toate secvenele posibile ale secvenei de control i apoi s
se aleag ca valoare curent a semnalului de control primul element din
secvena considerat ca fiind optim. Secvenele de control sunt de
forma:

Fig. 10.15: Exemple de predicii ale


ieirii.
u . u( t ),u( t 1 ),..,u( t N )

(10.6)
unde: u(.) este semnalul de control, t este timpul discret, N este orizontul
ieirii. Avantaje ale algoritmului propus: mod simplu de calcul (alte
metode necesit de exemplu inversarea unei matrice), uor de aplicat n
cazul proceselor ce au un model neliniar sau exist constrngeri, minimul
obinut este global.
242

Principalul dezavantaj este timpul mare de calcul necesar pentru a realiza


operaiile respective. Din acest motiv numrul de secvene utilizat trebuie
redus. ntr-o prim etap, se utilizeaz urmtoarele patru secvene de
control:
u1 t u min , u min ,.., u min

u 2 t u max , u min ,.., u min

u 3 t u min , u max ,.., u max

u 4 t u max , u max ,.., u max

(10.7)
unde umin respectiv umax sunt valorile extreme acceptate ale semnalului de
control. Secvenele sunt utilizeaz pentru a simula n viitor comportarea
sistemului de control. n urma simulrii on-line, rezult patru secvene
ale semnalului de ieire y1(t), y2(t), y3(t), y4(t) (fig. 10.15). Pe figur,
secvenele de ieire sunt marcate cu numrul i al secvenei de intrare (ui,
i=1..4). Notaii: d este timpul mort, t0 este momentul actual, t1=N este
orizontul ieirii, yr este referina, ymax0, ymax1, ymin0, ymin1 sunt valorile
extreme prezise ale semnalului de ieire. Semnalul de control se poate
obine prin utilizarea unui set de reguli:
Regula 1: Dac:
ymax0<yr (corespunztor secvenei u1(t))
ymax1>yr (corespunztor secvenei u2(t))
Atunci:
u( t )

u max u min
u y
u max y max 0
y r min max 1
y max 1 y max 0
y max 1 y max 0

Regula 2: Dac:
ymin0<yr (corespunztor secvenei u3(t) )
ymin1>yr (corespunztor secvenei u4(t))
Atunci:
u t

u max u min
u y
u max y min 0
y r min min 1
y min 1 y min 0
y min 1 y min 0

(10.8)
(10.9)

(10.10)
(10.11)

Regula 3: Dac:
ymax0>yr (corespunztor secvenei u1(t))
Atunci: u(t0)=umin
Regula 4: Dac:
ymax1<yr (corespunztor secvenei u2(t))
243

(10.12)
(10.13)
(10.14)

Atunci: u(t0)=umax

(10.15)

Funcie de comportarea sistemului de control, se reduce domeniul permis


a variaiei semnalului de control:
umin uminst(t) u(t) umaxst(t) umax
umin u umax

(10.16)

n relaiile (10.7)..(10.15), variabilele umax, umin se nlocuiesc cu


variabilele umaxst(t), uminst(t). Aceast operaie permite stabilizarea
semnalului de control i conduce la creterea performanelor sistemului
de control. Acest algoritm a fost aplicat cu bune rezultate att pentru
cazul proceselor liniare [3] ct i pentru procese neliniare [6].
Algoritmul prezentat se bazeaz pe presupunerea c valoarea
semnalului de referin este constant pentru lungi perioade de timp. n
cazul problemelor de urmrire, se poate utiliza un algoritm similar. n
figura 10.16 s-au reprezentat cteva situaii ale evoluiei abaterii ei(t) i=1..4.
Fiecare curb a evoluiei prezise a abaterii este marcat cu numrul
secvenei de control (10.7) utilizate pentru simulare. Notaii: d este
timpul mort, t0 este momentul actual, t1 este orizontul ieirii, este un
parametru ce permite o acordare fin (aici se consider =0). S-au utilizat
urmtoarele 5 reguli:
Regula 1: Dac secvena u3(t) conduce la:
min 0 min e3 t i min 0 atunci u(t)=uminst(t).
t 0 d t t1
(10.17)
Regula 2: Dac secvena u2(t) conduce la:
max1 max e 2 t i max1 atunci u(t)=umaxst(t).
t 0 d t t1
(10.18)
Regula 3: Dac secvena u4(t) conduce la:
min1 min e 4 t , min1

i e4(t0+d+1)>0 atunci

t 0 d t t1

u(t)=umaxst(t).
(10.19)
Regula 4: Dac secvena u1(t) conduce la:
max 0 max e1 t , max 0
t 0 d t t1

e1(t0+d+1)<0

atunci

u(t)=uminst(t).
(10.20)
244

Regula 5: n majoritatea celorlalte situaii, se obin situaii similare celei


prezentate n fig.10.17 n care s-au utilizat secvenele u2(t) i u3(t). n
acest caz, semnalului de control se calculeaz utiliznd o relaie liniar:
u t

u min st t max1 u max st t min0


max1 min 0
(10.21)

Dac algoritmul utilizeaz doar aceste 5 reguli, variaia


semnalului de control u(t) va fi n limite largi. Sunt cteva metode pentru
reducerea acestei variaii. O metod este utilizarea unui algoritm ce
modific limitele acceptate ale semnalului de control pe baza relaiilor
(10.16). Ca urmare, n timp, diferena ntre limitele umaxst(t) i uminst(t) va
scdea. Aceast scdere trebuie ns limitat la o valoare acceptabil
astfel nct s fie posibile calculele de simulare i interpretare a
rezultatelor simulrilor. Pe de alt parte, sunt situaii n care aceast
diferen trebuie s creasc, de exemplu dac parametrii modelului nu
sunt bine identificai ca urmare a modificrii punctului de funcionare sau
a unor parametri ai procesului.
Procedura ce implementeaz algoritmul de control este:

Fig. 10.17: Predicii. Cazul


5.
Fig. 10.16: Predicii ale abaterii. Cazurile
1..4.

procedure TForm1.CalculComanda;
245

var i,j,imin0,imin1,imax0,imax1 : integer;


max0,max1,min0,min1:real; //extremele
temp0,aux1,aux2,aux11,aux22:double; //variabile auxiliare
yu,uu,vmin0,vmin1,vmax0,vmax1 : array [0..40] of real;
ocda,testalg:integer;
begin
//se aleg unii parametri ai algoritmului de control
ocda:=40; //orizontul iesirii (N) numrul de pasi utilizati
k_st:=0.1;//coeficient reducere diferena umaxst-uminst
k_umed:=0.9; //coeficient calcul umediu
//calculam valoarea medie u(t)
umediu:=k_umed*umediu+(1-k_umed)*u[0];
// calculam predictiile in cazul celor patru secvente
// calculam maximul atins in ipoteza sirului de comanda
// u1= umin,umin,umin...
// copii semnale intrare/iesire
for i:=0 to 20 do begin yu[i]:=y[i];uu[i]:=u[i];end;
max0:=yu[0];imax0:=1;uu[0]:=uminst; //initializari
for i:=1 to ocda do // ciclu simulare comportare proces
begin
temp0:=0;
for j:=1 to n-1 do temp0:=temp0-theta[j]*yu[j-1];
for j:=n to n+m-1 do temp0:=temp0+theta[j]*uu[d+j-n];
vmax0[i]:=temp0-yrv[i];// abatere de urmarire
if(temp0>max0) then begin
max0:=temp0; //noul extrem
imax0:=i; //timpul la care este realizat
end;
//deplasare semnale in timp
for j:=20 downto 1 do begin yu[j]:=yu[j-1];uu[j]:=uu[j-1];end;
yu[0]:=temp0;uu[0]:=uminst;
// iesire fortata la calcule nerelevante
if((temp0<-1000) or (temp0>1000)) then break;
end;
// calculam maximul atins in ipoteza sirului de comanda
// u2=umax,umin,umin...
for i:=0 to 20 do begin yu[i]:=y[i];uu[i]:=u[i];end;
max1:=yu[0];imax1:=1;
uu[0]:=umaxst;
246

for i:=1 to ocda do


begin
temp0:=0;
for j:=1 to n-1 do temp0:=temp0-theta[j]*yu[j-1];
for j:=n to n+m-1 do temp0:=temp0+theta[j]*uu[d+j-n];
vmax1[i]:=temp0-yrv[i]; // abatere de urmarire
if(temp0>max1) then begin
max1:=temp0; //noul extrem
imax1:=i; //timpul la care este realiza
end;
for j:=20 downto 1 do begin yu[j]:=yu[j-1];uu[j]:=uu[j-1];end;
yu[0]:=temp0; uu[0]:=uminst;
if((temp0<-1000) or (temp0>1000)) then break;
end;
// calculam minimul atins in ipoteza sirului de comanda
// u3=umin,umax,umax...
for i:=0 to 20 do begin yu[i]:=y[i];uu[i]:=u[i];end;
min0:=yu[0];imin0:=1;
uu[0]:=uminst;
for i:=1 to ocda do
begin
temp0:=0;
for j:=1 to n-1 do temp0:=temp0-theta[j]*yu[j-1];
for j:=n to n+m-1 do temp0:=temp0+theta[j]*uu[d+j-n];
vmin0[i]:=temp0-yrv[i]; // abatere de urmarire
if (temp0<min0) then begin
min0:=temp0;//noul extrem
imin0:=i; //timpul la care este realizat
end;
for j:=20 downto 1 do
begin
yu[j]:=yu[j-1];
uu[j]:=uu[j-1];
end;
yu[0]:=temp0; uu[0]:=umaxst;
if((temp0<-1000) or (temp0>1000)) then break;
end;
// calculam minimul atins in ipoteza sirului de comanda
// u4=umax,umax,umax...
247

for i:=0 to 20 do begin yu[i]:=y[i];uu[i]:=u[i];end;


min1:=yu[0]; imin1:=1;
uu[0]:=umaxst;
for i:=1 to ocda do
begin
temp0:=0;
for j:=1 to n-1 do temp0:=temp0-theta[j]*yu[j-1];
for j:=n to n+m-1 do temp0:=temp0+theta[j]*uu[d+j-n];
vmin1[i]:=temp0-yrv[i]; // abatere de urmarire
if(temp0<min1) then begin
min1:=temp0; //noul extrem
imin1:=i; //timpul la care este realizat
end;
for j:=20 downto 1 do begin yu[j]:=yu[j-1];uu[j]:=uu[j-1];end;
yu[0]:=temp0;
uu[0]:=umaxst;
if((temp0<-1000) or (temp0>1000)) then break;
end;
// Din datele obtinute prin simulare, aici vom utiliza doar vectorii in
// care se memoreaza abaterile (vmax0,vmax1,vmin0,vmin1) adica se
// consider cazul urmririi.
// Vom calcula extremele erorii conform figurilor
aux1:=vmax1[d+1];
for i:=2+d to ocda do if vmax1[i]>aux1 then aux1:=vmax1[i];
aux11:=vmax0[d+1];
for i:=2+d to ocda do if vmax0[i]>aux11 then aux11:=vmax0[i];
aux2:=vmin0[d+1];
for i:=2+d to ocda do if vmin0[i]<aux2 then aux2:=vmin0[i];
aux22:=vmin1[d+1];
for i:=2+d to ocda do if vmin1[i]<aux22 then aux22:=vmin1[i];
temp0:=0;testalg:=0; //variabila testalg indic regimul de lucru
if aux2>0 then begin u[0]:=uminst;testalg:=1;end
else if aux1<0 then begin u[0]:=umaxst;testalg:=2;end
else if ((vmin1[d+1]>0) and (aux22<0)) then
begin u[0]:=umaxst;testalg:=3;end
else if ((vmax0[d+1]<0) and (aux11>0)) then
begin u[0]:=uminst;testalg:=4;end;
if(testalg=0) then begin
if(aux2>0) then testalg:=6
248

else if(aux1<0) then testalg:=7


else if((vmin1[d+1]>0) and (aux22<0)) then testalg:=8
else if((vmax0[d+1]<0) and (aux11>0)) then testalg:=9;
aux2:=-aux2;
u[0]:=(umaxst*aux2+uminst*aux1)/(aux1+aux2);
if testalg=0 then testalg:=5;
end;
//recalculam valorile umaxst(t),uminst(t)
//pentru aceasta se aplica un set de reguli
if (testalg=5) then
begin //dorim ca umediu sa fie egal departat de umaxst, uminst
if ((umaxst-umediu)>(umediu-uminst)) then
begin
umaxst:=umaxst-round(k_st*(umaxst-umediu));
uminst:=round(2*umediu-umaxst);
end
else begin
uminst:=uminst+round(k_st*(umediu-uminst));
umaxst:=round(2*umediu-uminst);
end;
//nu admitem o apropiere prea mare intre umediu si umaxst sau
// intre umediu si uminst; variabila dust este declarata in
programul // principal si se poate alege de catre utilizator
if((umaxst-umediu)<dust) then umaxst:=round(umediu+dust);
if((umediu-uminst)<dust) then uminst:=round(umediu-dust);
end
else if ((testalg>0) and (testalg<5)) then
begin
// nu suntem inca in regim stationar; modificam umaxst si uminst
if((testalg=2) or(testalg=3)) then
umaxst:=umaxst+round(k_st*(umax-umaxst));
if((testalg=1) or(testalg=4)) then
uminst:=uminst-round(k_st*(uminst-umin));
end;
// pe cat posibil dorim ca u[0] sa fie la mijlocul distantei dintre
// umaxst si uminst
if (umaxst-u[0])<((u[0]-uminst)/2)
then umaxst:=round(1.5*u[0]-uminst/2)
else if (u[0]-uminst)<((umaxst-u[0])/2)
249

then uminst:=round((1.5*u[0]-umaxst/2));
//limitam umaxst, uminst
if umaxst>umax then umaxst:=umax;
if uminst<umin then uminst:=umin;
//pentru testalg >=5 suntem in regim stationar si ca urmare putem
//limita variatia semnalului de control
if (testalg>=5) then //filtrare suplimentara u(t)
u[0]:=(0.5*u[0]+(1-0.5)*umediu);
end;
Pentru a testa acest algoritm s-a utilizat acelai proces ca i cel
din aplicaia precedent, n condiiile n care parametrii procesului se
consider necunoscui i sunt identificai prin utilizarea algoritmului
celor mai mici ptrate. Se modific ns modul de calcul al semnalului de
control, respectiv instruciunea ce implementeaz algoritmul PID este
nlocuit cu apelul procedurii CalculComanda ce implementeaz
algoritmul de mai sus. De asemenea se utilizeaz un semnal de referin
trapezoidal. Evident c timpul de calcul va crete dar vor crete i
performanele sistemului de control. n fig. 10.18 se prezint evoluia
semnalelor de control i de ieire pentru 200 intervale de eantionare.

Fig. 10.18: Algoritm de control adaptiv-predictiv


250

Proiecte propuse
1. Afiai evoluia identificrii parametrilor modelului procesului. Se vor
utiliza dou ferestre separate pentru coeficienii polinoamelor A i B
(ecuaia 10.1, vezi i fig. 10.19). Dac este necesar se pot afia i
parametrii procesului. Afiai i evoluia erorii de model respectiv
diferena ntre valoarea ieirii furnizate de model i valoarea ieirii
msurate.
2. Afiai numeric valorile parametrilor procesului i respectiv valorile
parametrilor modelului. Gsii modaliti simple prin care s putei
modifica parametrii procesului, n timpul simulrii. Urmrii n acest caz
modul n care lucreaz algoritmul de identificare.
3. n fereastra n care se afieaz semnalul de control, afiai i evoluiile
semnalelor umaxst respectiv uminst (vezi i fig. 10.19).
4. n fereastra n care se afieaz valorile semnalelor de referin i de
ieire afiai i prediciile calculate pentru cele patru iruri de control
utilizate n simulare (vezi i fig. 10.19).

251

Fig. 10.19 : Control adaptiv-predictiv. Reprezentri semnale


5. Reprezentarea unui proces liniar sub forma unei ecuaii de forma
(10.1) pe de o parte permite o automatizare a etapelor de modelare i
control, pe de alt parte ns conduce la pierderea legturii ntre
parametrii fizici ai procesului i parametrii ecuaiei [30]. Uzual, din punct
de vedere a implementrii practice acest lucru are o importan relativ
redus. Totui sunt situaii, att n modelare ct i n practic n care sunt
foarte utile unele informaii suplimentare. De exemplu, n cazul
implementrii proiectului 2, vei constata c modificarea parametrilor
ecuaiei (10.1) ce descrie procesul, fr a lua n calcul stabilitatea, poate
conduce de multe ori la obinerea unui proces instabil, chiar dac
procesul studiat este prin natura lui stabil. Din acest motiv este util
reprezentarea procesului i sub forma poli-zerouri-factor de amplificare
[1]. n acest caz, pentru a studia de exemplu modulul de identificare, mai
realist este s modificm poziia polilor, zerourilor sau a factorului de
252

amplificare pentru proces. Dup cum se tie [13], n cazul reprezentrii


unui proces liniar sub forma unei funcii de transfer, condiia ca procesul
s fie stabil este ca polii sistemului s fie situai n semiplanul stng adic
s aib partea real negativ. n cazul unui sistem discret echivalent
descris prin intermediul unei ecuaii de tipul (10.1), condiia ca sistemul
s fie stabil este ca polii sistemului s fie situai n interiorul cercului
unitar[13]. Polii sistemului (10.1) sunt dai de rdcinile ecuaiei A(.)=0
iar zerourile sistemului sunt date de rdcinile ecuaiei B(.)=0. Prin
urmare se pune problema gsirii soluiilor complexe ale unei ecuaii
algebrice cu coeficieni reali. Avnd n vedere natura problemei (nu
foarte simpl, dar cu aplicaii foarte largi), metoda cea mai rapid este
cutarea unor proceduri gata scrise, de exemplu prin utilizarea
Internetului [32], [33]. De obicei, pentru gsirea soluiilor complexe ale
unei ecuaii polinomiale, aceste proceduri utilizeaz metoda Bairstow.
Se pot astfel reprezenta (fig. 10.20.) att polii procesului (cruce) i
modelului procesului (triunghi) ct i zerourile procesului (cruce
diagonal) i modelului procesului (cerc).

Fig. 10.20 : Reprezentare sub forma poli/zerouri


Dezvoltai proiectele anterioare afind att distribuia polilor i
zerourilor ct i factorii de amplificare pentru proces respectiv model.
6. Aplicaia prezentat este destinat proceselor de urmrire. Realizai o
aplicaie similar destinat aplicaiilor n care semnalul de referin este
constant pentru perioade lungi de timp. Se vor utiliza relaiile
10.7..10.15. Facei o comparaie ntre rezultatele obinute prin utilizarea
celor doi algoritmi. Avnd n vedere forma semnalelor din fig. 10.18, este
de ateptat ca utilizarea combinat a celor dou tipuri de algoritm s
conduc la obinerea unor performane mai bune (cel puin n poriunile
n care semnalul de referin este constant). Realizai o astfel de aplicaie.
253

7. n multe situaii practice, factorul de amplificare al unui proces poate


varia. Dai un exemplu de astfel de proces. Modelai procesul i
implementai diverse posibiliti de simulare a variaiei factorului de
amplificare (liniar ntre dou extreme, sinusoidal, modificri brute i
aleatoare etc.). Urmrii modul n care se comport algoritmul de
identificare. Utilizai diverse tipuri de semnal de referin:
dreptunghiular, trapezoidal, sinusoidal etc. Dai exemple de aplicaii n
care semnalul de referin este sinusoidal.
8. Se consider un proces (sistem de orientare - domeniul aviatic) descris
de urmtoarea funcie de transfer [7], [12]:
H (s)

1
s ( s 1)

Acest sistem este instabil n bucl deschis deoarece are un pol a crui
parte real este pozitiv. Utiliznd T=0.1s (perioada de eantionare), se
poate calcula funcia de transfer n z (de exemplu utiliznd funcii
Matlab [34]):
H ( z)

0.0051709( z 1.034)
( z 1.105)( z 1)

Aplicai acestui proces algoritmul de control bazat pe simularea on line.


Comparai cu utilizarea unui controler PID i cu utilizarea unui controler
ce are funcia de transfer [12]: C( s )

254

K s z
(s p)

You might also like