И так....
Сидю колупаю...
Написал код на делфи (меньше места занимает при инстале).
Возникло куча вопросов.
Рассмотрим методику и мой подход к решению вопроса о наглядности ПИД регулятора.
Знание в ТАУ есть немного (теория автоматического управления). Просьба прочитать и исправить то что я возможно неправильно написал (ошибаюсь в подходе).
И так, приступим.
Взял звено инерционное.
Формула вот:
Дальше замкнул систему по обратной связи и подал на вход единицу (сори, схему не выложу, но по идее ниже похожая схема)
Для делфи получил формулу:
Код:
|
B:=0.2;
for i:=1 to 2000 do
begin
A:=i/10;
f[i]:=1-(1/A)/(B+1/A);
end; |
А в даном случае есть временной переменной (Т на формуле).
Получил график запаздывания - график медленно набирает значение.
Дальше постал вопрос о ПИД регуляторе.
Взял по инфе выше описал его формулу.
Сделал схему (Пид регулятор включен последовательно с инерционным звеном, а именно перед ним), дальше обратная отрицательная связь.
В схеме дальше стоит инерционное звено, дальше обратная отрицательная связь на вход ПИД.
По теории ТАУ передаточные функции должны умножатся (при параллельном подключении - суммироватся)
(прав ли я??)
Для делфи получил вот что:
Код:
|
procedure TForm1.Button1Click(Sender: TObject);
var f2:array [1..2000] of double;
Kprop, Kinteg, Kdef:real;
i: integer;
t_step, error, integral, setpoint, currentpoint, pre_error, pid: real;
min, max: real;
A,B:real;
begin
//------------------------------------
t_step:=0.1;
setpoint:=1;
min:= -0.3;
max:= 0.3;
//------------------------------------
Kprop:= StrToFloat(Form1.Edit1.Text);
Kinteg:= StrToFloat(Form1.Edit2.Text);
Kdef:= StrToFloat(Form1.Edit3.Text);
for i:=1 to 2000 do
begin
error:= setpoint-currentpoint;
A:=i/10;
B:=0.1;
//---------------------------
if (min ‹ integral) then
if (integral‹ max) then
integral:=integral+error;
pid:=Kprop*error+Kinteg*integral*t_step+Kdef*(erro r-pre_error)/t_step;
f2[i]:=1-pid*(1/A)/(B+1/A);
//currentpoint:=f2[i];
pre_error:=error;
end;
Chart1.Series[1].AddArray(f2)
end; |
В результате получилось непонятно что.... Без пререригулирования и "начало" воздействия идет не с нуля.
Где промазал?
Вопрос возник с вычислением ошибки. Что в данном случае (например температура) играет "currentpoint"?? Можете пояснить как его получить в данном контексте?
Да, на вход подается единица (единичный скачек):
f2[i]:=
1-pid*(1/A)/(B+1/A);