You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的触发信号:
    1. 保留1ms基准节拍:拖入Pulse Generator模块,周期设为1ms,脉宽设为1个仿真步长,输出基础定时脉冲
    2. 用Data Store Read模块读取B_Ready的当前值
    3. 把1ms脉冲和B_Ready信号接入二输入与门,与门输出接模块A的触发端口,触发类型设置为上升沿触发
      这部分逻辑会自动拦截B运行期间的1ms触发请求:只要B还在计算,B_Ready为false,就算1ms定时到点,也不会触发A运行。
  • 第三步:配置模块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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:22:03