5.3

微分环节

微分是对函数局部变化的一种线性描述,对于微分环节的实现,可以近似描述为后一时刻的函数值与前一时刻的函数值之差与时间间隔的商。其s域传递函数Y(s)=s·X(s)差分方程y(k)=(x(k)-x(k-1))/ΔT(ΔT为采样周期)。

实验步骤

1、编写低代码控制器配置文件

实现本应用案例,低代码控制器需要完成两部分文件配置:测点配置和AOE配置。测点配置用于配置控制器输入和输出信号点的参数,而AOE配置是建立AOE模型网络来实现所需的控制逻辑和功能。

1.1、测点配置

测点配置表格的内容包含了测点的点号、名称、别名、是否离散、是否是计算点以及默认值等。点号是程序里给这个测点的编号,可以自己定义,使用时,测点与通信通道的点号一一对应完成对接。别名是英文字母与下划线组合使用,可以当做变量名用于AOE表格里表达式的书写,使之可以不用点号来表达,使得表达式的意思表达得更加清楚。本案例测点配置如下:

序号点号名称别名是否离散是否计算点默认值备注
1100001测点1valueFALSEFALSE0当前值
2100002测点2timeFALSEFALSE0当前时间
3100003测点3differentialFALSEFALSE0输出值

1.2、AOE配置

本案例中AOE文件配置内容分为三个部分。

AOE网络声明

名称为微分环节,触发条件设置为事件驱动(Event_Drive)。

AOE ID是否启用名称触发条件触发条件参数变量初始值
70001TRUE微分环节Event_Drivetime_old:0;
value_old:0;
flag:0;
AOE节点声明
AOE ID节点ID名称节点类型超时时间(ms)表达式
700011开始节点Condition30time>time_old
700012结束节点Condition101

本案例中共有2个节点,节点类型均为Condition,表达式为真时,动作触发执行。

AOE边声明
AOE ID首尾节点动作名称失败模式动作类型动作参数
700011;2计算DefaultSet_Pointsdifferential:(flag==1)*(value-value_old)/(time-time_old);
flag:1;
time_old:time;
value_old:value;

本案例中的边声明动作类型为为SetPoints。 式中,out表示微分结果;time表示当前时刻;time_old表示上一时刻;value表示当前时刻函数值的采样值;value_old表示上一时刻函数值的采样值。out、value、time为设置的测点。

2、Simulink验证

为验证低代码控制器微分环节结果的正确性,本案例借助Simulink的微分环节运行结果来对照。为实现控制器与simulink仿真模型间通信,需要进行低代码控制器通道文件的配置以及Simulink的S函数程序编写,具体过程如下:

2.1、通信通道配置

低代码控制器通过Modbus协议与Simulink进行通信。由于Matlab仅有Modbus客户端功能,因此需要将低代码控制器配置为Modbus服务端,如下:

通道名称server测试通道连接名称测试通道
连接个数1测点个数3
服务端口502客户端IP127.0.0.1
客户端端口9999
slave id1
通信协议XA
一次读寄存器数上限125
一次读开关数上限2000
一次写寄存器数上限120
一次写开关数上限1968
轮询周期(ms)5000
超时(ms)1000

服务端口设定为502,测点个数为3,客户端ip是本机的ip地址,可以在网络属性界面查询得到,客户端端口设置为9999.

序号寄存器类型起始地址数据类型新请求标志轮询周期点号
1HOLDING1EightByteFloatFALSE2000100001
2HOLDING5EightByteFloatFALSE2000100002
3HOLDING9EightByteFloatFALSE2000100003

本实验中需要用3个寄存器存储数据,数据类型均为八位浮点数。

2.2、编写Simulink与控制器通信程序

modbusComproportion.m是本案例模型控制器的源文件,建立与低代码控制器起通信的作用。

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;

上述程序表示输入与输出个数的设置,本案例中的输入个数为2,分别为输入值与仿真时间。输出个数为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:2)','double');

%pause(0.001);    % 等待50ms(实际时间),使得通过modbus通信之后读到最新控制值
sys = read(m,'holdingregs',10,1,'double');

如上面的输出函数所示,需要将输入写入控制器,再从控制器中读取控制信号。程序中的pause(0.001)用于设置等待时间,当控制器和计算机的性能较好时,可以适当修改这个参数,可以加快仿真通信的速度,使动画跟随的动作加快。

2.3、低代码控制器配置与运行

这一步低代码控制器的连接和案例1中完全一致,将MATLAB的文件夹打开到低代码控制器替代后的simulink模型文件的文件夹。

当与实体的控制器连接时,就是将所实现的功能放入实体的控制器中,只需要将控制器与电脑通过网线连接后,修改主站和从站的ip地址。 控制器(从站ip)可以从发现工具获得。

主站ip为本机ip地址,通过网络属性配置中可以查询。

3、运行仿真

先运行低代码控制器,再运行Simulink模型,进行仿真。在满足判断标志位为1的条件时避免分母为0微分结果跳变的情况下,当间隔时间足够小时,使用AOE组态技术配置的微分环节输入与输出对比如下图所示:

基本控制组态微分环节运行结果

附件:基本控制组态_微分环节.rar