Министерство образования Республики Беларусь Учреждение образования Брестский государственный технический университет

advertisement
Министерство образования Республики Беларусь
Учреждение образования
Брестский государственный технический университет
Кафедра ИИТ
Лабораторная работа № 8
Выполнила:
студентка 3 курса, ФЭИС
группы АС-28
Слюсарева М. А.
Проверил:
Войцехович Г.Ю.
Брест 2011
Задание: Алгоритм работы ПИД-регулятора может быть представлен в следующем
виде:
На C++ реализовать программу, моделирующую рассмотренный выше ПИД-регулятор.
Решение
#include <iostream>
#include <math.h>
using namespace std;
class Regulator
{
public:
Regulator(); //Конструктор
void linear(double, double); //по линейному закону
void nonlinear(double, double); //по нелинейному закону
};
Regulator::Regulator()
{
int incomHeat=0;
int currTem=incomHeat;
int maxTem=50;
};
void Regulator::linear(double y, double w) //y-начальная температура; w-желаемое значение
температуры
{
double k=1; //K-коэффициент передачи
double ti=1; //Ti-постоянная интегрирования
double td=1; //Td-постоянная дифференцирования
double t0=1; //To-шаг по времени
double e=0; //e(t)-отклонение выходной переменной от желаемого значения в момент
времени t
double e1=0; //e(t-1)-отклонение выходной переменной от желаемого значения в
момент времени t-1
double e2=0; //e(t-2)-отклонение выходной переменной от желаемого значения в
момент времени t-2
double du=0; //delta u-управляющее воздействие
double u1=0; //u(k-1)-управляющее воздействие в момент времени t-1
double u=0; //u(k)-управляющее воздействие на данном этапе
double q0, q1, q2; //q0, q1, q2-параметры регулятора
cout<<"linear: "<<"K="<<k<<" T="<<ti<<" Td="<<td<<" To="<<t0<<" y="<<y<<"
W="<<w<<endl;
q0=k*(1+td/t0); //вичисляем параметры регулятора
q1=-k*(1+2*td/t0-t0/ti);
q2=k*td/t0;
int i;
for (i=0; i<=290; i++)
{
cout<<y<<"\t"; //Вывод температуры
du=q0*e+q1*e1+q2*e2;
u=u1+du;
y=0.988*y+0.232*u; //Вычисление температуры
u1=u;
e2=e1;
e1=e;
e=w-y;
}
cout<<endl;
}
void Regulator::nonlinear(double y, double w) //y-начальная температура; w-желаемое
значение температуры
{
double k=0.01; //K-коэффициент передачи
double ti=1; //Ti-постоянная интегрирования
double td=1; //Td-постоянная дифференцирования
double t0=1; //To-шаг по времени
double e=0; //e(t)-отклонение выходной переменной от желаемого значения в момент
времени t
double e1=0; //e(t-1)-отклонение выходной переменной от желаемого значения в
момент времени t-1
double e2=0; //e(t-2)-отклонение выходной переменной от желаемого значения в
момент времени t-2
double q0, q1, q2; //q0, q1, q2-параметры регулятора
double du=0; //delta u-управляющее воздействие
double u=1; //u(k)-управляющее воздействие в момент времени t
double u1=1; //u(k-1)-управляющее воздействие в момент времени t-1
double u2=0; //u(k-2)-управляющее воздействие в момент времени t-2
double y1=0; //y(k-1)-температура в момент времени t-1
double y2=0; //y(k-2)-температура в момент времени t-2
cout<<"nonlinear: "<<"K="<<k<<" T="<<ti<<" Td="<<td<<" To="<<t0<<" y="<<y<<"
W="<<w<<endl;
q0=k*(1+td/t0); //вичисляем параметры регулятора
q1=-k*(1+2*td/t0-t0/ti);
q2=k*td/t0;
int i;
for (i=0; i<=280; i++)
{
cout<<y<<"\t"; //Вывод температуры
du=q0*e+q1*e1+q2*e2;
u=u1+du;
y=0.9*y1-0.001*pow(y2,2)+u+sin(u2); //Вычисление температуры
u2=u1;
u1=u;
y2=y1;
y1=y;
e2=e1;
e1=e;
e=w-y;
}
}
void main()
{
Regulator Regulator1;
double y1=0; //Начальная температура
double w=6;
//Какую температуру поддерживать
Regulator1.linear(y1,w); //Включение чайника по линейному закону
Regulator1.nonlinear(y1,w); //Включение чайника по нелинейному закону
cin.get();
}
График изменения температуры
Регулирование температуры с помощью ПИД-регулятора в нелинейной модели
происходит более быстро и с меньшими колебаниями, чем у линейной модели.
Download