Inhalt
Topic:.Mdlc.AlgEqu.
Modelica unterscheidet in der textuellen Syntax zwischen algorithm und equation.
Topic:.Mdlc.AlgEqu..
Die Equation ist die eigentlich geeignete Form für eine physikalische Simulation. Es wird ein Zusammenhang als Gleichung, häufig als Differenzialgleichung beschrieben. Die numerische Lösung der Differenzialgleichung über die Zeit liefert dann das Systemverhalten. Das sei am einfachen Beispiel eines Uhrenpendel dargestellt:
equation der(v) = f / m; f = -m * g * sin(angle); der(angle) = v / l;
Die Ableitung der Geschwindigkeit des Pendels der(v)
(der = derivation) ist proportional zur Kraft f
, die Masse m
muss beschleunigt werden..
Die Kraft ist proportional zur Auslenkung angle
, hier tritt wieder die Masse m
und die Länge des Pendels l
in Erscheinung.
Der Winkel, die Auslenkung angle
ergibt sich aus der Geschwindigkeit, die Ableitung des Winkels der(angle)
ist die gleich der Winkelgeschwindigkeit v
auf die Länge l
bezogen.
So die einfachen physikalischen Zusammenhänge. Die Masse kann man aus diesen einfachen Gleichungen herauskürzen. Die Lösung der Differenzialgleichung ist die Pendelbewegung. Das ist unabhängig von der Abtastzeit einer Simulation und um so besser, je feiner die Umsetzung der numerischen Lösung erfolgt. Denn: Die Simulation arbeitet letztlich mit einer numerischen Lösung. Doch dafür ist das Simulationssystem, die Modelica-Codegenerierung verantwortlich.
Man kann diese physikalischen Gleichungen wie gegeben in der Rohform eintippen. Man braucht sie nicht umzustellen, dast macht die Modelica-Codegenerierung. Es ist auch besser, die Gleichungen nicht umzustellen sondern nahe bei der Vorstellung zu bleiben. Lass Modelica die Masse herauskürzen! Denn: Die Physik muss gegebenenfalls noch verfeinert werden. Im downloadbaren Modell (Link am Ende) ist noch eine Reibung über die Geschwindigkeit berücksichtigt, sonst ist die Simulation unrealistisch. Damit schwingt das System wie in der Realität aus und es braucht zum Dauerschwingen eine Anregung. Diese ist im Folgekapitel beschrieben.
Der Kern des Text-code des gesamten FunctionBlock für das Pendel sieht wie folgt aus:
block pendel_FB "A pendulum as demo" extends Modelica.Blocks.Icons.Block; Modelica.Blocks.Interfaces.RealInput u "... Modelica.Blocks.Interfaces.RealOutput y "... parameter Real m = 0.1; //mass in kg parameter Real l = 0.249; //length in m: l = g/(pi*pi) * T*T/4 =~ 0.994 * T*T/4 parameter Real g = 9.81; //gravitation of earth parameter Real kf = 0.01; //newton per (m/s)*(m/s) for friction // Real v; //velocity of pendulum Real angle(start = 0.1); //The angle of pendulum; Real fg, ff; //The actual force in direction of pendulum equation der(v) = (fg - ff + u)/m; //newtons lore for accelaration, force and mass fg = (-m * g * sin(angle)); ff = sign(v) * kf * l * 2 * Modelica.Constants.pi * v*v; der(angle) = v / l; //derivation of angle, the angle velocity and the absolute velocity y = angle; annotation(...
Der Text enthält noch Grafikinformationen, die sich im Modelica-Editor ausblenden lassen und auch hier mit ...
dargestellt sind.
Bild: Sim-Parameter Mit diesem FunctionBlock allein lässt sich das abkingend schwingende Pendel simulieren und damit kontrollieren, ob die Gleichungen
der bekannten Physik entsprechen. Die Simulation, hier gewählt mit rechtsstehenden Parametern, liefert dann das darunterstehende
Bild:
Das ist eine rein physikalische Betrachtung ohne Beachtung der Tatsache, dass dies auf einem Rechner abargearbeitet werden soll.
Topic:.Mdlc.AlgEqu..
Das Narrativ zum Beispiel ist eine Uhr, die komplett fertig mit DCF77-Empfangsteil geliefert ist, und aus Retro-Design-Gründen mit einem Pendel komplettiert werden soll. Im Kleinleistungsprozessor zum Uhrwerk sind je ein Binärein- und ausgang frei, im 20 ms-Interrupt sind ist noch wenig Speicherplatz verfügbar. Mit diesen Ressourcen soll nun das Pendel zum Dauerschwingen angeregt werden.
Wenn in unserem Beispiel die Pendelbewegung im Nulldurchgang immer wieder einen kleinen Schubs bekommt, dann ist die Schwingung dauerhaft. Das ist bei einer mechanischen Uhr mit dem Schliff des Zahnrades am Anker des Pendel, das von einer Feder oder Gewichten angetrieben wird, im Grunde genommen genauso. Wir sparen aber das Geld für den Uhrmachermeister, der genau schleifen und justieren muss, und bauen eine billige Elektronik ein.
Der etwaige Nulldurchgang wird mit einem magnetischen Sensor detektiert.
Es wird ein Lagesensor angebracht, hinter der Verkleidung mit Hall-Sensor, der jeweils beim Nulldurchgang des Pendels einen binären kurzen Impuls abgibt. Damit kann die Synchronisation mit der Pendelbewegung erfolgen.
Als Antrieb wird ein Elektromagnet versteckt angebracht, der im Nulldurchgang mit einen 20 ms-Impuls eine kleine Kraftwirkung aufbringt. Mehr soll nicht vorgesehen werden.
Bild: Pendel-Modell Es wird jetzt ein grafisches Modell gebaut, dass neben dem Pendel-FunctionBlock diese beiden Stell- und Messglieder enthält,
und einen Block, der intern das Mikroprozessorprogramm enthalten soll, und zwar möglichst original.
impulsPower ist ein Modelica-Standard-FBlock mit Binäreingang und parametrierten Real-Ausgang, der die Umsetzung des binären Ausganges des Prozessors auf die Magnetkraft darstellen soll. posDetect ist ein einfacher Block, der die Winkellage im Bereich bewertet. pendel_Stimulator soll den Softwareinhalt im Mikroprozessor darstellen. Die kleinen nicht angeschlossenen Blöcke sind zur Beobachtung, für Skalierung.
Topic:.Mdlc.AlgEqu..
Wird nun eine Modellierung unmittelbar für eine Softwarelösung gesucht, dann kommt es darauf an. Häufig steht nicht die Physik
im Vordergund, sondern unmittelbar die Softwarelösung. Will man diese direkt wie in C(++) programmieren, dann sind physikalische
Gleichungen der falsche Ansatz. In der Software geht es immer um Zuweisungen (assignment statements). In C schreibt man nur
ein =
, meint aber die Zuweisung die in anderen Programmiersprachen auch deutlicher mit :=
notiert wird, so auch in Modelica.
Im Beispiel soll die Modellierung im FBlock pendel_Stimulator nahe am C-Code liegen. Es ist im Kern ein Zähler enthalten, der als 8-bit-Speicherplatz Zustand und Timing geschickt kombiniert enthält. Diese Lösung ist im Modelica-FBlock in Modelica-Language ausprogrammiert und kann manuell direkt in C umgesetzt werden. Die funktionalen Inhalte dieses Blocks sind:
block pendel_Stimulator_FB "Pendula stimuli" import Modelica.Blocks; import Modelica.Blocks.Interfaces; extends Modelica.Blocks.Icons.Block; Modelica.Blocks.Interfaces.BooleanInput zeroCrossing "... Modelica.Blocks.Interfaces.BooleanOutput impuls "... Modelica.Blocks.Interfaces.IntegerOutput cto "... Integer ct; parameter Integer ctRange = 5; //range where the ct is proper for impuls parameter Integer ctPeriod = 50; //period for ct adequat to step time and pendulum period algorithm when initial() then impuls := false; end when; when sample(0, 0.02) then if( not zeroCrossing and ct >=5) then //the end of the zerocrossing signal: ct := div(ct - ctRange, 2) //middle value of zeroCrossing width - ctPeriod + ctRange; //set to negativ value (-45) end if; // if(ct ==(ctPeriod + ctRange) and zeroCrossing) then ct := ctRange; //counter reset to start in positive range impuls := true; //impuls without knowledge of pendula position // elseif(ct <ctRange and ct > -ctRange and zeroCrossing) then ct := ctRange; //counter about 0, and zeroCrossing impuls := true; //synchronized impuls else impuls := false; end if; ct := ct +1; cto := ct; end when; annotation(..... end pendel_Stimulator_FB;
Dieser Block enthält keine equation
, dafür algorithm
. Die when
-Klauseln sind entscheidend:
when initial() then ... Initialisierungsfunktion when sample(0, 0.02) then ... 20 ms Abtastzeit
Hinweis: Der erste Parameter des sample(...)
ermöglicht eine Unterteilung einer Abtastscheibe, was bei untersetzten Abtastzeiten zur Verteilung der Rechenzeit nützlich
ist, hier aber nicht benutzt.
Der Algorithmus ist am Modell erarbeitet. Es ist ein wenig tricky: Wenn das Null-Lage-Signal zeroCrossing
dauerhaft ansteht, dann steht das Pendel oder es ist eine sehr kleine Bewegung. Dann liegt der Zähler im positiven Bereich
und liefert alle 50 Takte (= 1 sec) einen Kurzimpuls. Wenn das zeroCrossing
false wird, also das Pendel außerhalb der Ruhelage gerät, dann wird der Counter auf etwa -45 gesetzt, genauer getuned mit
dem aktuellen Zählerstand. Damit wird ein breiteres Null-Lage-Signal richtig behandelt. Erst wenn der Zähler dann den Bereich
von -5..5 erreicht, führt ein Null-Lage-Signal zur Ausgabe des Pendelimpulses. Die Null-Lage kommt zweimal, auch bei der Rückwärtsbewegung.
Ein Fehlimpuls wird damit unterdrückt, dass der Zähler ct
dann etwa bei -25 steht.
Man kann am Modell einige Bedingungen ausprobieren, insbesondere ein nicht genau abgestimmtes Pendel. Wegen der Synchronisation mit dem Nullimpuls schwingt dies mit seiner Eigenfrequenz im Bereich ca. +/- 10%. Wenn die Schwingung des Pendels zu groß wird (etwa 0.2 radiant = 10°), dann wird das Null-Lage-Signal schmaler als 20 ms und wird daher häufiger nicht mehr erkannt. Das ist so vorgesehen. Es gibt dann Schwingungen ohne Zusatzimpuls, bis die Pendelamplitude wieder abklingt. Das fällt für den Betrieb optisch kaum auf. Dieses Verhalten ergibt sich aufgrund der einfachen Hardware und ist vollkommen ausreichend.
Topic:.Mdlc.AlgEqu..
Die Antwort ist recht einfach:
Physikalisch zu modellierende Teile sollten mit equation
programmiert werden. Die grafische Zusammenschaltung von Blöcken mit equation
-Anteilen ist eine Gesamt-Equation.
Teile, die direkt für die Software realisiert werden, sollten direkt als algorithm
geschrieben werden, da dann die Simulation so arbeitet wie nachher die reale Welt im Prozessor. Es sei denn, man möchte eine
reale Welt im Prozessor abbilden, will daher im Prozessor eine angepasste Solver-Lösung entsprechend der Modelica-Codegenerierung
unterbringen und hat dafür die notwendigen Rechenzeitressourcen.
Es ist nicht zielführend, die Simulation erstmal mit Equation und beliebiger Abtastzeit in dem Blöcken auszuführen, die dann später in einer bestimmten Abtastzeit möglichst effektiv ablaufen sollen. Hier ist der Blick auf das Ziel besser als eine dann nicht praktizierte Theorie.
Will man als theoretische Vorarbeit untersuchen, wie genau eine einfache Lösung auf einen Prozessor den theoretischen Notwendigkeiten nahekommt, dann ist selbstverständlich beides in parallelen FunctionBlocks zum Vergleich angebracht.
Man kann mischen.
Topic:.Mdlc.AlgEqu..
../Download klappt als File-Directory auf, dort pendel_2019.....zip
entpacken und in OpenModelica laden.