Simulink中如何为数据日志设置可变采样时间?
动态设置测试步骤对应的Simulink数据记录采样率
可以实现针对测试计划每行设置不同采样时间记录数据,以下是可行的解决方案,同时解释你之前方法失效的原因:
一、核心问题解析
你之前的尝试失败的根源:
- MATLAB Function写工作区:Simulink在编译阶段会固化
To Workspace模块的采样时间参数,运行时修改工作区变量无法改变已编译模块的配置,因此只有第一行的采样时间生效。 - Rate Transition模块:该模块仅用于不同固定采样率信号间的同步转换,无法动态调整数据记录的触发间隔。
二、可行解决方案
1. 触发子系统+Stateflow计数器控制
利用触发子系统实现按需记录,通过Stateflow根据当前测试步骤的采样时间控制触发时机:
- 把
To Workspace模块放入函数调用触发子系统(推荐使用函数调用触发,更灵活)。 - 在Stateflow中维护一个计数器:
- 模型基础采样时,计数器自增1。
- 根据当前测试步骤的采样时间
Ts_step,计算与基础采样率Ts_base的倍数N = Ts_step / Ts_base(确保为整数)。 - 当计数器达到
N时,触发子系统执行数据记录,随后重置计数器。
- 示例Stateflow动作代码(在基础采样触发的状态迁移中):
counter = counter + 1; if counter == current_step.N trigger_record(); % 触发子系统的函数调用事件 counter = 0; end
2. Simulink Data Inspector (SDI) 可编程控制
适合实时应用的灵活方案,无需依赖To Workspace模块:
- 预先在模型中配置好需要记录的信号,启用SDI记录并设置为可编程控制模式。
- 在Stateflow切换测试步骤时,调用MATLAB命令动态设置SDI记录速率:
% Stateflow动作中执行 Ts_step = current_test_step.sample_time; Simulink.sdi.setRecordRate('YourModelName', Ts_step); - 测试完成后,可直接通过SDI导出数据到工作区或文件。
3. 多采样率To Workspace模块+开关选择
预先创建对应所有可能采样率的To Workspace模块,通过Stateflow控制启用:
- 为测试计划中所有可能的采样率分别创建
To Workspace模块,每个模块设置固定采样率。 - 使用Multiport Switch模块将待记录信号路由到当前步骤对应的
To Workspace模块。 - 配合使能子系统,由Stateflow控制当前采样率对应的
To Workspace模块是否启用记录。
三、注意事项
- 确保所有测试步骤的采样时间都是基础采样率的整数倍,避免异步采样导致的数据丢失或同步问题。
- 实时应用中,优先选择触发子系统或SDI方案,减少运行时配置的性能开销。
- 使用SDI时,提前在模型配置中指定要记录的信号,避免运行时动态添加信号带来的延迟。
内容的提问来源于stack exchange,提问作者Fabi
相关产品推荐
相关产品推荐

