5.6 振荡环节

振荡环节的输出量和输入量的关系为二阶微分方程。其s域传递函数为Y(s)=X(s)/ (T12s2+2ξT1s+1),差分方程为**`y(k)=(2-2ξΔT/T1)·y(k-1)+(2ξΔT/T1-1-(ΔT/T12)·y(k-2)+(ΔT/T12·x(k-2)

实验步骤

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

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

1.1、测点配置

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

序号点号名称别名是否离散是否计算点默认值备注
1100001测点1timeFALSEFALSE0时间值
2100002测点2TFALSEFALSE1时间常数
3100003测点3valueFALSEFALSE0输入值
4100004测点4zetaFALSEFALSE1阻尼比
5100005测点5outFALSEFALSE0输出值

1.2、AOE配置

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

AOE网络声明

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

AOE ID是否启用名称触发条件触发条件参数变量初始值
70001TRUE振荡环节Event_Drivetime_old:0;
value_old1:0;
value_old2:0;
out_old1:0;
out_old2:0;
AOE节点声明
AOE ID节点ID名称节点类型超时时间(ms)表达式
700011开始节点Condition10000time>time_old
700012结束节点Condition100001

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

AOE边声明
AOE ID首尾节点动作名称失败模式动作类型动作参数
700011;2计算DefaultSet_Pointsout:(2-(1/T)2zeta*(time-time_old))out_old1+(2(1/T)zeta(time-time_old)-1-(1/T)(1/T)(time-time_old)(time-time_old))out_old2+(1/T)(1/T)value_old2(time-time_old)(time-time_old);
out_old1:(2-(1/T)2zeta*(time-time_old))out_old1+(2(1/T)zeta(time-time_old)-1-(1/T)(1/T)(time-time_old)(time-time_old))out_old2+(1/T)(1/T)value_old2(time-time_old)(time-time_old);
value_old1:value;
value_old2:value_old1;
out_old2:out_old1;
time_old:time;

本案例中的边声明动作类型为为SetPoints。 式中,out表示当前时刻输出量的采样值;out_old1表示上一时刻输出量的采样值;out_old2表示上两时刻输出量的采样值;T表示时间常数;zeta表示阻尼比;time表示当前时刻;time_old表示上一时刻;value表示当前时刻函数值的采样值;value_old1表示上一时刻函数值的采样值;value_old1表示上两时刻函数值的采样值;zeta表示阻尼比。out、time、T、value、zeta为设置的测点。

2、Simulink验证

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

2.1、通信通道配置

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

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

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

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

本实验中需要用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,分别为输入值、仿真时间、阻尼比与时间常数。输出个数为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');
%disp(['address 2 = ' num2str(u(1:3)')]);
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模型,进行仿真。当输入为单位阶跃信号,时间常数T=1,阻尼比ξ=0.5时,仿真结果如下图所示:

基本控制组态振荡环节运行结果

附件:基本控制组态_振荡环节.rar