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进行处理,非常感谢!

上一篇 2021年2月16日
下一篇 2021年2月16日

相关推荐