You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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所在目录能被系统识别:
    1. 将pump_fmu_unzipped/binaries/win64/目录添加到系统PATH环境变量,之后重启Python环境。
    2. 或者在代码中临时添加路径:
      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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:10:30