2016-08-29 3 views
2

Salut Modelica Communauté,Pause JModelica et Passe Entrées incrémentielles lors de la simulation

Je voudrais lancer deux modèles en parallèle JModelica mais je ne suis pas sûr de savoir comment passer des variables entre les modèles. Un modèle est un modèle python et l'autre est un modèle EnergyPlusToFMU.

Les exemples de la documentation JModelica contiennent les entrées de période de simulation complètes définies avant la simulation du modèle. Je ne comprends pas comment on pourrait configurer un modèle qui fait une pause pour les entrées, ce qui est une caractéristique clé des UFA et de la co-simulation.

Quelqu'un peut-il me fournir un exemple ou un morceau de code qui montre comment cela pourrait être implémenté dans JModelica? Est-ce que je mets la commande de simulation dans une boucle? Si oui, comment puis-je gérer les périodes d'échauffement et l'initialisation sans perdre de données au cours des périodes précédentes?

Merci pour votre temps,

Justin

+1

Voulez-vous effectuer une simulation où chaque modèle est exécuté dans un processus distinct ou est-ce qu'il est acceptable qu'ils soient exécutés dans le processus et échangent simplement des informations entre eux? Avez-vous envisagé d'utiliser simplement la méthode do_step sur la FMU de co-simulation? –

+0

Salut @ChristianAndersson, merci de votre confiance. Je crois que do_step est peut-être ce que je cherche. J'ai utilisé l'aide (do_step) pour obtenir des informations mais je ne connaissais pas cette commande, y at-il quelque part où je peux obtenir de la documentation supplémentaire sur ces commandes? De plus, je remarque l'ensemble et obtenir des variables à agir étrangement. Quand je "mets" une variable, je remarque le changement dans les résultats de l'UFA mais quand j'obtiens la même variable, le retour n'est pas la valeur qui a été définie. Est-ce un comportement commun? Je vais essayer de répéter ce comportement avec une autre UFA mais j'étais curieux de savoir si vous pouviez donner un aperçu. –

+1

Je vous recommande d'examiner la spécification standard (https://www.fmi-standard.org/downloads) et d'y regarder la méthode do_step. Notez également qu'il existe des versions 1.0 et 2.0 de la norme, vous devrez donc vérifier quelle version suit votre FMU. En ce qui concerne le comportement avec set/get, c'est selon la norme, les valeurs ne seront pas mises à jour sauf si un appel à la méthode do_step a été fait. –

Répondre

1

réponse tardive, mais dans le cas où il est repris par d'autres ...

Vous pouvez en effet mettre la simulation en boucle, vous venez besoin de garder une trace de l'état de votre système, de sorte que vous pouvez le ré-initier à chaque itération. Prenons l'exemple suivant:

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) 

Maintenant, j'ai écrit une petite fonction pour saisir l'état, x_k, du système:

# 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 

Cela repose sur la configuration "state_initial_equations": True option de compilation.

+0

Salut Joakim, réponse très intéressante. Je peux certainement voir beaucoup d'utilité pour ce code. Cependant, j'ai découvert qu'il y a un appel de fonction intégré 'do_step' qui itère dans une méthode similaire. Cependant, je considère que votre code est unique et potentiellement plus puissant dans d'autres situations. –

+0

C'est très pratique, car cela permet potentiellement de modifier l'état d'une boucle. Une autre possibilité consiste à utiliser les méthodes ME2: 'get_fmu_state()' et 'set_fmu_state()'. Voir: http://www.jmodelica.org/assimulo_home/pyfmi_1.0/pyfmi.html#pyfmi.fmi.FMUModelBase2.get_fmu_state –