关键字:Matalb;S7-200 SMART;Modbus TCP;PID控制
系列文章目录
基于S7-200 SMART实现一键启停
顺序功能图——(二)设计机组延时关机程序
基于S7-200 SMART实现Modbus TCP通信
基于S7-200 SMART实现MATLAB写入与读取PLC数据
文章目录
- 系列文章目录
- 前言
- 一、MATLAB代码
- 1.清除命令窗口、工作区、画图窗口
- 2.参数设置
- 3.创建modbus连接对象
- 4.求离散传递函数
- 5. 循环更新参数
- 二、S7-200 SMART代码
- 1.将double类型变量转换为real类型变量
- 2.建立Modbus TCP服务器
- 3.将real类型的过程变量转换为word类型的过程变量
- 4.PID控制器
- 4.1PID回路控制算法
- 4.2PID向导
- 4.3PID0_CTRL
- 5.控制器输出处理
- 三、仿真实验
- 1.手动模式下的输出
- 2.自动模式下的输出
- 总结
前言
基于S7-200 SMART可以通过向导实现PID控制,但是如果没有实验器材,很难观察到实际的控制效果。MATLAB作为一个强大的开发软件,支持工业上常用的通信协议,而且MATLAB也经常用作仿真实验。如果在MATLAB中模拟被控对象,并将被控对象数据与控制器数据通过Modbus TCP进行传输,就可以实现基于PLC的PID控制仿真。
一、MATLAB代码
1.清除命令窗口、工作区、画图窗口
matlab">clc;
clear;
close all;
2.参数设置
建立电加热锅炉模型:
G ( s ) = Δ T Δ U = K T 1 s + 1 e T 2 s = 0.134 s + 0.035 e − 0.03 s (1) G\left( s \right)=\frac{\Delta T}{\Delta U}=\frac{K}{T_1s+1}e^{T_2s}=\frac{0.134}{s+0.035}e^{-0.03s} \tag{1} G(s)=ΔUΔT=T1s+1KeT2s=s+0.0350.134e−0.03s(1)
matlab">tol=0.03; % 纯滞后时间
num_c=[0.134]; % 连续系统分子系数
den_c=[1,0.035]; % 连续系统分母系数
Ts=1; % 采样时间
c=0;c_1=0; % 系统输出c=c(k)、c_1=c(k-1)
u=0;u_1=0;u_2=0; %控制器输出u=u(k)、u_1=u(k-1)、u_2=u(k-2)
3.创建modbus连接对象
matlab">mb = modbus('tcpip','192.168.2.1',502);
mb.Timeout = 20;
4.求离散传递函数
基于采样时间 T s = 1 s T_s=1s Ts=1s,基于Z变换对连续系统进行离散化:
G ( z ) = 0.1278 z − 1 + 0.003884 z − 2 1 − 0.9656 z − 1 = n u m _ d ( 1 ) z − 1 + n u m _ d ( 2 ) z − 2 1 + d e n _ d ( 2 ) z − 2 (2) G\left( z \right)=\frac{0.1278z^{-1}+0.003884z^{-2}}{1-0.9656z^{-1}}=\frac{num\_d\left( 1 \right)z^{-1}+num\_d\left( 2 \right)z^{-2}}{1+den\_d\left( 2 \right)z^{-2}} \tag{2} G(z)=1−0.9656z−10.1278z−1+0.003884z−2=1+den_d(2)z−2num_d(1)z−1+num_d(2)z−2(2)从上式可得离散化的对象输出公式:
c ( k ) = − d e n _ d ( 2 ) c ( k − 1 ) + n u m _ d ( 1 ) u ( k − 1 ) + n u m d ( 2 ) u ( k − 2 ) ; (3) c\left( k \right)=-den\_d\left( 2 \right)c\left( k-1 \right)+num\_d\left( 1 \right)u\left( k-1 \right)+num\ _d\left( 2 \right)u\left( k-2 \right); \tag{3} c(k)=−den_d(2)c(k−1)+num_d(1)u(k−1)+num d(2)u(k−2);(3)
matlab">% continue system
sys_c=tf(num_c,den_c,'inputdelay',tol);
% discrete system
sys_d=c2d(sys_c,Ts,'zoh');
[num_d,den_d]=tfdata(sys_d,'v');
5. 循环更新参数
matlab">while true% 基于离散传递函数计算锅炉的温度c=-den_d(2)*c_1+num_d(1)*u_1+num_d(2)*u_2;% 将对象的输出写入到PLC中write(mb,'holdingregs',1,c,'double');% 将控制器输出读取到u中u = read(mb,'holdingregs',9,1,'int16');u = 100*u/27648;% 更新参数c_1=c;u_2=u_1;u_1=u;pause(Ts);
end
二、S7-200 SMART代码
1.将double类型变量转换为real类型变量
在MATLAB中的小数是通过double类型写入PLC中,而PLC中的double类型变量是存放在V寄存器的一个字节中,将输入的double类型数据转换为可以供PID指令使用的real类型可以使用指令DF_R。
2.建立Modbus TCP服务器
在PLC中建立Modbus TCP服务器,用于和MATLAB中的Modbus TCP客户端进行通信,各个端口的含义如下:
- EN:功能块使能端,EN=1功能块有效,EN=0功能块无效;
- Connect:功能块Server功能,Connect=1激活Server功能,Connect=0关闭Server功能,注意在更改相关参数时需要令Connect=0,否在将会报错;
- IP_Port:网络端口,默认502;
- MaxIQ:可操作输入/输出线圈最大个数,将可用于 Modbus 地址 0xxxx 到 1xxxx 的 I 和 Q 点数设置为 0 至 256。值 0 表示禁用对输入和输出的所有读取和写入。建议将 MaxIQ 值设置为 256;
- MaxAI:可操作输入寄存器最大个数,将可用于 Modbus 地址 3xxxx 的字输入 (AI) 数设置为 0 至 56。值 0 表示禁用对模拟量输入的读取。要允许访问所有 CPU 模拟量输入。对于 CPU CR40 和 CR60为 0,对于所有其它 CPU 型号为 56;
- MaxHold:可操作保持寄存器最大个数,设置可用于 Modbus 地址 4xxxx 或 4yyyyy 的 V 存储器中的字保持寄存器数,需要注意的是一个保持寄存器占用两个V寄存器的字节,即一个VM;
- HoldStart:保持寄存器的开始地址,如果 HoldStart 指向超出允许范围的存储位置,则 Modbus TCP 库指令将返回错误。CPU 还会生成非致命错误:间接寻址错误 (0x06);
- Done:Modbus TCP通信状态,Done=1连接至客户端设备、与客户端断开连接、响应 Modbus 请求、返回错误,Done=0没有请求用于此程序周期
- Error:指令执行结果代码,且仅在发生错误后的一个周期内有效。
3.将real类型的过程变量转换为word类型的过程变量
在PLC中将过程变量的REAL值转换为PID控制器可以识别的WORD,各个端口的含义如下:
- EN:功能块使能端,EN=1功能块有效,EN=0功能块无效;
- Inpuut:输入的REAL类型值;
- ISH:输入REAL类型值的上限;
- ISL:输入REAL类型值的下限;
- OSH:输出WORD类型值的上限;
- OSL:输出WORD类型值的下限;
- Output:输出的WORD类型值。
4.PID控制器
4.1PID回路控制算法
在介绍如何使用向导设置PID控制之前,需要了解S7-200 SMART的PID控制器算法。首先给出时域下的PID控制器输出:
M ( t ) = K C e + K I ∫ e d t + M i n i t i a l + K D d e d t (4) M\left( t \right)=K_Ce+K_I{\int e\, dt}+M_{initial}+K_D\frac{de}{dt} \tag{4} M(t)=KCe+KI∫edt+Minitial+KDdtde(4)其中 M ( t ) 、 e 、 K C 、 K I 、 K D 、 M i n i t i a l M\left( t \right)、e、K_C、K_I、K_D、M_{initial} M(t)、e、KC、KI、KD、Minitial分别表示当前时间下的控制器输出函数、当前时间下的系统误差函数、比例系数、积分系数、微分系数、回路输出的初始值。将上述公式离散化后可得:
M n = K C e n + K I T S ∑ k = 1 n e n + M i n i t i a l + K D e n − e n − 1 T S (5) M_n=K_Ce_n+K_IT_S{\sum_{k=1}^n e_n}+M_{initial}+K_D\frac{e_n-e_{n-1}}{T_S} \tag{5} Mn=KCen+KITSk=1∑nen+Minitial+KDTSen−en−1(5)其中 M n 、 e n 、 e n − 1 、 T S M_n、e_n、e_{n-1}、T_S Mn、en、en−1、TS分别表示当前采样时刻的控制器输出、当前采样时刻的误差、前一个采样时刻的误差、采样时间。引入参数前一个采样时刻的积分值 M X MX MX,上述离散化PID控制器输出可化为:
M n = K C e n + K I T S e n + M X + M i n i t i a l + K D e n − e n − 1 T S (6) M_n=K_Ce_n+K_IT_Se_n+MX+M_{initial}+K_D\frac{e_n-e_{n-1}}{T_S} \tag{6} Mn=KCen+KITSen+MX+Minitial+KDTSen−en−1(6)考虑
e n = P V n − S V n (7) e_n=PV_n-SV_n \tag{7} en=PVn−SVn(7)其中 P V n 、 S V n PV_n、SV_n PVn、SVn分别表示过程变量与设定变量。将公式(4)代入公式(3)可得:
M n = M P n + M I n + M D n = K C ( S P n − P V n ) + K I T S ( S P n − P V n ) + M X + K D [ ( S P n − P V n ) − ( S P n − 1 − P V n − 1 ) ] T S = K C ( S P n − P V n ) + K I T S ( S P n − P V n ) + M X + K D ( P V n − 1 − P V n ) T S = K C ( S P n − P V n ) + K C T I T S ( S P n − P V n ) + M X + K C T D ( P V n − 1 − P V n ) T S (8) \begin{align} M_n &=MP_n+MI_n+MD_n \\ &={K_C\left( SP_n-PV_n \right)} +{K_IT_S\left( SP_n-PV_n \right)+MX} +{K_D\frac{\left[ \left( SP_n-PV_n \right)-\left( SP_{n-1}-PV_{n-1} \right) \right]}{T_S}} \\ &={K_C\left( SP_n-PV_n \right)}+{K_IT_S\left( SP_n-PV_n \right)+MX} +{K_D\frac{\left( PV_{n-1}-PV_n \right)}{T_S}} \\ &={K_C\left( SP_n-PV_n \right)}+{\frac{K_C}{T_I}T_S\left( SP_n-PV_n \right)+MX} +{K_CT_D\frac{\left( PV_{n-1}-PV_n \right)}{T_S}} \end{align} \tag{8} Mn=MPn+MIn+MDn=KC(SPn−PVn)+KITS(SPn−PVn)+MX+KDTS[(SPn−PVn)−(SPn−1−PVn−1)]=KC(SPn−PVn)+KITS(SPn−PVn)+MX+KDTS(PVn−1−PVn)=KC(SPn−PVn)+TIKCTS(SPn−PVn)+MX+KCTDTS(PVn−1−PVn)(8)其中 M P n 、 M I n 、 M D n MP_n、MI_n、MD_n MPn、MIn、MDn分别表示当前采样时刻控制器比例项输出、积分项输出、微分项输出。
4.2PID向导
在PLC中可以通过向导实现PID控制器的各种参数设置:
①点击工具栏的PID向导:
②回路选择
③回路命名
④控制参数设置
控制器类型可以选择温度或常规:
这里由于是对MATLAB中的被控对象进行仿真,控制器类型选择常规。
如果勾选了双向输出,正向参数中的增益只能为正,负向参数中的增益只能为负。在双向输出的情况下允许 S V n < P V n SV_n<PV_n SVn<PVn的情况出现,此时负向输出有效,在 S V n ≥ P V n SV_n \ge PV_n SVn≥PVn时正向输出有效。如果不勾选双向输出则没有负向参数设置、只有正向参数设置,如果增益大于零则属于正向控制——控制器正作用于回路,此时只有 S V n ≥ P V n SV_n \ge PV_n SVn≥PVn输出有效;如果增益小于零则属于负向控制——控制器反作用于回路,此时只有 S V n ≤ P V n SV_n \le PV_n SVn≤PVn输出有效。不勾选双向输出的情况下,对于增益值为 0.0 的 I 或 ID 控制,如果将积分时间和微分时间指定为正值,则控制器将是正作用回路;如果指定负值,则控制器将是反作用回路。
在MATLAB中通过比例度整定法确认增益 K C = 7.21 K_C=7.21 KC=7.21、积分时间 T I = 11 s T_I=11s TI=11s故在向导中分别将增益、积分时间设置为 7.21 、 1.7 60 ≈ 0.028 7.21、\frac{1.7}{60}\approx0.028 7.21、601.7≈0.028分钟。需要注意的是如果不需要积分作用,则可设置积分时间= 10000.0 m i n 10000.0min 10000.0min;如果不需要微分作用,则可设置微分时间= 0.0 m i n 0.0min 0.0min;如果不需要比例作用,则设置增益= 0.0 0.0 0.0,此时积分环节与微分环节的计算是基于 K C = 1.0 K_C=1.0 KC=1.0进行的:
M I n = K C T I T S ( S P n − P V n ) + M X = 1 T I T S ( S P n − P V n ) + M X M D n = K C T D ( P V n − 1 − P V n ) T S = T D ( P V n − 1 − P V n ) T S (9) \begin{align} MI_n &=\frac{K_C}{T_I}T_S\left( SP_n-PV_n \right)+MX \\ &=\frac{1}{T_I}T_S\left( SP_n-PV_n \right)+MX \\ MD_n &=K_CT_D\frac{\left( PV_{n-1}-PV_n \right)}{T_S} \\ &=T_D\frac{\left( PV_{n-1}-PV_n \right)}{T_S} \end{align} \tag{9} MInMDn=TIKCTS(SPn−PVn)+MX=TI1TS(SPn−PVn)+MX=KCTDTS(PVn−1−PVn)=TDTS(PVn−1−PVn)(9)
为了获得更好的PID控制效果,往往会选择不激活PID,在程序运行后通过PID整定控制面板进行控制激活。
⑤输入参数设置
过程变量的标定有单极、单极20%偏移量、双极、温度×10℃和温度×10℉:
- 单极: 0 ∼ 10 0\sim10 0∼10V、 0 ∼ 20 0\sim20 0∼20mA、 0 ∼ 5 0\sim5 0∼5V;
- 单极20%偏移量: 1 ∼ 5 1\sim5 1∼5V、 4 ∼ 20 4\sim20 4∼20mA;
- 双极: − 10 ∼ 10 -10\sim10 −10∼10V、 − 5 ∼ 5 -5\sim5 −5∼5V
- 温度×10℃/℉:特定的温度模块
这里使用的选择双极。
⑥输出参数设置
在输出类型中可选择模拟量或数字量。模拟量可从模拟量模块输出、数字量是通过PWM控制其他传感器。
⑦控制区域参数设置
在控制区域中无任何设置。
⑧报警
报警包括过程变量上限报警、过程变量下限报警、模拟量模块报警。
⑨代码
需要注意的是子例程与中断例程内容是被封存的,添加手动PID控制可以控制PID控制器屏蔽过程变量与设置变量,输出任意合法值。
⑩为PID控制相关参数分配地址
分配地址后相关参数将会存储到对应的位置,在数据块中可见:
从数据块中的分布可见,参数保存到了VB8000~VB8239的地址中。
⑪组件
在组件页面中主要是确认准备初始化的各种内容信息。
⑫最后在完成页面点击生成
4.3PID0_CTRL
在PLC中实现PID控制,各个端口的含义如下:
- EN:功能块使能端,EN=1功能块有效,EN=0功能块无效;
- PV_I:输入过程变量
- Setpont_R:输入设定变量
- Auto_Manual:自动模式/手动模式切换,Auto_Manual=1自动模式,Auto_Manual=0手动模式;
- Manual_Output:手动模式下的输出 0.0 ∼ 1.0 0.0\sim1.0 0.0∼1.0;
- Output_Forward:正向回路输出,输出的范围与向导中的选择有关,单极 0 ∼ 27648 0\sim27648 0∼27648,双极 − 27648 ∼ 27648 -27648\sim27648 −27648∼27648;
- Output_Reverse:反向回路输出,输出的范围与向导中的选择有关,单极 0 ∼ 27648 0\sim27648 0∼27648,双极 − 27648 ∼ 27648 -27648\sim27648 −27648∼27648;
- HighAlarm:PV值高限位报警,PV值高限位值可在向导中确定;
- LowAlarm:PV值低限位报警,PV值低限位值可在向导中确定;
- ModuleErr:PID控制器错误信号,ModuleErr=1PID控制器错误,ModuleErr=0PID控制器无错误;
- ErrorCode:错误代码。
5.控制器输出处理
基于输入的过程变量实数值 r P V rPV rPV与设定变量实数值 r S V rSV rSV,即实际的温度与设定温度之间的关系,确定控制器输出:
- r S V ≥ r P V rSV \ge rPV rSV≥rPV:PID控制输出为正向输出,此时令 w M = w M 1 wM=wM1 wM=wM1,即实际控制器输出=正向控制器输出;
- r S V < r P V rSV < rPV rSV<rPV:PID控制输出为正向输出,此时令 w M = − w M 2 wM=-wM2 wM=−wM2,即实际控制器输出=-反向控制器输出。
三、仿真实验
1.手动模式下的输出
将Auto_Manual的输入端置0,开启手动模式:
在单极输出的情况下:
激活PID控制:
对于单极输出的情况下Manual_Output=0.5:
对于单极输出的情况下Manual_Output=1.0:
对于单极输出的情况下Manual_Output=-0.5:
对于单极输出的情况下Manual_Output=-1.0:
在双极输出的情况下:
对于双极输出的情况下Manual_Output=0.5:
对于双极输出的情况下Manual_Output=1.0:
对于双极输出的情况下Manual_Output=-0.5:
对于双极输出的情况下Manual_Output=-1.0:
2.自动模式下的输出
启动MATLAB程序:
通过PID整定控制面板激活PID控制:
写入设定值SV=40.0:
PID控制结果:
写入设定值SV=-30.0:
PID控制结果:
总结
本文基于MATLAB与S7-200 SMART实现了PID控制的仿真。