在 Dymola 中检查模型和翻译模型有什么区别

What is the difference between check a model and tranlate a model in Dymola

我正在使用 Dymola,但我不确定检查模型和翻译模型之间的区别。 所以我做了一个测试。

这里是连接器的代码和模型文件

connector Port
  flow Real Q;
  Real P;
  Real T;
end Port;
model Inlet
  parameter Real Q = 1;
  parameter Real P = 2;
  parameter Real T = 3;
  Port a;
equation 
  a.Q = Q;
  a.P = P;
  a.T = T;
end Inlet;

如果我检查模型,Dymola 会生成一个 .mof 文件:

model lab.Inlet
parameter Real Q = 1;
parameter Real P = 2;
parameter Real T = 3;

Real a.Q;
Real a.P;
Real a.T;

// Equations and algorithms

  // Component 
  // class lab.Inlet
  equation
    a.Q = Q;
    a.P = P;
    a.T = T;

end lab.Inlet;

如果我翻译模型,.mof 文件如下所示:

model lab.Inlet
parameter Real Q = 1;
parameter Real P = 2;
parameter Real T = 3;

Real a.Q;
Real a.P;
Real a.T;

// Equations and algorithms

  // Component 
  // class lab.Inlet
  equation
    a.Q = Q;
    a.P = P;
    a.T = T;
    a.Q = 0.0;

end lab.Inlet;

我看到翻译生成的.mof文件里多了一行:a.Q = 0.0;.

所以,我的问题是检查和翻译的详细区别是什么?是否有关于此主题的详细文档?

检查模型应该只创建一个小的中间模型,可以检查逻辑错误(#eqs == #unknowns 等),但不用于之后的符号操作。

实例化模型应该创建一个可用于符号操作的平面模型。

转换模型应该首先 运行 实例化,然后执行符号操作(BLT 等)并实际创建模拟代码。

OpenModelica 就是这样做的,我不能确定 dymola 做了什么,但我想这给了你一个想法。我不知道是否有任何进一步的文件解释。

添加到另一个答案。

TL:DR;

  • 检查通常假定模型将是较大模型的子组件。
  • 翻译用于 运行 模型,即模型本身应该是完整的。

更长的版本:

对于 "Check" 组件 通常 检查假定与连接器 a 的通用连接(通常与所有连接器的通用连接)。该连接将添加一个方程式,因此该模型中将有一个方程式太多——但我们不知道到底是哪一个。 还有一些额外的实例化检查,但是 通常 缺少修饰符(参数值和部分模型的重新声明)被视为非问题 - 因为它不是完整的模型。

对于 "Translate",假设您正在翻译一个完整的模型,并且 a 等非因果连接器将默认连接,即流设置为零 - 这给出了特定的你看到的错误信息。 (并且 public 顶级输入将从 dsu.txt 中读取。)此外,模型被转换为 C 代码,这需要更多。

通常 "Check" 在 "Translate" 之前停止,例如,不求解其他答案中指示的方程组。

但是,在最新版本的 Dymola 中,如果模型有 "experiment" 注释,"Check" 也会检查(假定您正在检查完整模型)- 忽略 通常以上。

最新版本的 Dymola 也会报告连接器问题 Port:

The connector is not balanced, it has 1 flow variables and 2 non-causal non-flow variables (including possible over-determined ones).

对于 "Check" 这对于某些模型来说是个问题,因为 Dymola 必须为每个 Port-连接器添加 1 或 2 个方程。