Allgemein

LeSim ist ein Simulator für Leistungselektronik ( Leistungselektronik Simulator)

Der Simulator hat jetzt alle wesentlichen Bibliotheksbausteine: OR@20170304

Der Simulator wird ständig erweitert: OR@20190607

Der Simulator ist ein sogenannter "mixed-mode Simulator". Es können gleichzeitig leistungselektronische Schaltungen sowie die dazugehörige Regelung simuliert werden. Dies geschieht alles auf der Browserseite mithilfe von Javascript. Je nach Umfang des Simulationsmodelles darf der Prozessor durchaus etwas mehr Rechenleistung bieten.

Als Browser empfehle ich den Edge, Chrome/Chromium oder Firefox. Der Microsoft Internet Explorer wird nicht unterstützt (zu buggy und zu langsam). Als schnellster Browser hat sich bei mir (Stand Juni 2016) der Microsoft Edge empfohlen. Die Entwicklung des Simulator erfolgt aber unter dem Chrome.

Beispiele:

Motivation:

Da mich meine bisher genutzten Simulatoren enttäuscht haben, habe ich mich entschlossen einen Simulator selber zu schreiben.

Dieser Simulator legt Wert darauf dass:

Elektro-Mathematisches

Der Netzwerksimulator beruht auf einer Knotenpotentialanalyse. Das implizite Euler-Verfahren wird als Integrationsverfahren verwendet. Eine Schrittweitensteuerung findet nur bei Schaltvorgängen statt, eine toleranzabhängige Schrittweitensteuerung erfolgt nicht.

Knotenpotentialanalyse:
Jedes Netzwerkelement ist mit zwei oder mehreren Knotenpunkten verbunden. Hierbei berechnet jedes Netzwerkelement anhand von gegebenen Knotenspannungen die Ströme in den Knoten zum neuen Zeitschritt aus.
Die Aufgabe des Gleichungslösers ist es jetzt, die Knotenspannungen so zu wählen, dass die Summe der Knotenströme null ist.
Es entsteht also zu jedem Zeitpunkt eine Gleichung: IKnoten[1..k] = f( VKnoten[1..k] , Zustaende )
Jedes einzelne Netzwerkelement rechnet also seine eigenen Knotenströme anhand der gegebenen Knotenspannungen unter zuhilfenahme eventueller gespeicherter Zusstände aus und addiert dies Ströme zum Gesamtknotenstrom hinzu.
Es entsteht mathematisch gesprochen also eine Matrixgleichung: r = A*x - b, wobei r die Summe der Knotenströme, x die Knotenspannungen, A die Leitwerte und b die gespeichterten Zustände sind. Das besondere an diesem Simulator ist aber das die Werte für A und b nur implizit vorliegen, also ein direkter Zugriff nicht möglich ist.

Beispiel zur Berechnung eines Widerstandes:


        StepCalc: function() { 
          this.V1 = this.Connectors[0].Knoten.Spannung 
                  - this.Connectors[1].Knoten.Spannung;
          this.I1 = this.V1 / this.p_rx; 
          this.Connectors[0].Knoten.StromSum += -this.I1;
          this.Connectors[1].Knoten.StromSum += +this.I1; 
          },
      

Beispiel zur Berechnung einer Induktivität:


        StepCalc: function(arg) { 
          this.V1 = this.Connectors[0].Knoten.Spannung 
                  - this.Connectors[1].Knoten.Spannung;
          this.I1 = this.p_I0 + this.V1 / this.p_lx * arg.dt; 
          this.Connectors[0].Knoten.StromSum += -this.I1; 
          this.Connectors[1].Knoten.StromSum += +this.I1; 
          }, 
        StepFinished: function(arg) { 
          // neuen Integratorwert übernehmen 
          this.p_I0 = this.I1;
          },
      

Die Funktion StepCalc (von allen genutzten Elementen) wird vom Gleichungslöser immer wieder mit unterschiedlichen Knotenspannungen aufgerufen, bis die Summe der Knotenströme Null ist. Wenn dies erreicht ist, wird zum Abschluss die Funktion StepFinished aufgerufen. Hier kann dann der Intergationswert als neuer Startwert gesetzt werden.

Als Gleichungslöser wird GmRes eingesetzt. Als Fallback wird LU verwendet. Eine Übersicht der genutzten Matrizen findet man auf der Beispielseite zum Solver.

Bei jeder Simulation werden ausgewählte Matrizen serverseitig gespeichert damit diese nachträglich mit verschiedenen Gleichungslösern überprüft werden können.

Alle Parameter eines Simulationselementes fangen mit "p_" an. Diese Parameter können über die grafische Oberfläche gesetzt werden. Auch werden diese Parameter über json gesichert.

Simulation selber erstellen

Die Erstellung der Simulation erfolgt halbgrafisch. Die Simulation gliedert sich in 2 Teile:

Die einzelnen Elemente können grafisch platziert werden. Die Simulation selber muss von Hand über die Webseite geladen und gestartet werden. In dieser HTML-Datei werden dann auch die einzelnen Elemente und die Verbinder geladen.

Die Verbindungspunkte müssen nicht zwingend beschaltet werden. Dies ist zum Beispiel sinnvoll wenn eine dreiphasige Spannungsquelle nur zweiphasig genutzt werden soll.

