【问题标题】:Multiple calls to a dll from Dymola从 Dymola 对 dll 的多次调用
【发布时间】:2021-10-05 09:00:13
【问题描述】:

我正在实现一个模型,该模型需要调用 dll 库两次,以便从中接收特定值

  • 第一个调用是在库中设置一个系统(例如,来自组件目录和一些设计参数的动力总成)
  • 第二个调用是从此类系统中检索组件的性能(假设在该动力系统中使用特定电机时的效率)

这两个对 dll 的调用一起进行,并且可以在模拟期间重复。

到目前为止,我只通过来自 Modelica 外部函数的单独调用(一个用于第一次调用,一个用于第二次调用)将我的模型连接到 dll。但是,系统的状态会在第一次和第二次调用之间重置。

  • Modelica有没有办法加载一个dll,调用同一个实例 它多次,并最终在工作完成后关闭它?

  • 也许只有通过捆绑 外部函数中的全部功能?

  • 或者我正在尝试一些不起作用的东西,因为一些 我不知道的技术方面? (我不知道,也许是 在翻译过程中编译的方式)

【问题讨论】:

    标签: c dll modelica dymola


    【解决方案1】:

    如果我理解正确,看起来您的外部 DLL 具有某种对象指针,当您实例化它时会返回该指针,并且需要在每次后续函数调用 DLL 中的其他函数时将其传入(以保留州)。

    所以要在 Modelica 中执行此操作,您需要创建一个外部对象类。这些用于在外部保存状态,并具有构造函数和析构函数来管理其内存。您可以编写小的包装 C 函数来与您可以直接包含在 Modelica 注释中的 DLL 函数接口,或者编写一个包装库。

    文档

    https://build.openmodelica.org/Documentation/ModelicaReference.Classes.ExternalObject.html

    简单示例

    https://www.claytex.com/tech-blog/external-object-example-detecting-initial-rising-edge/

    详细示例

    https://github.com/modelica-3rdparty/ExternData/releases

    【讨论】:

    • 状态保存在 DLL 中,所以我想保持与它的连接。换句话说,我想加载库并保持加载,这样当我第二次调用它时,它会“记住”第一次调用期间给出的设置。从对库的两个函数调用的输入/输出来看,它们之间没有在 dll 的“外部”共享信息(但话又说回来,我还不是 C 的初学者,所以我什至可能不会描述这个问题正确)
    • 我不确定状态将如何存储在 DLL 中,除非您正在运行外部进程。通常,当您第一次实例化 DLL 时,您会得到一些指针,然后用它来引用它的方法。我知道,如果您使用外部对象类与您的 DLL 进行交互,那么在模拟结束之前它不会被卸载。 FMI 导入的工作方式相同。您可以尝试导入一些简单的 FMU 并查看外部对象的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多