主要内容

温控系统信息通信

此示例展示了如何在分布式系统中使用消息通信,其中控制器以迭代的方式管理来自不同发送方的多个传入消息,并发送消息以向不同接收方通信命令。该示例使用了一个控制系统模型,该模型管理两个具有独立恒温器的不同房间的温度。组件的算法建模基本上遵循statflow示例型号Bang-Bang温度控制系统(Stateflow),而组件之间的通信是使用Simulink®消息和SimEvents®块建模的。金宝app引用的模型Controller和温度计(用蓝色标注)是用于生成独立代码的软件组件,而其他组件则对环境建模。

模型概述

该模型包含N带有恒温器的相同房间(由多实例模型块建模),其中N2Simul金宝appink数据字典文件中是否定义了Simulink参数slddMsg.sldd,链接到顶模型和参考模型。每个房间可以单独设置设定值温度。房间的恒温器由控制器远程控制,所有恒温器使用相同的控制算法。

恒温器每隔一段时间向控制器发送温度信息0.2秒,同时控制器发送命令信息到恒温器,以命令加热或关闭每个1第二。一个实体输出开关(SimEvents)Block根据消息总线数据字段将消息从控制器路由到一个恒温器的deviceID.(总线也在数据字典中定义,并在所有模型中共享。)一个消息合并Block将来自不同恒温器的消息路由到控制器。

最初,使用在数据字典文件中定义的带有浮点类型字段的总线类型配置模型slddMsg.sldd.若要从浮点数切换到定点,请更改模型的数据字典slddMsg.slddslddMsgFixpt.sldd.在建模Tab,转到模型设置>模型属性>外部数据

的值可以轻松地扩展模型N,增加模型块的更多实例,并增加实体输出开关和消息合并块的端口号。房间模型中的每个温度计模型都有一个ID参数,该参数必须设置为与实体输出开关的输出端口索引匹配的值。

一个队列在控制器模型前面的块(FIFO,覆盖类型队列)缓冲消息,它在控制器的消息中间件内部建模队列。这里容量是N足以让队列用来自每个发送方的新消息覆盖最旧的消息,假设在传输过程中没有消息丢失。容量5 * N对于消息丢失的最坏情况,在哪里需要5是控制器的采样时间除以恒温器的采样时间。此外,在每个恒温器前面自动插入一个容量为1的队列,并显示一个夹着“1”的徽章图标,因为如果您没有故意放置队列块,则会自动插入一个容量为1的队列。看到使用队列块管理消息

要查看消息和事件的序列,请在“Simulink工具条”上金宝app模拟选项卡,在审查结果部分中,点击顺序查看器.看到顺序查看器

控制器模型

在Controller模型中,与import块连接的Update Temperature子系统首先接收来自房间的包含温度信息的所有消息。子系统将该信息存储在温度设定点和当前温度两个向量中。然后,For Each子系统读取矢量,处理信号,并通过Simulink函数发送控制消息金宝appsendCtrlMsg

Update Temperature子系统是一个do-while子系统,其终止条件端口由Receive块的状态端口提供,这意味着它一直运行到无法从外部队列接收更多消息为止(在顶部模型中)。消息数据为DeviceMsg总线类型,在数据字典文件中定义,有两个字段:温度而且的deviceID.因此,当接收块的输出信号传播到启用的子系统(其启用端口连接到接收块的状态端口)时,总线选择器块将信号分解为的deviceID温度,定位点信号。的定位点而且温度信号然后被赋值给与之相关的矢量元素的deviceID.最后,由单元延迟块维护的向量由启用的子系统和更新温度子系统作为信号输出到For Each子系统。

For Each子系统,其块设置如上所示,被设置为haveN迭代,并且它的两个输入端口都是分区的。状态流图为Bang-Bang控制器建模,类似于中所解释的型号Bang-Bang温度控制系统(Stateflow).它的输出端口输出一个布尔信号,指示是否打开加热。该信号被打包到总线创建器块的非虚拟信号中,其deviceID(基于1)来自迭代号(基于0)。信号被传递给Function Caller块,该块调用Simulink函数金宝appSendCtrlMsg(放置在For Each子系统之外)来从模型发送消息。

空间模型

在Room模型中,Thermostat子系统与环境交互。恒温器有两个输入,控制信息和设定值温度信号,和两个输出,加热速率和温度信息到控制器。增益和积分器块模拟房间加热或冷却的物理,相对于加热速率和房间大小。

温控器子系统由温度传感器子系统、温度软件模块和温度执行器子系统组成。温度计软件模型块定期接收来自控制器的控制消息,并将其分解为布尔命令(开/关)到温度执行器子系统,该子系统决定加热速率。温度计软件还从温度计传感器子系统输入温度信号,该子系统检测模拟温度,将其转换为数字信号,并将消息发送回控制器。

温度计模型

在温度计模型中,Receive块与import块连接,以便在每个时间步骤接收来自外部队列的控制消息。消息数据被分解为命令信号(输出)和deviceID信号(必须与模型的ID参数匹配)。ID参数应该在顶层模型的模型块中设置。函数将Receive块的初始值设置为MATLAB®结构的deviceID字段等于模型参数ID命令字段,取值为.同时,数字温度、设定值和deviceID信号被打包到一个非虚拟总线信号中,并作为消息发送到Outport块。

代码生成

对于代码生成和部署,参考模型Controller和温度计(蓝色)可以生成独立的嵌入式目标c++代码,并且可以单独部署在带有消息中间件的嵌入式设备上。有关更多信息,请参见生成c++消息以在Simulink和操作系统或中间件之间通信数据金宝app(嵌入式编码);另请参阅使用手写代码集成c++消息与POSIX(嵌入式编码)

消息根级导入/输出不支持C代码生成和代码自定义。金宝app如果需要生成C代码并调用消息中间件API来发送消息,可以考虑移动Simulink函数金宝appsendCtrlMsg并适当地自定义名称,以便引用的模型生成外部函数的可自定义调用站点。类似地,对于接收端,考虑在顶部模型中使用包含receive块的Simulink函数,并在引用的模型中金宝app使用function Caller块来替换receive块。

另请参阅

|||||