6.1 房屋温度控制
1、实验环境
该程序可在以下环境运行:
1.Matlab R2019a + Simulink v9.3及以上版本;
2.Matlab APP:Instrument Control Toolbox;
3.低代码控制器。
2、原始模型介绍
本实验原始模型来自于matlab R2021a中官方自带的simulink仿真案例中的 sldemo_househeat 模型。
可以通过在matlab命令行窗口中输入下面的命令打开此案例的模型:
openExample('simulink_general/sldemo_househeatExample');
该仿真案例包含模型初始化脚本sldemo_househeat_data.m文件,提供需要的房屋信息:
- 包括定义房屋几何信息(大小、窗户数量)
- 指定房屋材料的热属性
- 计算房屋的热阻
- 提供加热器特性(热空气温度、流速)
- 定义电力成本(0.09 美元/千瓦时)
- 指定初始室内温度 (20 ºC = 68 ºF)
房屋的热模型主要功能是模拟房屋内的加热和热损耗(House)来表现温度的变化,再由控制模块(Thermostat)控制温度在设定温度下内基本保持小范围的波动,并计算加热成本(cost)。
- 室温变化模型(House),是计算室温变化的子系统,会考虑来自加热器的热流和在环境中的热损失,室温变化模型方程为:
\[ \left(\frac{\text{d} Q}{\text{d} x}\right)_ {losses} = \frac{ T_{room} - T_{out} }{ R_{eq} } \]
\[ \frac{\text{d}T_{room}}{\text{d}t} = \frac{1}{M_{air}\cdot c}\left( \frac{\text{d}Q_{heater}}{\text{d}t}-\frac{\text{d}Q_{losses}}{\text{d}t} \right) \]
其中\(M_{air}\)表示屋内空气质量,\(R_{eq}\)表示房屋的等效热阻。
-
加热器模型(Heater),对恒定空气流速 Mdot 进行建模。
其值在sldemo_househeat_data.m 文件中指定。调温器信号用于打开或关闭加热器。当加热器打开时,它以恒定的 \(Mdot\) 流速(默认 1 千克/秒 = 3600 千克/小时)吹出温度 \( T_{heater} \)(默认为 50 ºC = 122 ºF)的热空气。
\[ \frac{\text{d}Q}{\text{d}t}=\left( T_{heater} - T_{room} \right)\cdot Mdot\cdot c \]
其中 \( \frac{\text{d}Q}{\text{d}t} \)表示从加热器流入房间的热流,\(c\)表示常压下的热容,\(Mdot\)表示空气流速,\( T_{heater} \) 和 \( T_{room} \)分别表示从加热器中输出的热空气温度和房间内空气的温度。
-
调温器(Thermostat),允许温度在理想室温上下 5 ºF 范围内波动。如果气温降到 65 ºF 以下,调温器会打开加热器。
-
环境建模模块,使用具有无限热容量和时变温度 Tout 的散热器。常量模块 Avg Outdoor Temp 指定室外平均气温。Daily Temp Variation Sine Wave 模块产生室外温度的日温波动。修改参数可以比较这些参数对于供暖成本的影响。
3、整体流程分析
模型主要检测内容是室内的温度,需要将室内温度与控制温度进行比较,将温度是否超出限定值范围的信息反馈给调温器。
调温器对加热器施加开启或者关闭的信号,若信号为开启信号,加热器启动,稳定输出固定流速的热空气,并对此动作产生的能量消耗进行价格的计算,在PlotResults中显示成本的曲线图,并将室外温度以及室内温度一起显示在结果之中,方便比较室内外温度变化对成本的影响。
此模型只用于计算供暖成本,如果室外温度高于室内温度,室内温度将超过所需的Set Point值。
如果需要计算制冷成本,可以修改此模型,使其包含空调(即修改加热器的参数指标)。
进行此修改,要在 sldemo_househeat_data.m 中添加如下参数:冷空气输出、空调气流的温度以及空调效率。由于需要同时控制空调和加热器,因此还需要修改调温器。
4、低代码控制器
本控制器是基于AOE引擎的低代码控制器。控制器的特点在于不需要对控制器进行代码的编写,只要在excel文件之中进行测点配置、通信通道和AOE配置就可以实现相应的控制。
5、matlab仿真测试
5.1、原始案例
使用原始代码进行仿真可以得到如下图所示仿真图像。
图中可以看出制热成本,室内外温度变化曲线。
5.2、低代码控制器替代原始调温器
图中的modbusCom1指代的是由控制器控制模拟得到的调温器。
5.3、文件配置
文件配置分为三个部分:测点配置、通信通道和AOE配置。
测点配置用于配置控制器输入和输出信号点的参数,本案例中需要的信号要是输入所需要的房间设定温度、测量温度和输出的加热器启停控制信号。
通信通道的配置是为了将控制器与simulink仿真模型建立modbus通信,实现仿真模型与控制器的信息交互。
而AOE配置是建立AOE模型网络来实现所需的控制逻辑和功能。
接下来分别介绍相关的三个方面的配置。
5.3.1、测点配置
测点配置表格的内容包含了测点的点号、名称(测点1/2/3)、别名、是否离散、是否是计算点以及默认值等。
点号是程序里给这个测点的编号,可以自己定义,使用时,测点与通信通道的点号一一对应完成对接。
别名是英文字母与下划线组合使用,可以当做变量名用于AOE表格里表达式的书写,不用点号来表达,使得表达式的意思表达得更加清楚。
本例中的测点配置如下表所示:
序号 | 点号 | 名称 | 别名 | 是否离散 | 是否计算点 | 默认值 | 备注 |
---|---|---|---|---|---|---|---|
1 | 100001 | 测点1 | Tset_POINT | FALSE | FALSE | 20 | 设定温度值 |
2 | 100002 | 测点2 | T_POINT | FALSE | FALSE | 20 | 测量温度值 |
3 | 100003 | 测点3 | State_POINT | TRUE | FALSE | 0 | 控制器下发的遥控 |
本程序需要三个测点,分别问设定温度值、测量温度值以及控制器输出控制加热器启停。其中的别名对应的就是AOE文件之中设置节点事件的表达式的参量。表示在matlab的simulink模型中是如图所示的几个参数。
5.3.2、通信通道配置
表格中包含有通信通道的各种配置信息。
通道名称 | server测试通道 |
---|---|
连接个数 | 2 |
服务端口 | 502 |
服务端口可以自行设置。
建立通信时,modbus通信的时候两边有一个是主站,有一个是从站,主站可以轮询、发控制指令,从站响应主站。
客户端IP | 127.0.0.1 |
---|---|
客户端端口 | 9999 |
通道配置文件里的客户端就是指主站,主站在同一台机器就用本机地址127.0.0.1,客户端端口要设成9999。此文件之中,将控制器配置成从站,matlab配置成主站。
服务端IP | 127.0.0.1 |
---|---|
服务端端口 | 502 |
slave id | 1 |
通信协议 | XA |
当需要把控制器配置成主站时,将客户端ip改成服务端ip。
本案例中需要的通道配置如下:
通道名称 | server服务端 |
---|---|
连接个数 | 1 |
服务端口 | 502 |
连接个数设定为1,服务器端口自定义为502;
连接名称 | 测试通道1 |
---|---|
测点个数 | 3 |
客户端IP | 127.0.0.1 |
客户端端口 | 9999 |
客户端ip就是主站ip,端口需修改为9999,在实体控制器配置时需要改为与网络属性相关的ip,在网络属性中查询。
序号 | 寄存器类型 | 起始地址 | 数据类型 | 新请求标志 | 轮询周期 | 点号 |
---|---|---|---|---|---|---|
1 | HOLDING | 1 | EightByteFloat | FALSE | 2000 | 100001 |
2 | HOLDING | 5 | EightByteFloat | FALSE | 2000 | 100002 |
3 | HOLDING | 9 | TwoByteIntUnsigned | FALSE | 2000 | 100003 |
利用3个测点设定的点号,将3个测点与寄存器的起始地址点号对应,两个温度值的数据类型为八位的浮点数,输出的数据类型规定为无符号整数。
其他参数本案例中不需要配置,在此不多赘述。
5.3.3、AOE配置
将AOE表格拆开之后可以分为四个部分。
- AOE网络声明
AOE网络声明部分,定义了表格之中的AOE网络个数和整体信息以及一些变量的初始值。
触发条件分为三类:SimpleRepeat(定时触发,需要自行设定定时时间)、TimeDriven(时间驱动)、EventDriven(事件驱动)。
变量的定义方式为:
<变量名1>:<表达式1>;<变量名2>:<表达式2>;…
本例中的AOE网络声明:
AOE ID | 是否启用 | 名称 | 触发条件 | 触发条件参数 | 变量初始值 |
---|---|---|---|---|---|
70001 | TRUE | 房屋温度控制 | Event_Drive | upDev:2.77778;downDev:2.77778 |
本程序的控制器的作用是实现房屋内温度的控制,所以名称定为房屋温度控制,触发条件是事件控制(即当温度超出阈值的事件发生时,控制器进行相应动作)。
变量upDev和downDev分别代表了向上和向下超出的设定温度的最大值(实测温度与设定温度最大差值的绝对值)为2.77778摄氏度(5华氏度)。
- 变量声明
变量声明需要规定变量生效的AOE网络,通过表达式定义,可以使用预先载入的测点表内的测点名,当测点名对应的测点数据在动作中被更新时,变量的信息也会被更新。
本案例中没有需要的变量声明,在此不多赘述。
- AOE节点声明
节点类型分为两类:Switch、Condition.
Switch节点为二分支逻辑判断,触发逻辑为:表达式为真时,该节点序号为1的边进行动作;表达式为假时,序号为2的边进行动作。当Switch节点为AOE网入度为0的节点(首节点)时,Switch节点直接触发,若超时时间内表达式为真,则执行动作1,为假或者发生超时事件执行动作2。
Condition节点的表达式为事件触发条件,超时时间内表达式为真,则节点事件发生,该节点出发的所有动作并行执行。
本例中的节点声明:
AOE ID | 节点ID | 名称 | 节点类型 | 超时时间(ms) | 表达式 |
---|---|---|---|---|---|
70001 | 1 | 温度超出阈值事件 | Condition | 10 | Tset_Point-T_Point>downDev||T_POINT-Tset_POINT>upDev |
70001 | 2 | 温度超过下阈值事件 | Condition | 10 | Tset_Point-T_Point>downDev |
70001 | 3 | 温度超过上阈值事件 | Condition | 10 | T_Point-Tset_Point>upDev |
70001 | 4 | 结束节点 | Condition | 0 | 1 |
本案例中需要定义的节点有四个,都是事件触发条件,分别是温度超出阈值事件、温度超过下阈值事件、温度超过上阈值事件以及结束节点。
其中,前三个事件规定了超时时间,需要在超时时间内表达式为真才能触发,根据表达式进行运算和比较来控制是否触发事件,式子中用到的数据可以用测点配置里对应的别名来表示。
- AOE边声明
边需要声明首尾节点,格式为:
<尾节点ID>;<首节点ID>
边的方向为:尾节点→首节点。
边的动作类型有:None、SetPoints、Solve、MILP、SimpleMilp、NLP;
-
SetPoints除了对测点设值之外,还可以进行变量定义和计算,动作参数分为数字量和模拟量。
-
Solve求解方程\(Ax=b\)。
-
Milp为稀疏混合整数线性规划问题求解,
-
Nlp为非线性规划问题求解。
-
Milp的写法包括:
-
目标函数:min(<表达式>); 或者 max(<表达式>);
-
约束条件:<Bool表达式1>;<Bool表达式2>;…
-
变量声明:<变量名1>:<变量类型1>, <变量名2>:<变量类型2>,… (其中变量类型为:二进制(0/1)、整型和浮点数)
-
本案例中的AOE边声明如下图所示:
AOE ID | 首尾节点 | 动作名称 | 失败模式 | 动作类型 | 动作参数 | |
---|---|---|---|---|---|---|
70001 | 1;2 | 进入判断温度是否超过下阈值的节点 | Default | NONE | ||
70001 | 1;3 | 进入判断温度是否超过上阈值的节点 | Default | NONE | ||
70001 | 2;4 | 打开加热器 | Default | Set_Points | State_POINT:1; | |
70001 | 3;4 | 关闭加热器 | Default | Set_Points | State_POINT:0; |
本例一共用到了四条边声明,从节点1到节点2和节点3的两条边不需要判断,只需要执行进入下一个节点的动作,动作类型为None,不需要进行计算。
从节点2和节点3到节点4需要作出开加热器和关加热器的动作,动作类型为SetPoints,输出为1时,打开加热器,输出为0时,关闭加热器。
包含有节点以及边的流程如图所示:
5.4、建立控制器与matlab通讯以及仿真过程
- 连接低代码控制器
将matlab的路径切换到低代码控制器替代后的simulink模型文件的文件夹。
当与实体的控制器时,就是将所实现的功能通过实体的控制器实现,只需要将控制器与电脑接入同一局域网后后,修改主站和从站的ip地址,控制器(从站ip)可以从查找窗口获得。主站ip为本机ip地址,通过网络属性配置中可以查询。
- 配置低代码控制器的文件
打开一个浏览器,并输入控制器地址,然后输入账号和密码以进入控制器主界面。
进入主界面后,在左侧导航栏的设置项板块中分别点击测点
、通道
和AOE
按钮,进入相应界面后上传配置文件。
以测点配置文件上传为例,若界面已存在数据可以先清空数据,然后单击右上角的文件上传图标(具体见下图所示),选中需要上传的文件,确定即可完成上传。上传成功后界面将出现相应内容,可对其进行查看与编辑。
所有文件上传完成后,单击主页
或概览
返回概览界面,点击重置
按钮保存配置即可运行。操作界面如下图所示:
- matlab界面操作
配置完成后,进入matlab的界面。然后打开控制器的源文件modbusCom1.m文件,该文件是以S-Function模块模板为基础实现的利用Modbus通信协议与控制器进行通信的模块。
下面这个程序段是将控制信息的数据通过函数对控制器进行读写,S-Function模块中输出函数为mdlOutputs。
function sys=mdlOutputs(t,x,u)
global m;
write(m,'holdingregs',2,u','double'); % 将温度设定值和测量值写入控制器
pause(0.01); % 等待10ms(实际时间),使得通过modbus通信之后读到最新控制值
sys = read(m,'holdingregs',10,1,'uint16'); % 读取控制信号
同时需要设置输入和输出信号的个数,其中输入信号有两个(即设定温度和测量温度),输出信号有一个(控制器发出的指令信号)。
以下这个初始化程序段用于联系控制器与matlab,将modbusCom1中的建立modbus通信的代码中的,输入从站ip(“127.0.0.1”,当连接实体的控制器时,需要填写查找得到的控制器的ip地址)和端口(502,这个端口是由通信通道配置里选择的)。
global m;
m = modbus('tcpip', '127.0.0.1', 502); % 建立modbus通信
通过这个函数建立了simulink与控制器的通信,实现了仿真过程中和外界数据交互。
在matlab命令行窗口中输入以下命令可以测试modbus通信,判断通信是否成功连接。
m = modbus('tcpip', '127.0.0.1', 502);
- Simulink模型参数设置
mosbuscom1.m文件是s函数的源文件,放在.slx文件的目录下,应用到模型中的控制器中,替换控制算法部分,按如下图所示连接输入和输出端:
- 仿真结果
运行完成之后,得到完整的波形图如下图所示:
可以看出与原本程序自带的调温器所得的仿真结果是一样的。
5.5、总结
由仿真结果可以看出,低代码控制器的功能与原始的调温器的功能是一致的,但是低代码控制器并不需要繁复的程序代码的编写,根据需要编写相关的AOE配置、测点配置以及通信通道的配置就可以实现对应的功能,与目前常用的其他的控制方法相比,更方便于非编程技术背景人员对模型功能的设计和实现。