2013-07-31 114 views
5

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

我知道modelica代码被转换为C,我只是想知道是否有可能以某种方式做到这一点,如果有的话,我相信这将是对任何模拟环境的巨大改进。谢谢。

HY

+0

另见本文:http://dx.doi.org/10.3384/ecp12076443 – matth

回答

4

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

调试“一行一行”的想法是来自命令式编程语言。所谓“势在必行”,我的意思是说,一个程序只是按照指定顺序执行的一系列指令。

当有人调试Java或Python时,这种“一行一行”的方法是有道理的,因为这些语句是表示行为的基本方式。这种“一行一行”的方法也可以扩展到模拟框图(如Simulink),因为在图形方面,它们也是必要的(即它们构成按照指定顺序执行的步骤)。

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

那么如何调试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

非常感谢Micheal,我从你的回复中学到了很多东西,这就是我来到这个地方并发布我的问题的原因。我同意你的观点,即让每个组件(低到最低)正常工作是最好的方式,大部分时间我在顶层工作,而低层代码主要来自其他人。大量的“调试”时间花在了解别人的代码上。所以我真的希望如果有一天能够通过调试来“看到”变量是如何变化的。现在我所做的只是复制他们的模型并向其添加额外的输出。 –

+0

它可以工作,但修改原始代码只需要很长时间。 –

+1

请记住......您不应该将输出添加到其他人的模型。看到我上面的更新。 –

1

现在OpenModelica中有一个转换调试器。你可以在这里找到哪个变量是从哪个方程进行评估的。