使用Dymola导出的FMU在Casadi中调用DaeBuilder.create()出错
问题描述
我正尝试遵循Casadi文档中的modelica_fmu_import.py示例,但并未完全照搬,而是使用了Dymola导出的FMU(采用Dymola求解器进行协同仿真)。
执行以下命令:
dae = DaeBuilder('pump', 'pump_fmu_unzipped') dae.disp(True)
看似成功,得到如下结果:
Unpacked "folder.path" nx = 5, nz = 0, nq = 0, ny = 1, np = 0, nc = 0, nd = 0, nw = 0, nu = 1 Variables x = [pumps.medium.p, pumps.medium.T, reservoir.level, reservoir.medium.T, PT1.y] y = [tank_pressure] u = [pump_rpm] Differential equations \dot{pumps.medium.p} == der(pumps.medium.p) \dot{pumps.medium.T} == der(pumps.medium.T) \dot{reservoir.level} == der(reservoir.level) \dot{reservoir.medium.T} == der(reservoir.medium.T) \dot{PT1.y} == der(PT1.y) Output variables tank_pressure
不过微分方程的描述看起来没什么信息量,这是正常现象吗?
当尝试运行以下命令时出现问题:
f = dae.create('f', ['x', 'u'], ['ode'])
报错信息如下:
RuntimeError: Error in DaeBuilder::create for 'process' at .../casadi/core/dae_builder.cpp:737: Error in Fmu::init for 'f' [Fmu2] at .../casadi/core/fmu.cpp:63: .../casadi/core/casadi_os.cpp:166: Assertion "handle!=nullptr" failed: DllLibrary::init_handle: Cannot load shared library 'folder.path/binaries/win64/.dll': ( Searched directories: 1. casadipath from GlobalOptions 2. CASADIPATH env var 3. PATH env var (Windows) 4. LD_LIBRARY_PATH env var (Linux) 5. DYLD_LIBRARY_PATH env var (osx) A library may be 'not found' even if the file exists: * library is not compatible (different compiler/bitness) * the dependencies are not found ) Tried '...\anaconda3\Lib\site-packages\casadi' : Error code (WIN32): 126 Tried '' : Error code (WIN32): 126 Tried '.' : Error code (WIN32): 126
我想知道这是什么原因?是导出的FMU存在问题,还是需要将存放解压后FMU的工作目录添加到CASADIPATH中?
问题分析与解决
关于微分方程无信息量的问题
这是正常现象。因为你导入的是协同仿真FMU(Co-Simulation FMU),这类FMU仅暴露输入输出接口和状态变量,内部的微分方程逻辑被封装在共享库中,CasADi无法直接解析出具体的方程表达式,只会生成占位符式的微分方程描述,无需担心。
关于共享库加载失败的问题
报错核心是无法找到FMU对应的DLL文件,可能的原因及解决方法如下:
- FMU导出/解压异常:检查
pump_fmu_unzipped/binaries/win64/目录下是否存在有效的DLL文件。如果目录为空或文件名异常,说明FMU导出过程出错,或解压时文件损坏,需重新用Dymola导出协同仿真类型的FMU,并确保解压完整。 - 路径配置问题:无需将解压目录添加到CASADIPATH,而是要保证FMU的DLL所在目录能被系统识别:
- 将
pump_fmu_unzipped/binaries/win64/目录添加到系统PATH环境变量,之后重启Python环境。 - 或者在代码中临时添加路径:
import os os.add_dll_directory("pump_fmu_unzipped/binaries/win64/")
- 将
- 位数不兼容:确认你的Python环境(32位/64位)与Dymola导出的FMU位数一致。若Python是64位,FMU必须导出为64位,反之亦然。
- 依赖缺失:WIN32错误码126通常表示DLL的依赖库缺失。可使用Dependency Walker工具查看该DLL依赖的其他库是否存在,尤其是Dymola相关的运行时库,确保这些库在系统PATH中。
内容的提问来源于stack exchange,提问作者loganirado69
相关产品推荐
相关产品推荐

