2017-08-18 61 views
2

我有一個模型,我正在使用CombiTable1D從.txt文件中檢索外部輸入。該文件目前由Python腳本生成,但在項目的最後階段,它將每秒更新一次。目前,模擬發生沒有問題,因爲.txt文件是靜態的。只需讀取文件並根據寫入的數據進行模擬。OpenModelica實時更新CombiTable輸入

我想要做的是模擬模型,直到一定的時間,讓我們說100S,然後讓它等到一個實時事件,通過該.TXT文件針對的下一個外部輸入值更新100-200。在接下來的100秒內,仿真應該繼續獲得這些新值。

由於我已經在使用OMPython,所以使用Python來編輯.txt文件對我來說是非常實用的,比如說,實時每10秒鐘一次。我現在可以模擬模型,直到我定義爲外部輸入刷新點的時間實例。但我無法弄清楚如何保持模擬狀態並使其再次讀取文件。

回答

3

實際上,這聽起來像是一個聯合仿真場景。總之,你可以做的就是從CombiTable1D像

block CombiTable1DWithUpdate 
    extends Modelica.Blocks.Tables.CombiTable1D(final tableOnFile=true); 
    algorithm 
    when sample(0, 10) then 
     readTableData(tableID, /* force update */ true, verboseRead); 
    end when; 
end CombiTable1DWithUpdate; 
+0

這是我一直在尋找,我接受答案。我不知道如何進行部隊更新。還有一個問題,有沒有辦法檢查模擬的輸出?因爲當我們這樣做時,模擬不會實際結束,並且沒有生成outfut文件。 – Falsterbo

0

延伸,並具有一些另外的我接受了答案,我想給另一種解決方案是不那麼有效。對於一個帶有電容和電阻的簡單模型,我做了成功的測試,但使用更復雜的模型,它不能正常工作。在一個Modelica的腳本,realTimeSimulation.mos:

outputFile := "stepResult.mat"; 
simulation_step := 1; 
start_time := 0; 
stop_time := start_time+simulation_step; 
loadFile("WhereverTheFileIs.mo"); 
buildModel(myTestModel); 
system("myTestModel-override=startTime="+String(start_time)+",stopTime="+String(stop_time)+" -r="+outputFile); 

將構建模型和模擬第一步驟直到仿真時間t = 1秒。稍後,使用Python將更新文本文件。 t = 1s和t = 2s之間時間的新數據被寫入到獲取模型輸入的文本文件中。然後模擬的另一個步驟是t = 1s到t = 2s之間的時間。作爲一個循環,它會像永遠一樣繼續下去:實現數據,爲新的時間間隔進行新的模擬。關鍵是,閱讀在每個步驟結束創建的輸出文件,並讓所有的變量值作爲新的初始條件的模擬,使用以下腳本:

valueList := readSimulationResultVars(outputFile); 
start_time := start_time+simulation_step; 
stop_time := stop_time+simulation_step; 
value := val(OpenModelica.Scripting.stringVariableName(valueList[1]),start_time,outputFile);', 
variableString := valueList[1] + "=" + String(value); 

for i in 2:size(valueList,1) loop 
value := val(OpenModelica.Scripting.stringVariableName(valueList[i]),start_time,outputFile); 
variableString := variableString + "," + valueList[i] + "=" + String(value); 
end for; 

system("myTestModel-override startTime="+String(start_time)+",stopTime="+String(stop_time)+",variableString+" -r="+outputFile);