【发布时间】:2016-06-15 21:12:22
【问题描述】:
我有一个具有尺寸 [x,y] 端口的类,该类连接到具有匹配端口的另一个类。现在我想通过外部函数调用为这些变量 [x,y] 提供值,在该函数调用中我基本上读取了一个 .xml 文件并获取 x 和 y 的值。但是 Dymola 对此给出了一个错误,因为在编译过程中它作为一个非固定大小的数组出现。
【问题讨论】:
我有一个具有尺寸 [x,y] 端口的类,该类连接到具有匹配端口的另一个类。现在我想通过外部函数调用为这些变量 [x,y] 提供值,在该函数调用中我基本上读取了一个 .xml 文件并获取 x 和 y 的值。但是 Dymola 对此给出了一个错误,因为在编译过程中它作为一个非固定大小的数组出现。
【问题讨论】:
数组大小是结构参数,它们通常不能依赖于外部函数调用,因为它们应该在编译时知道。然而,这在例如 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 2017 中得到改进(无需修改 Modelica 代码)。在 Dymola 的早期版本中,如果您转换调用来计算 nTube 和 nSeg 的 C 函数,它应该可以工作。
如果这对分析问题没有帮助,则需要您的完整代码。
【讨论】: