Simulink中实现模块等待:让A运行后等待B计算完成
Simulink下模块A、B串行阻塞执行逻辑实现方案
你要实现的逻辑本质是A、B组成串行无抢占的执行流,A的触发不受固定1ms采样的硬约束,必须等上一轮B完全执行完成才能启动下一轮的A,具体实现步骤如下:
- 第一步:搭建全局执行状态标记
拖入一个Data Store Memory模块,命名为B_Ready,数据类型设为布尔型,初始值设为true,代表上电初始状态B没有在执行任务,允许第一轮A启动。
在模块B内部的计算逻辑最前端加写入逻辑,把B_Ready置为false,标记B进入计算状态;等B所有计算逻辑跑完的最后一步,再把B_Ready置为true,标记本轮任务完成。两个写入操作都用关联该Data Store的Data Store Write模块实现即可。 - 第二步:重构模块A的触发逻辑,取消原固定1ms采样配置
不要直接给模块A设置1ms的固定采样时间,把A的采样时间改为-1(继承触发信号),通过两个条件的与逻辑生成A的触发信号:- 保留1ms基准节拍:拖入
Pulse Generator模块,周期设为1ms,脉宽设为1个仿真步长,输出基础定时脉冲 - 用
Data Store Read模块读取B_Ready的当前值 - 把1ms脉冲和
B_Ready信号接入二输入与门,与门输出接模块A的触发端口,触发类型设置为上升沿触发
这部分逻辑会自动拦截B运行期间的1ms触发请求:只要B还在计算,B_Ready为false,就算1ms定时到点,也不会触发A运行。
- 保留1ms基准节拍:拖入
- 第三步:配置模块B的触发与执行属性
模块B的采样时间同样设为-1(继承触发),触发源接模块A的执行完成信号(直接取A的输出有效信号做上升沿触发,或者给A接Function-Call Subsystem类型的B模块,A跑完直接函数调用启动B)。
如果B是MATLAB Function、S函数或者自定义子系统,一定要打开模块的同步阻塞执行选项,不要把B配置成异步并发任务,防止调度器在B计算过程中抢占CPU资源触发其他逻辑。 - 嵌入式代码生成/实时硬件场景适配
如果模型需要生成代码跑在实时控制器上,不需要额外改逻辑架构,只需要把软件层面的B_Ready标记替换成B任务完成的硬件中断标志位即可,同时把A、B配置为同优先级的同步任务,关闭高优先级任务对这两个任务的抢占,避免时序错乱。
注意:该实现下整轮流程的实际周期会≥1ms,时长完全由B的计算耗时决定。如果某次B的计算耗时为3.2ms,那下一轮A会等B跑完后,等到最近的一个1ms节拍点才会启动,完全满足“B完成前A不触发、每轮仅执行一次A”的要求。
内容的提问来源于stack exchange,提问作者verner
相关产品推荐
相关产品推荐

