DMC单入单出控制程序
这是一个加热炉控制程序 程序是自己编的 请大家指正
[math]$frac{0.6 exp(-20)}{2400 s^2+85s+1}$ [/math]
Contents
* 程序开始
* 建立传递函数
* 设置PID参数
* 主程序 初始化DMC
* DMC程序
* 画图显示结果
%程序开始
clc;
clear all;
close all;
%建立传递函数
G=tf(0.6,[2400 85 1]);
set(G,’InputDelay’,20);
[y0,t0]=step(G,0:5:500);
%设置DMC参数
Ts=5;%采样时间
N=60;%截断步长
P=25;%预测步长
m=1;%控制步长
% for m=1:3
Sv=10;%设定值
%主程序 初始化DMC
A=zeros(P,m);%动态矩阵
a=zeros(N,1);
for i=1:N
a(i)=y0(i);
end
for i=1:P
for j=1:m
if i-j+1>0
A(i,j)=a(i-j+1);
end
end
end
K=inv(A’*A+eye(m))*A’;
ys=ones(N,1);
y=zeros(N,1);
u=zeros(N,1);
e=zeros(N,1);
A0=zeros(P,N-1);
for i=1:P
for j=N-2:-1:1
if N-j+1+i-1
A0(i,j)=a(N-j+1+i-1)-a(N-j+i-1);
else
A0(i,j)=0;
end
end
A0(i,N-1)=a(i+1);
end
%DMC程序
for k=2:N
Uk_1=zeros(N-1,1);
for i=1:N-1
if k-N+i
Uk_1(i)=0;
else
Uk_1(i)=u(k-N+i);
end
end
Y0=A0*Uk_1;
e(k)=y(k-1)-Y0(1);
Ysk=zeros(P,1);
for i=1:P
Ysk(i)=Sv;
end
Ek=zeros(P,1);
for i=1:P
Ek(i)=e(k);
end
dertu=K*(Ysk-Y0-Ek);
for i=1:m
if k+i-1
u(k+i-1)=u(k+i-1-1)+dertu(i);
end
end
temp=0;
for j=1:N-1
if k-j
temp;
else
if k-j-1
temp=temp+a(j)*u(k-j);
else
temp=temp+a(j)*(u(k-j)-u(k-j-1));
end
end
end
if k-N
y(k)=temp+e(N);
else
y(k)=temp+a(N)*u(k-N)+e(N);
end
end
%画图显示结果
t=Ts.*(1:N);
subplot(2,1,1);
plot(t,y,’.-‘);
legend(‘y’,’Location’,’Best’);
title(‘输出曲线’);
xlabel(‘Time’)
ylabel(‘振幅’)
grid on
subplot(2,1,2);
plot(t,u,’.-‘);
legend(‘控制作用u’,’Location’,’Best’)
% if m==1
% plot(t,u,’-‘,’LineWidth’,2);
% end
% if m==2
% plot(t,u,’–‘,’LineWidth’,2);
% end
% if m==3
% plot(t,u,’.-‘,’LineWidth’,2);
% end
% legend(‘控制作用u:实线m=1,虚线m=2,点线m=3′,’Location’,’Best’)
title(‘控制作用’);
xlabel(‘Time’)
ylabel(‘振幅’)
grid on
hold on
% end
相关资源:基于WinCC组态软件的加热炉炉温优化与仿真研究_winCC实现加热炉…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!