如何通过fmusim从文件批量向FMU传递参数与状态值?
批量传递FMU参数与状态值到fmusim的可行方案
现有方法的局限性回顾
--input-file:仅支持输入变量,无法覆盖参数/状态的初始值--start-value:单条命令传递超4000个键值对会触发命令行长度限制报错--initial-fmu-state-file:生成的二进制文件无法人工编辑,不适合批量修改
可行解决方案
方案1:自定义工具生成可复用初始状态文件
基于FMU的FMI接口编写轻量C工具,步骤如下:
- 加载目标FMU,调用
fmi2SetReal/fmi3SetReal等接口批量设置所有需要修改的参数和状态值 - 调用
fmi2GetFMUState/fmi3GetFMUState导出已配置好的状态 - 保存导出的二进制状态文件,后续直接通过
--initial-fmu-state-file参数传给fmusim
该方法只需一次配置,生成的状态文件可重复使用,完全避开命令行长度限制。
方案2:扩展fmusim源码支持批量参数文件
修改fmusim的源码,新增--start-values-file选项,支持从文本文件读取批量键值对:
- 定义文件格式:比如每行一个
"param-name": value(JSON)或param-name,value(CSV) - 在参数解析模块添加对该选项的处理逻辑,读取文件后循环调用
setStartValue接口完成批量设置
编译修改后的fmusim,即可通过文件批量传递参数/状态,无需改动原FMU。
方案3:shell脚本拆分命令(临时应急)
若不想修改代码或编写工具,可利用shell的参数列表文件功能(Linux/macOS适用):
- 将所有
--start-value "param-name" "param-value"行写入文本文件,比如start_values.args - 执行
fmusim @start_values.args,shell会自动展开文件中的参数
注意:Windows CMD不支持该语法,PowerShell可使用Get-Content start_values.args | % { $_ } | fmusim替代,但仍可能受系统命令行长度上限限制,仅适合参数数量略超阈值的场景。
优先级建议
优先选择方案1,无需修改fmusim,利用FMI原生接口生成可复用状态文件;若需频繁修改参数,方案2更灵活;方案3仅作为临时 workaround。
内容的提问来源于stack exchange,提问作者Chintan Pathak
相关产品推荐
相关产品推荐

