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

时间:2019-11-14 05:50:52

标签: modelica 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;

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

2 个答案:

答案 0 :(得分:2)

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

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

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

OpenModelica就是这样,我不能肯定说出dymoa是做什么的,但是我想这给了你一个主意。我不知道对此是否有任何进一步的书面解释。

答案 1 :(得分:2)

添加到其他答案中。

TL:DR;

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

长版:

对于“检查”,将假定与连接器a的通用连接(通常是与所有连接器的通用连接)正常进行检查。该连接将添加一个方程式,因此在该模型中将有一个方程式过多-但我们不确定确切的方程式。 另外还有一些实例化检查,但是通常缺少修饰符(参数值和部分模型的重新声明)被视为非问题-因为它不是完整的模型。

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

通常例如,“检查”会在“翻译”之前停止,而不是像另一个答案所示那样求解方程组。

但是,在Dymola的最新版本中,如果模型带有“实验”注释,则“检查”还将检查(假设您正在检查完整的模型)-忽略上面的通常

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

连接器不平衡,具有1个流量变量和2个 非因果非流动变量(包括可能过度确定的) 个)。

对于“检查”,在某些模型中将是一个问题,因为Dymola必须为每个Port连接器添加1或2个方程式。