2017-02-17 4 views
4

Ich habe eine Anwendung, wo ich Dymola als Entwicklungsumgebung benutze, aber Modelle in FMU-Form exportieren werde, um in einer anderen Anwendung verwendet zu werden. Die Systeme, die ich modelliere, haben austauschbare Komponenten, so dass sie sich hervorragend zum Modellieren in Modelica eignen. Aber ich bin mir nicht sicher, ob ich diese Fähigkeit nutzen kann, wenn ich die Modelle in FMU-Form exportieren möchte.Ist es möglich, eine "bedingte" FMU mit Modelica zu erstellen?

Betrachten Sie das sehr einfache Paket unten. Das Ziel des Pakets besteht darin, zwei sehr einfache Modelle zu definieren und es dem Benutzer zu ermöglichen, bei der Ausführung des Modells zwischen den möglichen Modellen zu wählen. Während dies innerhalb einer Modelica-IDE leicht möglich ist, benötige ich ähnliche Fähigkeiten innerhalb einer FMU.

Das Teilmodell definiert ein Modell mit y = p0 + p1 * x. Die beiden erweiterten Modelle weisen den Parametern p0 und p1 einfach unterschiedliche Werte zu. Schließlich fügt das TestModel einen Parameter namens modelIndex hinzu, der in bedingten Ausdrücken verwendet wird, die die zwei möglichen Modelltypen definieren. In Dymola funktioniert das großartig, da der Benutzer den Wert des Parameters modelIndex einfach einstellen kann. Ich versuche herauszufinden, ob es möglich ist, dies über eine FMU zu erreichen, indem ich ModelIndex eine Eingabe an die FMU mache. Die Kompilierung schlägt jedoch fehl, wenn ich die Annotation Evaluate = false für die Variable modelIndex einstelle. Der angegebene Fehler ist: "Die aktuelle Version des Modelica-Übersetzers kann nur bedingte Komponenten mit einer festen Bedingung verarbeiten .... Alle Variablen, die für die bedingte Deklaration verwendet werden, müssen als Konstanten oder Parameter deklariert werden."

Wenn jemand helfen kann, Anleitungen zum Erstellen einer bedingten FMU zu geben, wird dies sehr geschätzt. Dieses einfache Beispiel dient nur zur Veranschaulichung des Problems. Das wahre System, das modelliert wird, hat 4-5 primäre Komponenten, von denen jede mehr als 5 mögliche unterschiedliche Modelle hat, was zu einer großen Menge möglicher Permutationen führt. Einfaches Batch-Exportieren aller Konfigurationen ist wahrscheinlich nicht möglich.

Danke! Justin

package ConfigurableModel 
    "Package to test whether or not models can be configured by external inputs" 
    partial model partialModel 
    "Partial model used to control selectable options in Dymola" 

    Modelica.Blocks.Interfaces.RealInput x(start = 1) "input value"; 
    Modelica.Blocks.Interfaces.RealOutput y "output value"; 

    parameter Real p0 = 0; 
    parameter Real p1 = 0; 

    equation 
    y = p0 + p1*x; 
     annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
     coordinateSystem(preserveAspectRatio=false))); 
    end partialModel; 

    model linearModel_NoOffset "Linear model with no offset" 
    extends partialModel(p0 = 0, p1 = 1); 
    end linearModel_NoOffset; 

    model linearModel_Offset "Linear model with offset" 
    extends partialModel(p0=1, p1=1); 
    end linearModel_Offset; 

    model TestModel "Model to test configurability" 
    // parameter Integer modelIndex = 2 "1 = linear_NoOffset, 2 = linear_Offset" annotation(Evaluate=false); 

    parameter Integer modelIndex = 2 "1 = linear_NoOffset, 2 = linear_Offset"; 

    // Conditional instances, only one model is created based upon value of modelIndex 
    linearModel_NoOffset linear_NoOffset if modelIndex == 1; 
    linearModel_Offset linear_Offset if modelIndex == 2; 

    // Input and output blocks 
    Modelica.Blocks.Sources.Constant xMaster(k=1) annotation (Placement(transformation(extent={{-100,-10},{-80,10}}))); 
    Modelica.Blocks.Interfaces.RealOutput yMaster annotation (Placement(transformation(extent={{100,-10},{120,10}}))); 

    equation 
    // Note that only the connections for the components that exist will be used 

    // Connect input to each model instance 
    connect(xMaster.y, linear_NoOffset.x); 
    connect(xMaster.y, linear_Offset.x); 

    // Connect output to each model instance 
    connect(yMaster, linear_NoOffset.y); 
    connect(yMaster, linear_Offset.y); 

     annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
     coordinateSystem(preserveAspectRatio=false))); 
    end TestModel; 
    annotation (uses(Modelica(version="3.2.1"))); 
