2016-08-29 5 views
2

Hallo Modelica Gemeinschaft,Pause JModelica und Pass Inkrementaleingänge Während Simulation

würde Ich mag zwei Modelle parallel in JModelica laufen, aber ich bin nicht sicher, wie zwischen den Modellen Variablen zu übergeben. Ein Modell ist ein Python-Modell und das andere ist ein EnergyPlusToFMU-Modell.

Die Beispiele in der JModelica-Dokumentation enthalten die vollständigen Eingaben für die Simulationsperiode, die vor der Simulation des Modells definiert wurden. Ich verstehe nicht, wie man ein Modell konfigurieren würde, das für Eingaben pausiert, was ein Schlüsselmerkmal von FMUs und Co-Simulation ist.

Kann mir jemand ein Beispiel oder ein Stück Code liefern, das zeigt, wie dies in JModelica implementiert werden könnte?

Setze ich den Simulationsbefehl in eine Schleife? Wenn ja, wie gehe ich mit den Aufwärmzeiten und der Initialisierung um, ohne vorher Daten zu verlieren?

Vielen Dank für Ihre Zeit,

Justin

+1

Möchten Sie eine Simulation durchführen, bei der jedes Modell in einem separaten Prozess ausgeführt wird, oder ist es in Ordnung, dass sie im Prozess ausgeführt werden und nur Informationen zwischen ihnen austauschen? Haben Sie darüber nachgedacht, die do_step-Methode in der Co-Simulation FMU zu verwenden? –

+0

Hi @ChristianAndersson, vielen Dank für Ihr Vertrauen. Ich glaube, do_step könnte das sein, wonach ich suche. Ich habe Hilfe (do_step) verwendet, um einige Informationen zu erhalten, aber ich war mit diesem Befehl nicht vertraut. Gibt es irgendwo eine zusätzliche Dokumentation zu diesen Befehlen? Außerdem bemerke ich, dass das Setzen und Erhalten von Variablen merkwürdig wirkt. Wenn ich eine Variable "setze", merke ich die Änderung in den FMU-Ergebnissen, aber wenn ich dieselbe Variable "bekomme", ist die Rückgabe nicht der Wert, der gesetzt wurde. Ist das gängiges Verhalten? Ich werde versuchen, dieses Verhalten mit einer anderen FMU zu wiederholen, war aber neugierig, ob Sie einen Einblick geben könnten. –

+1

Ich würde empfehlen, sich die Standardspezifikation (https://www.fmi-standard.org/downloads) anzuschauen und sich dort die Methode do_step anzuschauen. Beachten Sie auch, dass es die Version 1.0 und die Version 2.0 des Standards gibt. Sie müssen also prüfen, welcher Version Ihre FMU folgt. In Bezug auf das Verhalten mit set/get entspricht es dem Standard, dass die Werte nur dann aktualisiert werden, wenn ein Aufruf der do_step-Methode erfolgt ist. –

Antwort

1

Späte Antwort, aber im Fall, dass es von anderen ...

Sie können in der Tat stellen die Simulation in einer Schleife, die Sie gerade abgeholt Sie müssen den Status Ihres Systems im Auge behalten, damit Sie es bei jeder Iteration neu initiieren können. Betrachten Sie das folgende Beispiel:

Ts = 100 
x_k = x_0 

for k in range(100): 
    # Do whatever you need to get your input here 
    u_k = ... 

    FMU.reset() 
    FMU.set(x_k.keys(), x_k.values()) 

    sim_res = FMU.simulate(
     start_time=k*Ts, 
     final_time=(k+1)*Ts, 
     input=u_k 
    ) 

    x_k = get_state(sim_res) 

Nun, ich geschrieben habe eine kleine Funktion, um den Zustand zu packen, x_k, des Systems:

# Get state names and their values at given index 
def get_state(fmu, results, index): 
    # Identify states as variables with a _start_ value 
    identifier = "_start_" 
    keys = fmu.get_model_variables(filter=identifier + "*").keys() 
    # Now, loop through all states, get their value and put it in x 
    x = {} 
    for name in keys: 
     x[name] = results[name[len(identifier):]][index] 
    # Return state 
    return x 

Dies beruht auf Einstellung "state_initial_equations": True Kompilierung Option.

+0

Hallo Joakim, sehr interessante Antwort. Ich kann definitiv eine Menge Nützlichkeit für diesen Code sehen. Ich fand jedoch heraus, dass es einen eingebauten Funktionsaufruf 'do_step' gibt, der in einer ähnlichen Methode iteriert. Ich sehe jedoch, dass Ihr Code in anderen Situationen einzigartig und potenziell leistungsfähiger ist. –

+0

Es ist sehr praktisch, da es möglicherweise auch den Zustand in einer Schleife ändern kann. Eine weitere Möglichkeit ist die Verwendung der ME2-Methoden 'get_fmu_state()' und 'set_fmu_state()'. Siehe: http://www.jmodelica.org/assimulo_home/pyfmi_1.0/pyfmi.html#pyfmi.fmi.FMUModelBase2.get_fmu_state –