5.4 惯性环节
惯性环节又称为非周期环节,是由一阶微分方程描述。其s域传递函数为Y(s)=K·X(s)/(T1·s+1)
,差分方程为y(k)=(T1-ΔT)/T1·y(k)+K·ΔT/T1·X(k-1)
(K为比例系数,ΔT为采样周期,T1为时间常数)。
实验步骤
1、编写低代码控制器配置文件
实现本应用案例,低代码控制器需要完成两部分文件配置:测点配置和AOE配置。测点配置用于配置控制器输入和输出信号点的参数,而AOE配置是建立AOE模型网络来实现所需的控制逻辑和功能。
1.1、测点配置
测点配置表格的内容包含了测点的点号、名称、别名、是否离散、是否是计算点以及默认值等。点号是程序里给这个测点的编号,可以自己定义,使用时,测点与通信通道的点号一一对应完成对接。别名是英文字母与下划线组合使用,可以当做变量名用于AOE表格里表达式的书写,使之可以不用点号来表达,使得表达式的意思表达得更加清楚。本案例测点配置如下:
序号 | 点号 | 名称 | 别名 | 是否离散 | 是否计算点 | 默认值 | 备注 |
---|---|---|---|---|---|---|---|
1 | 100001 | 测点1 | time | FALSE | FALSE | 0 | 时间值 |
2 | 100002 | 测点2 | T | FALSE | FALSE | 1 | 时间常数 |
3 | 100003 | 测点3 | value | FALSE | FALSE | 0 | 输入值 |
4 | 100004 | 测点4 | K | FALSE | FALSE | 1 | 比例系数 |
5 | 100005 | 测点5 | out | FALSE | FALSE | 0 | 输出值 |
1.2、AOE配置
本案例中AOE文件配置内容分为三个部分。
AOE网络声明
名称为惯性环节,触发条件设置为事件驱动(Event_Drive)。
AOE ID | 是否启用 | 名称 | 触发条件 | 触发条件参数 | 变量初始值 |
---|---|---|---|---|---|
70001 | TRUE | 惯性环节 | Event_Drive | time_old:0; value_old:0; out_old:0; |
AOE节点声明
AOE ID | 节点ID | 名称 | 节点类型 | 超时时间(ms) | 表达式 |
---|---|---|---|---|---|
70001 | 1 | 开始节点 | Condition | 10000 | time>time_old |
70001 | 2 | 结束节点 | Condition | 10000 | 1 |
本案例中共有2个节点,节点类型均为Condition,表达式为真时,动作触发执行。
AOE边声明
AOE ID | 首尾节点 | 动作名称 | 失败模式 | 动作类型 | 动作参数 |
---|---|---|---|---|---|
70001 | 1;2 | 计算 | Default | Set_Points | out:out_old*(T-(time-time_old))(1/T)+(1/T)(time-time_old)Kvalue_old; out_old:out_old*(T-(time-time_old))(1/T)+(1/T)(time-time_old)Kvalue_old; value_old:value; time_old:time; |
本案例中的边声明动作类型为为SetPoints。 式中,out表示当前时刻输出量的采样值;out_old表示上一时刻输出量的采样值;T表示时间常数;K表示比例系数;time表示当前时刻;time_old表示上一时刻;value表示当前时刻函数值的采样值;value_old表示上一时刻函数值的采样值。out、T、value、K、time为设置的测点。
2、Simulink验证
为验证低代码控制器惯性环节结果的正确性,本案例借助Simulink的惯性环节运行结果来对照。为实现控制器与simulink仿真模型间通信,需要进行低代码控制器通道文件的配置以及Simulink的S函数程序编写,具体过程如下:
2.1、通信通道配置
低代码控制器通过Modbus协议与Simulink进行通信。由于Matlab仅有Modbus客户端功能,因此需要将低代码控制器配置为Modbus服务端,如下:
通道名称 | server测试通道 | 连接名称 | 测试通道 |
---|---|---|---|
连接个数 | 1 | 测点个数 | 5 |
服务端口 | 502 | 客户端IP | 127.0.0.1 |
客户端端口 | 9999 | ||
slave id | 1 | ||
通信协议 | XA | ||
一次读寄存器数上限 | 125 | ||
一次读开关数上限 | 2000 | ||
一次写寄存器数上限 | 120 | ||
一次写开关数上限 | 1968 | ||
轮询周期(ms) | 5000 | ||
超时(ms) | 1000 |
服务端口设定为502,测点个数为5,客户端ip是本机的ip地址,可以在网络属性界面查询得到,客户端端口设置为9999.
序号 | 寄存器类型 | 起始地址 | 数据类型 | 新请求标志 | 轮询周期 | 点号 |
---|---|---|---|---|---|---|
1 | HOLDING | 1 | EightByteFloat | FALSE | 2000 | 100001 |
2 | HOLDING | 5 | EightByteFloat | FALSE | 2000 | 100002 |
3 | HOLDING | 9 | EightByteFloat | FALSE | 2000 | 100003 |
4 | HOLDING | 13 | EightByteFloat | FALSE | 2000 | 100004 |
5 | HOLDING | 17 | EightByteFloat | FALSE | 2000 | 100005 |
本实验中需要用5个寄存器存储数据,数据类型均为八位浮点数。
2.2、编写Simulink与控制器通信程序
modbusComproportion.m是本案例模型控制器的源文件,建立与低代码控制器起通信的作用。
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 4;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
上述程序表示输入与输出个数的设置,本案例中的输入个数为4,分别为T、value、K、time。输出个数为1,为惯性计算后的输出值。
ts = [0.02,0];
上述程序表示模块的采样时间为0.02s。
global m;
m = modbus('tcpip', '127.0.0.1', 502); % 建立modbus通信
上述程序表示初始化过程中建立与控制器的通信。
function sys=mdlOutputs(t,x,u)
global m;
write(m,'holdingregs',2,u(1)','double');
write(m,'holdingregs',6,u(2)','double');
write(m,'holdingregs',10,u(3)','double');
write(m,'holdingregs',14,u(4)','double');
pause(0.01); % 等待10ms(实际时间),使得通过modbus通信之后读到最新控制值
sys = read(m,'holdingregs',18,1,'double');
如上面的输出函数所示,需要将输入写入控制器,再从控制器中读取控制信号。程序中的pause(0.001)用于设置等待时间,当控制器和计算机的性能较好时,可以适当修改这个参数,可以加快仿真通信的速度,使动画跟随的动作加快。
2.3、低代码控制器配置与运行
这一步低代码控制器的连接和案例1中完全一致,将MATLAB的文件夹打开到低代码控制器替代后的simulink模型文件的文件夹。
当与实体的控制器连接时,就是将所实现的功能放入实体的控制器中,只需要将控制器与电脑通过网线连接后,修改主站和从站的ip地址。 控制器(从站ip)可以从发现工具获得。
主站ip为本机ip地址,通过网络属性配置中可以查询。
3、运行仿真
先运行低代码控制器,再运行Simulink模型,进行仿真。使用AOE组态技术配置的惯性环节在输入为单位阶跃响应时输出如下图所示,此时时间常数T=1,比例系数K=1: