调试Modelica代码

时间:2013-07-31 15:49:36

标签: modelica dymola

我想知道是否有办法“调试”一个模式代码,我的意思是逐行调试代码,你可以看到变量如何变化,这样的事情?

我知道modelica代码被翻译成C,我只是想知道是否有可能以某种方式做到这一点,如果有的话,我相信它会对任何模拟环境都有很大的改进。感谢。

HY

2 个答案:

答案 0 :(得分:4)

这是一个很好的问题,它出现了很多。但首先,让我们退一步。

逐行调试的想法来自命令式编程语言。 “命令式”是指程序只是按指定顺序执行的一系列指令。

当有人调试Java或Python时,这种“逐行”方法是有意义的,因为语句是表示行为的基本方式。这种“逐行”方法也可以扩展到建模形式,如框图(例如Simulink),因为虽然是图形,但它们也是必要的(即它们构成了按指定顺序执行的步骤)。

但Modelica 是一种命令式语言。没有步骤,陈述或指示的概念。相反,我们有无所不在的方程式。因此,线性思考调试在Modelica中不起作用。确实,您可以考虑调试从Modelica生成的C代码,但这通常不是很有用,因为它只与方程式部分相似。

那么如何调试Modelica代码?好吧,调试Modelica代码真的是调试Modelica方程式。通常,Modelica模型由组件组成。自动生成组件连接时生成的公式,因此我们可以规定Modelica编译器正确生成这些公式。那么剩下的就是组件模型中的方程式。

最简单的方法是单独测试每个组件(或至少在最小的模型中)。我常说,试图通过将Modelica组件全部放在一个大型模型中来调试Modelica组件就像听一个管弦乐队并试图找出一个不合时宜的乐器。 Modelica中的这些方程倾向于形成同时的方程组,这意味着当错误发生时,它们可以立即传播到许多变量。

因此,最好的办法是为每个组件创建测试并验证组件的行为。我的经验是,当你这样做时,你可以很容易地追踪和消除错误。

更新:您不需要将输出添加到其他人的组件模型以进行调试。可以在任何级别创建输出,例如

model SystemModel
  SomeoneElsesComponent a;
  SomeOtherGuysComponent b;
end SystemModel;

model SystemModel_Debug
  extends SystemModel;
  output Real someNestedSignalFromA = a.someSubsystem.someSubcomponent.someSignal;
  output Real someOtherNestedSignalFromB = b.anotherSubsystem.anotherSignal;
end SystemModel_Debug;

当然,如果您有多个信号组件实例,这就变得不切实际了。在这些情况下,我承认修改底层模型更容易。但是如果他们制作模型replaceable,你可以使用与上面相同的技巧(扩展他们的模型,添加一堆自定义输出,然后redeclare你的模型代替原始模型。

答案 1 :(得分:1)

现在OpenModelica中有一个转换调试器。您可以在这里找到从哪个等式中评估哪个变量。