2013-07-31 141 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中有一個轉換調試器。你可以在這裏找到哪個變量是從哪個方程進行評估的。