【问题标题】:How to work around array of components with fixed size error?如何解决具有固定大小错误的组件数组?
【发布时间】:2016-06-15 21:12:22
【问题描述】:

我有一个具有尺寸 [x,y] 端口的类,该类连接到具有匹配端口的另一个类。现在我想通过外部函数调用为这些变量 [x,y] 提供值,在该函数调用中我基本上读取了一个 .xml 文件并获取 x 和 y 的值。但是 Dymola 对此给出了一个错误,因为在编译过程中它作为一个非固定大小的数组出现。

附上错误截图。

【问题讨论】:

    标签: arrays modelica dymola


    【解决方案1】:

    数组大小是结构参数,它们通常不能依赖于外部函数调用,因为它们应该在编译时知道。然而,这在例如 OpenModelica 中得到支持,其中构建和调用外部函数的 dll,并在模型编译期间获取结果。

    在所有工具中支持这一点的唯一方法是使用外部工具生成模型,该工具读取 xml 并使用读取的值更改 .mo 文件。 你可能有类似Parameters.mo的东西:

    package Parameters
      constant Integer nTube = <EXTERN_NTUBE>;
      constant Integer nSeg = <EXTERN_NSEG>;
    end Parameters;
    

    您的外部工具将读取 XML 并绑定到 Parameters.mo,然后您可以通过 Parameters.nTube 和 Parameters.nSeg 在您的模型中使用它。也许最好提供一些默认值,以便直接使用此文件:

    package Parameters
      constant Integer nTube = 1;
      constant Integer nSeg = 2;
    end Parameters;
    

    然后您的外部工具将在编译之前将 1 和 2 替换为所需的值。

    【讨论】:

    • 感谢您的回答。我使用 Dymola,您能否详细说明在模型编译期间如何从外部函数获取结果?
    • 这在很大程度上取决于工具,据我所知,每个工具的作用都不同。
    【解决方案2】:

    这应该在 Dymola 2017 中得到改进(无需修改 Modelica 代码)。在 Dymola 的早期版本中,如果您转换调用来计算 nTube 和 nSeg 的 C 函数,它应该可以工作。

    如果这对分析问题没有帮助,则需要您的完整代码。

    【讨论】:

    • 你的意思是,如果你用这些函数构建一个 C 库,它会起作用吗?或者您的意思是您需要将 C 函数转换为 Modelica 函数?
    • 感谢您的信息。我将安装 Dymola 2017 并试一试。您还可以通过翻译 C 函数来详细说明您的意思吗?我在运行之前翻译了整个模型。
    • 我的意思是直接翻译包装 C 函数的 Modelica 函数,然后再使用它们翻译模型。只需像翻译模型(翻译,而不是模拟)一样为这些功能选择“翻译”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多