end ConfigurableModel; 

Antwort

2

Zu meinem Verständnis ist dies möglich, nicht direkt mit FMI. Die objektorientierten Merkmale von Modelica, wie die bedingte Instanziierung, werden bei der symbolischen Verarbeitung von Modelica behandelt, bevor der C-Code erzeugt wird, der Teil einer FMU ist (als C-Code oder in kompilierter Form). Durch die bedingte Instanziierung können viele Eigenschaften der exportierten FMUs geändert werden (z. B. mit unterschiedlichen Anzahlen von Zuständen). Sie können also keine einzige Datei modeldescription.xml in der FMU haben, die die Eigenschaften einer FMU beschreibt. Sie könnten Ihr Modell in mehrere FMUs aufteilen und sich mit der Variabilität von Subsystemen auseinandersetzen, indem Sie einige austauschen. Dies kann jedoch zu einer komplizierteren numerischen Aufgabe als beim ursprünglichen Modelica-Gesamtmodell führen, da keine Optimierung des Gesamtmodells wie beim Modelica-Compiler im Gesamtmodell durchgeführt werden kann. Ein Vorteil in Ihrem Beispiel ist, dass Ihr Teilmodell bereits kausale Interfaces hat (RealInput und RealOutput). Ein Workaround, der Ihrer beabsichtigten Lösung nahekommt, könnte sein, dass Sie die Submodelle linear_NoOffset und linear_Offset mit einschließen (ohne "if modelIndex == xy ") Fügen Sie in Ihrem Modell Schalter ein, die vom modelIndex ausgelöst werden, um zwischen den Signalen zu und von den beiden Untermodellen zu wechseln. Dies kann zu einem gewissen Rechenaufwand führen, da beide Teilmodelle vorhanden sind und ausgewertet werden.

+0

Christian, danke für die Antwort. Leider ist deine Antwort das, was ich erwartet habe. Wenn jemand Alternativen kennt, würde ich mich über Feedback freuen. Ich erwäge die folgenden: 1. Export mehr FMUs für jede erforderliche Permutation der Unterkomponenten. 2. Parametrieren Sie jede der Unterkomponenten so, dass sie mit derselben Struktur, aber nur unterschiedlichen Werten von Parametern angegeben werden können. Leider ist die Einbeziehung mehrerer Untermodelle wahrscheinlich eine zu hohe Strafe für meine echten Systeme, da die Modelle viel komplexer sind als der einfache Beispielfall. Danke, Justin –

2

Ihr Problem hört sich so an, als ob es mit dem Ansatz Elmqvist (2014) gelöst werden könnte, obwohl ich seitdem nicht viel mehr über das Thema gehört habe. Ich bin mir nicht sicher, ob Dymola ein automatischer Ansatz hinzugefügt wurde, aber Sie könnten versuchen, Modelle explizit zu wechseln.

+0

Vielen Dank für diese Referenz. Ich habe das Papier überprüft und stimme zu, dass es in meinem Fall nützlich wäre. Ich habe Hilding Elmqvist und dem technischen Support von Dymola Fragen dazu gestellt, welche Features seit der Veröffentlichung des Papiers implementiert wurden. Ich werde auf der Grundlage ihrer Rückmeldungen aktualisierte Kommentare bereitstellen. –

+0

Der technische Support von Dymola hat erklärt, dass die in Elmqvist (2014) beschriebenen Funktionen bisher nicht in Dymola integriert wurden und nicht im Plan für Dymola 2018 enthalten sind. Aber sie untersuchen weiterhin, ob sie einen Workaround finden können. –

Verwandte Themen