资源简介

关于串级控制的matlab实现,一般书本上都是利用simulink搭建相应的控制回路,本程序则是通过m语言实现的,并且实现了手自动无扰切换,还加上了前馈控制。

资源截图

代码片段和文件信息

clear
clc

pidBlock(1)=struct(‘blockName‘‘LIC1002‘‘direct‘1‘AMC‘‘AUT‘‘SP‘0‘PV‘0‘MV‘0‘Kc‘58‘Ti‘0.3‘Td‘0.075‘spanHigh‘2.52‘spanLow‘0‘E0‘0‘E1‘0‘E2‘0);
pidBlock(2)=struct(‘blockName‘‘LIC1001‘‘direct‘1‘AMC‘‘AUT‘‘SP‘70‘PV‘0‘MV‘0‘Kc‘8‘Ti‘2‘Td‘0.1‘spanHigh‘2.52‘spanLow‘0‘E0‘0‘E1‘0‘E2‘0);


%部分参数的值
H1=1.5;H2=1.4;
ku=0.2;A=2;
R12=2*sqrt(1.5)/0.20412;
R2=2*sqrt(1.4)/0.21129;
ts=0.1;
Qd1=0.15;Qd2=0.05;
%第一个水箱离散化
sys1=tf(R12*ku[R12*A1]);
dsys1=c2d(sys1ts‘z‘);
[num1den1]=tfdata(dsys1‘v‘);
%第二个水箱离散化
sys2=tf(R2[R12*R2*AR12]);
dsys2=c2d(sys2ts‘z‘);
[num2den2]=tfdata(dsys2‘v‘);

%扰动Qd1
sys3=tf(R12[R12*A1]);
dsys3=c2d(sys3ts‘z‘);
[num3den3]=tfdata(dsys3‘v‘);

%扰动Qd2
sys4=tf(R2[R2*A1]);
dsys4=c2d(sys4ts‘z‘);
[num4den4]=tfdata(dsys4‘v‘);

%前馈控制器
sys5=-sys4;
dsys5=c2d(sys5ts‘z‘);
[num5den5]=tfdata(dsys5‘v‘);


%初值
w=0;u1_1=0.5;u2_1=0;h1_1=0;h2_1=0;dh1_1=0;dh2_1=0;dh2f_1=0;
pidBlock(1).SP=pidBlock(1).SP/100*(pidBlock(1).spanHigh-pidBlock(1).spanLow)+pidBlock(1).spanLow-H1;%H1的实际偏差输入值
pidBlock(2).SP=pidBlock(2).SP/100*(pidBlock(2).spanHigh-pidBlock(2).spanLow)+pidBlock(2).spanLow-H2;%H2的实际偏差输入值


%程序
for k=1:1:1000
    rin(k)=1;
    time(k)=k*ts;
    du1(k)=pidBlock(2).Kc*[(pidBlock(2).E0-pidBlock(2).E1)+ts/pidBlock(2).Ti*pidBlock(2).E0+pidBlock(2).Td*(pidBlock(2).E0-2*pidBlock(2).E1+pidBlock(2).E2)/ts];
    u1(k)=u1_1+du1(k);

    du2(k)=pidBlock(1).Kc*[(pidBlock(1).E0-pidBlock(1).E1)+ts/pidBlock(1).Ti*pidBlock(1).E0+pidBlock(1).Td*(pidBlock(1).E0-2*pidBlock(1).E1+pidBlock(1).E2)/ts];
    u2(k)=u2_1+du2(k);
    
    dh1(k)=-den3(2)*dh1_1+num3(2)*Qd1;%扰动Qd1的输出
    dh2(k)=-den4(2)*dh2_1+num4(2)*Qd2;%扰动Qd2的输出
    dh2f(k)=-den5(2)*dh2f_1+num5(2)*Qd2;%前馈控制器输出
    
    h1(k)=-den1(2)*h1_1+num1(2)*pidBlock(1).MV*pidBlock(1).direct+dh1(k); 
    %h2(k)=-den2(2)*h2_1+num2(2)*h1(k)*pidBlock(2).direct+dh2(k);%无前馈控制器
    h2(k)=-den2(2)*h2_1+num2(2)*h1(k)*pidBlock(2).direct+dh2(k)+dh2f(k);%有前馈控制器
    
    pidBlock(2).PV=h2(k);
    pidBlock(2)=pid_function(pidBlock(2)u1(k));
   
    pidBlock(1).SP=u1(k);
    pidBlock(1).PV=h1(k);
    pidBlock(1)=pid_function(pidBlock(1)u2(k));

    dh1_1=dh1(1);
    dh2_1=dh2(k);
    dh2f_1=dh2f(k);
    u1_1=u1(k);
    u2_1=u2(k);
    h1_1=h1(k);
    h2_1=h2(k);
    
    %将求出的h1(k)h2(k)化为百分数
    y1(k)=(h1(k)+H1-pidBlock(2).spanLow)/(pidBlock(2).spanHigh-pidBlock(2).spanLow)*100;
    y2(k)=(h2(k)+H2-pidBlock(1).spanLow)/(pidBlock(1).spanHigh-pidBlock(1).spanLow)*100;
end


plot(timey2);
xlabel(‘时间/s‘);
ylabel(‘第二个水箱液位H2‘);
title(‘扰动Qd2变化前的阶跃响应曲线‘);
grid
    
    
    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2013-06-12 12:39  串级控制的Matlab实现\
     文件        2796  2013-01-30 14:59  串级控制的Matlab实现\main.m
     文件         320  2013-01-27 16:16  串级控制的Matlab实现\pid_function.m

评论

共有 条评论