FMI Export: Fehlende Zeitableitung eines Eingangs beim Code-Export
Verwendet der SimulationX-Nutzer Eingänge von Blöcken als Eingänge der exportierten FMU, von denen eine Zeitableitung berechnet wird, so erscheint bei der Codegenerierung folgende Fehlermeldung (Beispiel SignalBlocks.Sources.Hysterese2 in MOdell, Export mit hysteresis2.x als Eingang und hysteresis2.y als Ausgang):
Fehler (Code-Export): Während der Modellanalyse sind Fehler aufgetreten. (-2)
Fehler (Modellanalyse): Fehler In Modell: Von der Variablen characteristic.x, die als Modelleingang definiert wurde, wird eine Zeitableitung benötigt. Diese kann numerisch nicht berechnet werden. Bitte definieren Sie einen zusätzlichen Eingang für die Ableitung. Modell2 - 2 Fehler, 0 Warnung(en), 0 Information(en)
In Klartext bedeutet das beispielsweise:
Kommt das Signal jedoch, wie beim Code-Export generell der Fall, von außen, so kann diese Ableitung nicht berechnet werden, weil Differentialgleichungslöser nur integrieren können. Numerische Differentiation ist zu ungenau und führt zu Instabilitäten. Die Zeitableitung muss also ebenfalls von außen bereit gestellt werden oder näherungsweise im Modell berechnet werden.
Es gibt jetzt verschiedene Möglichkeiten, diesem Problem zu begegnen:
Fehler (Code-Export): Während der Modellanalyse sind Fehler aufgetreten. (-2)
Fehler (Modellanalyse): Fehler In Modell: Von der Variablen characteristic.x, die als Modelleingang definiert wurde, wird eine Zeitableitung benötigt. Diese kann numerisch nicht berechnet werden. Bitte definieren Sie einen zusätzlichen Eingang für die Ableitung. Modell2 - 2 Fehler, 0 Warnung(en), 0 Information(en)
In Klartext bedeutet das beispielsweise:
- Ist der Eingang z.B. ein Wegsignal, so wird im Gleichungssystem zusätzlich die Geschwindigkeit verwendet
- Ist der Eingang eine Funktion wie , dann bildet die GSA die symbolische Ableitung
Kommt das Signal jedoch, wie beim Code-Export generell der Fall, von außen, so kann diese Ableitung nicht berechnet werden, weil Differentialgleichungslöser nur integrieren können. Numerische Differentiation ist zu ungenau und führt zu Instabilitäten. Die Zeitableitung muss also ebenfalls von außen bereit gestellt werden oder näherungsweise im Modell berechnet werden.
Es gibt jetzt verschiedene Möglichkeiten, diesem Problem zu begegnen:
- Verwendung eines PT1-Glieds: Dem Eingang kann ein PT1-Glied (SignalBlocks.Linear.PT1) vorgeschaltet werden. Hier müssen die Zeitkonstanten derart gewählt werden, dass die zeitliche Verzögerung oder Glättung das Modellverhalten nicht zu stark beeinflusst.
- Verwendung der Funktion General.Functions.Math.DefOneDerivative im Block uDot: Diese Möglichkeit erlaubt sowohl das Vorgeben der Zeitableitung, als auch das robuste Berechnen der Zeitableitung mit nur dem Eingang (oder einem äquivalenten Eingang). Der Block uDot beinhaltet folgenden Modelica-Code und kann direkt dem Modell hinzugefügt werden:
- Der Block uDot kann direkt vor den zu exportierenden Typen geschaltet werden. Damit werden sowohl der Signaleingang, als auch die Zeitableitung des Signaleingangs als FMU-Inputs verwendet
- Der Block uDot wird vorgeschaltet. Weiterhin wird ein Funktionsblock f1 mit f1.F := self.x ins Modell gelegt. Der Ausgang f1.y wird direkt auf den Eingang uDot.u gelegt. Weiterhin wird ein DT1-Block dT1 (SignalBlocks.Linear.DT1) instanziiert und nach unten stehender Tabelle parametriert.
Am Eingang dT1.x liegt f1.y an, der Ausgang dT1.y wird auf uDot1.udot gelegt. Mit dieser Variante ist es möglich, nur den Eingang f1.x beim Code-Export nach außen zu gegeben; die Ableitung wird intern berechnet.
Auch hier kommt es aufgrund der leicht zeitlich verzögerten Berechnung der Ableitung zu kleinen Veränderungen des Modellverhaltens, die sich jedoch mit Anpassung der Zeitkonstanten weitestgehend minimieren lassen.
Files | ||
---|---|---|
DataImage26.png resend |
||
DataImage46.png resend |
||
DataImage56.png resend |
||
DataImage73.png resend |
||
DataImage73.png resend |
||
DataImage78.png resend |
||
DataImage90.png resend |