Modelica - Equation, Algorith und Abtastzeit

Modelica - Equation, Algorith und Abtastzeit

Inhalt


Topic:.Mdlc.AlgEqu.

Modelica unterscheidet in der textuellen Syntax zwischen algorithm und equation.


1 Physikalisch: 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.


2 Ansteuerung des Pendels

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.


3 Abarbeitung als Automatisierungssteuerung: algorithm

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.


4 Wann algorithm und wann equation, kann man mischen?

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.


5 Download-Example

Topic:.Mdlc.AlgEqu..

../Download klappt als File-Directory auf, dort pendel_2019.....zip entpacken und in OpenModelica laden.