主要内容

与消息通信的温度控制系统

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

模型概述

该模型包含N带有恒温器的相同房间(由多实例模型块建模),其中N=2是否在Si万博1manbetxmulink数据字典文件中定义了一个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”的徽章图标,因为如果您没有故意放置queue块,则会自动插入容量为1的队列。看到使用队列块来管理消息

要查看消息和事件的序列,请在Simulink工具栏上的万博1manbetx模拟选项卡,在审查结果部分中,点击顺序查看器。看到顺序查看器

控制器模型

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

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

For Each子系统,其块设置如上所示,被设置为具有N迭代,并且它的两个输入端口都是分区的。状态流图为Bang-Bang控制器建模,它类似于模型Bang-Bang温度控制系统(Stateflow)。它的输出端口输出一个布尔信号,指示是否开启加热。该信号在Bus Creator块中被打包成一个非虚拟信号,其中deviceID(基于1)来自迭代数(基于0)。信号被传递给调用Simulink函数的函数调用器块万博1manbetxSendCtrlMsg(放置在For Each子系统之外)将消息从模型发送出去。

空间模型

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

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

温度计模型

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

代码生成

对于代码生成和部署,参考模型Controller和温度计(蓝色)可以生成独立的嵌入式目标c++代码,并且可以通过消息中间件单独部署在嵌入式设备上。有关更多信息,请参见生成c++消息在Simulink和操作系统或中间件之间进行数据通信万博1manbetx(嵌入式编码);另请参阅与POSIX消息队列集成的基于消息的通信模型(嵌入式编码)

消息根级的import /Outport不支持C代码生成和代码自定义。万博1manbetx如果您需要生成C代码并调用消息中间件API来发送消息,请考虑移动Simulink函数万博1manbetxsendCtrlMsg到顶级模型并适当地自定义名称,以便引用的模型生成外部函数的可自定义调用站点。类似地,对于接收端,考虑在顶部模型中使用包含接收块的Simulink函数,并在引用模型中使用func万博1manbetxtion Caller块来替换接收块。

另请参阅

|||||