2011-07-01 37 views
0

我試圖在Modelica中執行一個字符串。這個字符串將被保存在一個變量中,以便在需要時能夠更改它。如何使字符串可執行?

function Test 

input String inComp="resistor.R:=2"; 
output String outComp; 


algorithm 


    outComp:=inComp; 


end Test; 

請你


我使用Dymola的

我需要做的是以下幾點。從文本文件

- 讀取組件名稱(或輸入他們,而執行該功能) - 然後這些組分的變化的參數。此代碼是一個示例:

function Test 

input String inComp="resistor"; //Entered by the user, or read from a text file 
output Real result; 

algorithm 

    inComp.R :=2 ; /*This is incorrect since it wouldn't understand that 
        I want to enter : resistor.R := 2; */ 

    result := inComp.R ; //In order to view the result 

end Test; 
+1

Modelica是否具有與各種其他語言支持的eval()功能等效的功能?如果是這樣,你可以使用它。但是,如果你能避免它,請不要這樣做。 – GordonM

回答

6

您正在嘗試執行的操作在Modelica中通常不可行。可能有些工具有一個「反射API」,允許這樣做(或者可能是一個內置函數,它接受一個命令字符串並執行它),但肯定沒有適用於各種工具的通用API。

如果你想運行在Dymola的一堆模擬不同的參數值,我可以建議至少有三個不同的要進行。

  • 使用DDE接口向Dymola發送命令。通過這種方式,您可以「以某種方式」(從Dymola外部)制定參數值,然後請求Dymola運行模擬。我不確定DDE界面有多豐富,所以我不確定它是否能滿足你的需求(例如收穫結果)。
  • 編寫腳本文件。這與編寫函數有點不同,但在語法上幾乎相同。例如,運行幾個不同的慣性值「CoupledClutches」例如,你可以這樣做(在命令窗口):
 
    for j in {1.0, 1.1, 1.2, 1.5, 1.8} loop 
     J1.J := j; 
     simulateModel("Modelica.Mechanics.Rotational.Examples.CoupledClutches", 
        resultFile="CoupledClutches_"+String(j)); 
    end for; 
  • 使用的功能(如你),但調用simulateModel與修飾符,例如
 
    function RunLoop 
    algorithm 
     for j in {1.0, 1.1, 1.2, 1.5, 1.8} loop 
     simulateModel("Modelica.Mechanics.Rotational.Examples.CoupledClutches(J1(J="+String(j)+"))", 
        resultFile="CoupledClutches_"+String(j)); 
     end for; 
    end RunLoop; 
  • 使用內置功能simulateExtendedModelsimulateMultiExtendedModel實際上做的是幾乎與上述相同,但在一個更清潔的方式(在Dymola的命令窗口中鍵入document("simulateExtendedModel")document("simulateMultiExtendedModel")獲得這些詳細信息)。

OK,那應該給你一個起點。如果所有這些都不管出於什麼原因,只需要更新問題即可。

0

不同的選項使用Perl等動態地寫入和執行一些腳本。例如Text::Template可以用作模板引擎。我經常爲LaTeX做這件事。