Цитата(kostya77 @ 25.7.2007, 20:00) [snapback]149180[/snapback]
На обьекте стоит контролер симес PRV 2
...............
620 N:=X1*Y1*(Y3-Y2)+X2*Y2*(Y1-Y3)+X3*Y3*(Y2-Y1)
630 CN:=(X1*(Y2-Y3)+X2*(Y3-Y1)+X3*(Y1-Y2))/N
640 CS:=(X1-X2+CN*(Y1*X1-Y2*X2))/(Y1-Y2); CO:=X1+Y1*(CN*X1-CS)
Подскажите этот фрагмент ПИД регулятор ?
поскажите где копать
Похоже на то, но что то я с коэффициентами не могу разобраться...
советую посмотреть теорию:
http://atm.h1.ru/root/theory/theory33.htmlи кроме того 2 реализации (рекуррентнного и нерекуррентнного алгоритмов) выложенных в интернете:
Рекуррентный алгоритм
U=U1-C0*E+C1*E1+C2*E2
C0=Ku*(1+Td/T0)
C1=Ku*(1+2Td/T0-T0/Ti)
C2=Ku*Td/T0
Ku коэффициент усиления
T0 период квантрвания (обычно берут 1)
Ti постоянная интегрирования
Td постоянная дифференцирования
E текущее значение ошибки
E1 значение ошибки такт назад
E2 значение ошибки 2 такта назад
VAR
M:INT; /* переключатель */
U:REAL; /* выход регулятора */
U1:REAL; /* выход такт назад */
E:REAL;
E1:REAL;
E2:REAL;
C0,C1,C2:REAL;
END_VAR;
/* PID subprogram, call cyclically */
PROCEDURE PID;
BEGIN
IF M=1 THEN
BEGIN
E2:=E;
U:=(-C0)*E;
Output(U); /* Процедура вывода управляющего возд. */
U1:=U;
M:=2;
END;
ELSE IF M=2 THEN
BEGIN
E1:=E;
U:=U1-C0*E1+C1*E2;
Output(U);
U1:=U;
M:=0;
END
ELSE
BEGIN
U:=U1-C0*E+C1*E1+C2*E2;
Output(U);
U1:=U;
E2:=E1;
E1:=E;
END;
END_IF;
END;
/*при первом обращении к подпрограмме М должно быть равно 1*/
Нерекуррентный алгоритм
U=C0*E+C1*SUM+C2*(E-E1)
C0=Ku
C1=Ku*T0/Ti
C2=Ku*Td/T0
SUM - сумма ошибок с первой по предпоследнюю
VAR
M:INT; /* переключатель */
U:REAL; /* выход регулятора */
E:REAL;
E1:REAL;
SUM:REAL;
C0,C1,C2:REAL;
END_VAR;
PROCEDURE PID;
BEGIN
IF M=1 THEN
BEGIN
E1:=E;
SUM:=E;
U:=C0*E+C1*SUM;
Output(U);
M=0;
END;
ELSE
BEGIN
SUM:=SUM+E;
U:=C0*E+C1*SUM+C2*(E-E1);
E1:=E;
END;
END_IF;
END;
Это не совсем паскаль, но очень похоже.
Мертвую зону и ограничение добавиь по потребности