合并多FMU生成FMU容器时报ModelStructure/Outputs错误如何解决
问题原因
该错误由合并后生成的FMU的modelDescription.xml文件结构不符合FMI标准导致,核心是<ModelStructure>下的<Outputs>节点条目数和实际定义的输出变量数量不匹配,和你给出的报错提示ModelStructure/Outputs must have exactly one entry for each variable with causality="output"完全对应:
- FMPy的FMU合并功能默认逻辑存在缺陷,若合并时未显式指定对外暴露的输出映射,会出现子FMU的output变量没有被同步添加到
<Outputs>节点下的情况 - 部分场景下合并逻辑会重复添加同一个输出变量的条目,导致
<Outputs>下的条目数多于实际output变量数,也会触发该校验规则
解决方法
临时修复方案(直接修改生成的FMU)
- 将导出的最终FMU文件后缀改为.zip,解压得到全部文件
- 打开根目录下的
modelDescription.xml文件,先统计所有<ScalarVariable>节点中属性为causality="output"的变量总数,记为N - 找到
<ModelStructure>节点下的<Outputs>子节点,统计其下<Unknown>条目的数量:- 若条目数小于N:逐个核对遗漏的output变量,为每个缺失的变量补充对应
<Unknown>条目,条目index属性填写对应output变量的valueReference值 - 若条目数大于N:删除重复的
<Unknown>条目,保证每个output变量仅对应一个条目
- 若条目数小于N:逐个核对遗漏的output变量,为每个缺失的变量补充对应
- 将所有修改后的文件重新打包为ZIP格式,修改后缀为.fmu,重新校验即可通过
永久规避方案(调整合并脚本)
在调用FMPy的合并接口时,显式指定所有需要对外暴露的输出映射,从根源避免条目不匹配问题,参考代码如下:
from fmpy.fmu_container import create_fmu_container # 定义三个子FMU的本地路径 sub_fmus = [ './pandapower_grid.fmu', './csv_data1.fmu', './csv_data2.fmu' ] # 显式定义所有对外输出的映射关系,variable为子FMU内的变量名,name为合并后FMU的对外变量名 external_outputs = [ {'variable': 'pandapower_grid.bus1_voltage', 'name': 'grid_bus1_voltage'}, {'variable': 'csv_data1.temperature', 'name': 'env_temperature'}, {'variable': 'csv_data2.power_load', 'name': 'building_power_load'} ] # 生成合并FMU时传入outputs参数 create_fmu_container(sub_fmus, './merged_total.fmu', outputs=external_outputs)
内容的提问来源于stack exchange,提问作者Kosmylo
相关产品推荐
相关产品推荐

