2017-08-18 4 views
2

Ich habe ein Modell, in dem ich eine CombiTable1D verwenden, um eine externe Eingabe aus einer .txt Datei abrufen. Die Datei wird momentan von einem Python-Skript generiert, aber in der letzten Phase des Projekts wird sie jede Sekunde aktualisiert. Zur Zeit erfolgt die Simulation ohne Probleme, da die Datei .txt statisch ist. Lesen Sie einfach die Datei und führen Sie die Simulation gemäß den dort geschriebenen Daten durch.OpenModelica Aktualisierung CombiTable Eingabe in Echtzeit

Was ich tun möchte, ist ein Modell bis zu einer bestimmten Zeit zu simulieren, lassen Sie uns 100s sagen, und dann bis zu einem Echtzeit-Ereignis warten lassen, durch die die .txt Datei für die nächsten externen Eingabewerten aktualisiert wird zwischen 100-200. Die Simulation sollte fortgesetzt werden, indem diese neuen Werte für die nächsten 100 Sekunden abgerufen werden.

Da ich bereits mit OMPython gearbeitet habe, ist es sehr praktisch für mich, die .txt Datei mit Python zu bearbeiten, sagen wir für jeweils 10 Sekunden in Echtzeit. Ich kann jetzt das Modell bis zu der Zeitinstanz simulieren, die ich als den Aktualisierungspunkt der externen Eingabe definiere. Aber ich konnte nicht herausfinden, wie ich den Zustand der Simulation beibehalten und die Datei noch einmal lesen lassen sollte.

Antwort

3

Eigentlich klingt das für mich wie ein Co-Simulations-Szenario. Wie auch immer, was könnten Sie tun, ist von CombiTable1D zu erweitern und haben so etwas wie

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

Das war ich suche, und ich bin zu akzeptieren die Antwort. Ich wusste nicht, wie man ein Force-Update macht. Noch eine kurze Frage, gibt es eine Möglichkeit, die Ausgabe der Simulation zu überprüfen? Denn wenn wir so vorgehen, enden die Simulationen nicht wirklich und es wird keine Outfut-Datei erzeugt. – Falsterbo

0

Neben dem die Antwort, die ich angenommen, ich will eine andere Lösung geben, die nicht so effizient ist. Für ein einfaches Modell mit einem Kondensator und Widerstand habe ich erfolgreiche Tests gemacht, aber mit komplexeren Modellen funktioniert es nicht richtig. In einem Modelica-Skript, 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); 

wird das Modell bauen und den ersten Schritt, bis die Simulationszeit t = 1 s simulieren. Später wird mit Python die Textdatei aktualisiert. Die neuen Daten für die Zeit zwischen t = 1s und t = 2s werden in die Textdatei geschrieben, wo ich die Eingabe des Modells bekomme. Dann wird ein weiterer Schritt der Simulation für die Zeit zwischen t = 1s und t = 2s durchgeführt. Als Schleife geht es für immer so weiter: Aktualisieren Sie die Daten, machen Sie eine neue Simulation für das neue Zeitintervall. Der Trick ist, das Lesen der Ausgabedatei am Ende jeder Stufe erstellt und alle Variablenwerte als die neuen Anfangsbedingungen der Simulation geben, mit folgenden Skript:

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); 
Verwandte Themen