Ebenso muss kein Bezugs / Erdpotential angegeben werden.

Beim Erstellen der Simulation müssen mindestens zwei Files erstellt werden:

Im index.html File wird das Layout, die Simulatorsteuerung und die graphische Ausgabe definiert. Das schematic.json File dient der Aufnahme der zu simulierenden Elemente und der Connectoren.

Ein Schematic kann durch Hinzufügen und Löschen von einzelnen Elementen verändert werden. Die einzelnen Eigenschaften der Elemente können geändert werden. Dazu befinden sich drei Steuerelemente an jedem Element (löschen, drehen, Eigenschaften). Zusätzlich kann durch anklicken und ziehen der Connectoren eine neue Verbindung geschaffen werden.

Damit die dabei geschaffene Simulation dauerhaft gespeichert werden kann, muss der komplette Inhalt des JSON Fenster in das schematic.json File kopiert werden.

Steuerungssimulator

Dieser Simulator arbeitet mit einer festen Schrittweite. Die Schrittweite muss/wird beim Simulatoraufruf übergeben werden.

Die Steuerungelemente werden in genau der Abarbeitungsreihenfolge abgearbeitet, wie sie in den Simulator geladen wurden. Die Reihenfolge im Schematic.json file ist also nicht variabel, sondern muss die gewünschte Abarbeitungsreihenfolge abbilden.


      CtrlStep: function(arg) { 
        var Blocks = arg.Blocks; 
        var t = arg.t1; 
        var dt = arg.dt;
      ...
    

Jeder Steuerungsblock verfügt über eine Routine mit dem Namen "CtrlStep". Diese Funktion wird zyklisch vom Simulator ausgeführt.

Netzsimulator

Dieser Simulator arbeitet mit einer variablen Schrittweite. Die minimale und maximale Schrittweite muss/wird beim Simulatoraufruf übergeben werden. Der Simulator startet immer mit der maximalen Schrittweite. Meldet ein Netzwerkelement einen Schaltvorgang wird der aktuelle Rechenschritt verworfen und die Schrittweite habliert. Dann wird neu gerechnet. Ein Rechenschritt ist erst dann gültig, wenn:

Die Schrittweitensteuerung kann man gut am Beispiel für den Tiefsetsteller sehen. Mit der Maus kann in die einzelnen Schaltvorgänge reingezoomt werden.

Eine ideale Schrittweitensteuerung würde direkt vor und nach einem Schaltvorgang einen Berechnungspunkt setzen.

Wenn man den Zeitpunkt 0.7ms genau rauszoomt (zurück geht mit Doppelclick) kann man erkennen, dass der Simulator bei 0.0006998 und bei 0.0007007 einen Berechnungspunkt gesetzt hat. Der Simulator ist also auf die minimale Schrittweite von 1us gegangen.

.

Als Beispiel kann man hierzu gut die Diode nehmen. Ein Diode schaltet bei positiver Spannung ein und bei negativem Strom aus. Immer wenn ein Schaltvorgang ansteht, muss dies angemeldet werden, damit der Netzwerklöser die Schrittweite verkürzen kann. Ob die Diode schaltet oder nicht schaltet, wird erst nach der Lösung der Differentialgleichung klar. In der Funktion StepStart() darf also die Entschedungs für einen Zustandswechsel nicht fallen. Die richtige Funktion hirfür ist die Funktion StepCalc()


    StepStart: function(arg) {
    },
    StepCalc : function(arg) {
      ...
      // Diodenkommutierung?
      this.StateChange = false;
      this.t_leitend = this.leitend;
      if (!this.leitend && this.v > 0.7) {
        this.StateChange = true;
        this.t_leitend = true;
      }
      if (this.leitend && this.i < -0.1) {
        this.StateChange = true;
        this.t_leitend = false;
      }
    },
    

Hier wird entsprechend die Kommutierungnotwendigkeit überprüft und die Variable this.StateChange gesetzt. Diese Variable wird vom Simulator überpüft und zur Schrittweitensteuerung verwendet. Dabei wird die Schrittweite solange verringert, bis entweder kein Zustandwechsel angemeldet wird, oder die minimale Schrittweite erreicht ist.

Zu beachten ist, das der Zustand selber in der Funktion StepCalc() nicht geänder werden darf. Die Funktion StepCalc() wird vom Differentialgleichungslöser sehr oft aufgerufen um den aktuellen Arbeitspunkt zu iterieren. Die Abhängigkeiten innerhalt der Funktion StepCalc() müssen immer linear sein.

Erst wenn der Differentiallöser fertig ist und die Schrittweitensteuerung auch, dann ist der Zeitschritt beendet.


        makeStateChange: function(arg) {
          this.leitend = this.t_leitend;
        },
     

Simulatoraufruf


      LeSim.start( { dtmax:200e-6, dtmin:10e-6, dtCtrl:1e-3, deltaTEnd:tEnd } );
    

Hierbei bezeichnet

Download

Die Simulationsbibliothek ist is Javascript geschrieben. Es müssen mehrere Bibliotheken eingebunden werden. Achtung: ich erweitere sowohl die Simulatormathematik als auch die Bibliotheken öfter.

eigene Bibliotheken