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
相关产品推荐
相关产品推荐

