2016-06-15 11 views
1

Ich habe eine Klasse mit einem Port der Dimensionen [x, y], der mit einer anderen Klasse verbunden ist, die einen passenden Port hat. Nun möchte ich diesen Variablen [x, y] durch einen externen Funktionsaufruf, in dem ich grundsätzlich eine .xml-Datei lese und Werte für x und y erhalte, einen Wert liefern. Aber Dymola gibt einen Fehler, da es während der Kompilierung als Array mit nicht fester Größe ausgegeben wird.Wie umgehen Array mit Komponenten mit festen Größenfehler?

Screenshot des Fehlers ist beigefügt.

Antwort

3

Die Array-Größen sind strukturelle Parameter und sie können normalerweise nicht von externen Funktionsaufrufen abhängen, da sie zur Kompilierungszeit bekannt sein sollten. Dies wird jedoch beispielsweise in OpenModelica unterstützt, wo eine DLL der externen Funktion erstellt und aufgerufen wird und die Ergebnisse während der Modellkompilierung abgerufen werden.

Die einzige Möglichkeit, dies in allen Tools zu unterstützen, besteht darin, das Modell mithilfe eines externen Tools zu generieren, das das XML liest und die MO-Datei mit den gelesenen Werten ändert. Man könnte wahrscheinlich so etwas wie Parameters.mo hat:

package Parameters 
    constant Integer nTube = <EXTERN_NTUBE>; 
    constant Integer nSeg = <EXTERN_NSEG>; 
end Parameters; 

und externes Tool wird die XML und bindet und in Parameters.mo lesen, die Sie dann in Ihren Modellen über Parameters.nTube und Parameters.nSeg verwenden. Vielleicht wäre es gut, einige Ausfälle zu geben, damit es funktioniert direkt diese Datei zu verwenden:

package Parameters 
    constant Integer nTube = 1; 
    constant Integer nSeg = 2; 
end Parameters; 

und dann Ihr externes Tool 1 und 2 mit den benötigten Werten vor der Kompilierung ersetzen.

+0

Vielen Dank für Ihre Antwort. Ich benutze Dymola und könnte näher erläutern, wie Ergebnisse während der Modellerstellung von der externen Funktion abgerufen werden können? –

+0

Es hängt stark vom Werkzeug ab, jedes Werkzeug macht es, soweit ich weiß, anders. –

3

Dies sollte in Dymola 2017 verbessert werden (ohne Modelica-Code ändern zu müssen). In früheren Versionen von Dymola sollte es funktionieren, wenn man die C-Funktionen übersetzt, um nTube und nSeg zu berechnen.

Wenn das nicht hilft, wird Ihr vollständiger Code benötigt, um das Problem zu analysieren.

+0

Meinst du es funktioniert, wenn Sie eine C-Bibliothek aus den Funktionen erstellen? Oder Sie meinen, Sie müssen die C-Funktionen in Modelica-Funktionen übersetzen? –

+0

Danke für die Info. Ich werde Dymola 2017 installieren und es versuchen. Könnten Sie auch erläutern, was Sie meinen, indem Sie die C-Funktion übersetzen? Ich übersetze das ganze Modell vor dem Laufen. –

+0

Ich meine damit, die Modelica-Funktionen, die die C-Funktionen umhüllen, direkt zu übersetzen, bevor ich das Modell mit ihnen umsetze. Wählen Sie einfach "translate" für diese Funktionen in der gleichen Weise wie beim Übersetzen eines Modells (Übersetzen, nicht simulieren). –