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

Dymola中多次调用同一DLL实例的实现方案相关咨询

Modelica调用带状态DLL的问题解答

问题1:是否可以加载DLL后多次调用同一实例,任务完成后再关闭?

是可以实现的,核心依赖Modelica标准定义的ExternalObject机制:

  • 你可以自定义继承自ExternalObject的类,在类的构造函数中绑定DLL的系统初始化接口(也就是你用来搭建动力总成配置的第一个调用接口),在类的析构函数中绑定DLL的资源释放接口。
  • 后续用来查询性能的第二个接口可以封装为独立的外部函数,调用时传入该ExternalObject的实例作为入参即可。

只要ExternalObject实例没有被销毁,DLL侧保存的系统状态就会持续保留,不会出现两次调用之间状态被重置的问题,实例生命周期完全和你模型中的对象绑定。

问题2:是否必须把全部功能封装到同一个外部函数才能实现?

不需要。除了上述ExternalObject方案外,你也可以选择另一种轻量实现:

  • 调整DLL的对外接口:第一次调用初始化接口时返回一个唯一的实例句柄ID,DLL侧通过静态全局变量存储所有实例的状态映射;后续所有性能查询调用都传入该句柄ID作为入参,DLL侧根据ID匹配对应的系统状态即可。

这种方案不需要调整Modelica侧的复杂逻辑,只需要你手动管理实例的销毁时机,避免出现内存泄漏即可。

问题3:是否存在编译层面的技术限制导致该操作无法实现?

不存在不可突破的限制。当前所有主流Modelica编译器(Dymola、OpenModelica、SimulationX等)都完整支持ExternalObject特性和标准C约定的外部函数调用规则,只要你的DLL接口符合对应编译器要求的调用约定(通常为cdecl)即可正常运行。

唯一需要注意的适配点:如果你的仿真工具开启了并行多实例仿真,需要保证DLL侧的状态存储是线程安全的,或者为每个实例分配独立的状态空间,避免多线程读写冲突。

内容的提问来源于stack exchange,提问作者user12812532

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:24:03