【问题标题】:Debug Modelica code调试 Modelica 代码
【发布时间】:2013-07-31 15:49:35
【问题描述】:

我想知道是否有办法“调试”modelica 代码,我的意思是逐行调试代码,您可以看到变量如何变化,诸如此类?

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

HY

【问题讨论】:

标签: modelica dymola


【解决方案1】:

这是一个很好的问题,而且经常出现。但首先,让我们退后一步。

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

当有人调试 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 您的模型代替原始模型)。

【讨论】:

  • 非常感谢 Micheal,我从您的回复中学到了很多东西,而这正是我来到这个地方并发布我的问题的原因。我同意你的观点,让每个单独的组件(到最低级别)正常工作是最好的方法,事情是我大部分时间都在顶层工作,而低级代码大多来自其他人。我的大量“调试”时间都花在了理解别人的代码上。所以我真的希望有一天我可以通过调试“看到”变量是如何变化的。现在我所做的只是复制他们的模型并为其添加额外的输出。
  • 可以,但是修改原始代码需要相当多的时间。
  • 请记住...您不需要将输出添加到其他人的模型中。请参阅上面的更新。
  • 非常感谢 Micheal,这比修改其他代码要聪明得多。一个月前我开始使用 Dymola,还有很多东西要学。谢谢你的帮助!顺便说一句,我很期待你的新书。
  • 假设您有两个子系统,每个子系统都有 10 个非线性方程,这些方程是描述行为所必需的,但是当将它们连接在一起时,会因非线性而导致初始化失败。在上述情况下,我应该如何知道究竟是哪个方程导致了分歧?
【解决方案2】:

OpenModelica 现在有一个转换调试器。您可以在此处找到哪个变量是根据哪个方程式计算得出的。

【讨论】:

  • 一月,关于转换调试器的最新文档是什么?谢谢
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多