2016-07-22 12 views
1

Ich habe eine parameter, die immer aus anderen Parametern berechnet wird, und muss public sein, so dass es von anderen Komponentenmodellen in meinem Projekt verwendet werden kann. Grundsätzlich ist es ein globalparameter in einem Objekt sehr ähnlich dem Objekt TIL.SystemInformationManager.Ausblenden (Unterdrücken) Globale öffentliche Parameter-Dialogfeld (Modelica Dymola)

Da es berechnet wird, ist es sinnlos, es in einem Dialogfeld anzuzeigen; und die Verwendung von annotation(dialog(enable=false)) kann zu Verwirrung und Frustration führen, weil der Benutzer es immer aus keinem guten Grund deaktiviert sieht.

Weil es public sein muss, kann ich das Schlüsselwort protected nicht verwenden.

Es kann nicht final sein, weil es vom Modell eingestellt wird, das es verwendet.

Zuletzt muss es eine parameter sein, und keine Variable, weil ich es verwende, um ein Array zu dimensionieren.

Hier ist das Modell. Die Idee ist, dass in sim2 Sie den Anschlusstyp ct gesetzt, die dann n des Arrays der Größe berechnet myArray, die in allen Verbinderkomponenten verwendet:

package VerySimpleSIM 

    model Sim2 

    parameter Integer ct = 0 "Connector type"; 
    final parameter Integer n = if (ct > 0) then 2 else 0; 

    end Sim2; 

    connector MyConnector "Connector with array size set by global parameter n" 

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    //This parameter is always set by the component using the connector, 
    //so I don't want to show it in any dialog box. 
    parameter Integer n; 
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

    Real myArray[n]; 

    end MyConnector; 

    model Creator 

    protected 
    outer Sim2 sim2 "System information manager"; 

    public 
    MyConnector cnctrB(final n=sim2.n) annotation (Placement(transformation(extent={{80,-10},{100,10}}))); 

    equation 
    //Create arbitrary values for testing: time + 0.1 * {1,2,...,n} 
    cnctrB.myArray = {time + 0.1 * i for i in 1:sim2.n}; 
    end Creator; 

    model Changer 

    protected 
    outer Sim2 sim2 "System information manager"; 

    public 
    MyConnector cnctrA(final n=sim2.n) annotation (Placement(transformation(extent={{-100,-10},{-80,10}}))); 
    MyConnector cnctrB(final n=sim2.n) annotation (Placement(transformation(extent={{80,-10},{100,10}}))); 

    equation 
    //Output = sin(2 * pi * input) 
    cnctrB.myArray = Modelica.Math.sin(2 * Modelica.Constants.pi .* cnctrA.myArray); 
    end Changer; 

    model TestSim2 

    inner Sim2 sim2(ct=1) annotation (Placement(transformation(extent={{20,20},{40,40}}))); 

    Changer changer annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); 
    Creator creator annotation (Placement(transformation(extent={{-40,-10},{-20,10}}))); 
    equation 
    connect(creator.cnctrB, changer.cnctrA) annotation (Line(points={{-21,0},{-9,0}})); 
    annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(coordinateSystem(preserveAspectRatio=false))); 
    end TestSim2; 
end VerySimpleSIM; 

Antwort

0

Verwenden annotation(dialog(connectorSizing=true)) in einem Dialogfeld zeigt einen Parameter zu unterdrücken. Zum Beispiel die Zeile, die liest,

parameter Integer n; 

zu lesen,

parameter Integer n annotation(dialog(connectorSizing=true)); 
+4

Nach der Modelica-Spezifikation 'connectorSizing' hat nichts mit dem Versteck der Ergebnisse zu tun. Nur um klar zu sein, 'connectorSizing' kann nur für' Integer' Typen verwendet werden. Selbst wenn dies in einigen nicht standardmäßigen folgenden Tools verwendet werden könnte, würde es im Allgemeinen nicht funktionieren. Auch ein kleiner Tippfehler, die Anmerkung ist 'Dialog' (Modelica ist case sensitive). –

+0

@Dietmar 1. In der Tat, meine Frage "hat nichts mit dem Verstecken von Ergebnissen zu tun". Sehen Sie sich die Frage noch einmal an. 2. Hast du das in Dymola probiert? Ich habe gerade alle acht Kombinationen von 'Integer' /' Real' 'Dialog' /' dialog' und 'true' /' false' getestet. Das einzige, was Dymola in Bezug auf die Anzeige des 'Parameters' in der Dialogbox ** interessierte, war 'wahr'/'falsch'. Ich habe Dymola Version 2016 FD01 (32-Bit), 2015-10.13. Welche Version verwendest du? Wenn das alles stimmt und du mich abgelehnt hast, würdest du darüber nachdenken, es zu entfernen? –

3

Sie zeigen/ausblenden, um einen Parameter, um die public und protected Schlüsselwörter wie im folgenden Beispiel gezeigt:

model protectedParameter 
    parameter Real p1=1 "Visible parameter"; 
    parameter Real p2=3.14 "another visible parameter"; 
protected 
    parameter Real derivedParameter=p1+p2+p3 "Hidden (protected) parameter"; 
public 
    parameter Real p3=2.71 "yet another visible parameter"; 
equation 
    // equations from here on 
    ... 
end protectedParameter; 

Alternativ können Sie das Schlüsselwort final vor die Parameterdeklaration stellen, und Dymola wird es zumindest vor den Dialogen verbergen.

Mit freundlichen Grüßen, Rene Gerade Nielsen

+0

Danke für die Antwort. Mein Problem war, dass ich diesen Parameter übergeben musste, um Arrays in anderen Modellen zu dimensionieren, also musste es "public" sein. Wenn mir noch etwas fehlt (was * höchst * wahrscheinlich ist), lass es mich wissen. Wenn nicht, dann sollte ich meine Frage klären. –