FMPy调用FMI3.0 FMU无法获取实例化组件内变量值的问题
问题分析与解决
你遇到的核心问题是FMI 3.0标准的FMU在FMPy仿真时仅返回time数组,无法获取顶层输出变量Psurp,但FMI 2.0版本正常,且该问题仅在访问实例化组件内部变量赋值的顶层输出时出现。以下是具体排查和解决步骤:
1. 确认FMU中的变量是否正确导出
先用FMPy的dump()函数查看FMI 3.0 FMU的完整变量列表,确认Psurp是否被包含在内:
from fmpy import dump dump('TestFMU3.fmu')
如果输出中找不到Psurp,说明Dymola导出FMI 3.0时未将该变量标记为输出。此时需要:
- 在Modelica代码中给
Psurp显式添加output修饰符(当前代码仅注释标注,语法上需补全:output Modelica.Units.SI.Power Psurp;) - 导出FMI 3.0时,在Dymola的变量选择步骤中,手动将
Psurp添加到输出变量列表,或勾选"Include all variables"选项
2. 直接指定组件内部变量作为输出
若顶层Psurp确实未被正确导出,可以跳过顶层变量,直接传入组件内部目标变量的完整路径作为输出参数:
result = simulate_fmu( 'TestFMU3.fmu', validate=False, start_time=0, stop_time=10, solver="CVode", output_interval=5, record_events=False, output=['gri.gri.y'], # 使用组件内部变量的完整路径 ) df = pd.DataFrame.from_dict(result)
FMI 3.0与FMI 2.0的变量路径规则基本一致,但部分工具导出时可能调整层级命名,需以dump()输出的实际路径为准。
3. 检查Dymola的FMI 3.0导出配置
Dymola对FMI 3.0的默认导出逻辑可能与FMI 2.0存在差异:
- 确认导出时未启用"Flatten model"选项,该选项可能改变变量的层级结构
- 检查FMI类型(Co-Simulation/Model Exchange)与仿真时的设置一致,可在
simulate_fmu中手动指定fmi_type='CoSimulation'
4. 升级FMPy版本
若以上步骤无效,可能是FMPy对FMI 3.0的支持存在版本bug,尝试升级到最新版:
pip install --upgrade fmpy
内容的提问来源于stack exchange,提问作者Praseeth Prabhakar
相关产品推荐
相关产品推荐

