Entwicklung einer Plattform zur modellbasierten Regelung auf Basis eines Einplatinencomputers und offenen Softwaretools #6 Neue X2C-Bibliothek für OpenAdaptronik

By:

Hallo Zusammen! Ich bin Ruo Yi. In den vorherigen Beiträgen wurde erwähnt, dass ein Nachteil von der offenen Software X2C die relativ kleine Blockbibliothek ist. Zur Implementierung aktiver Schwingungsdämpfung habe ich in der Masterarbeit ein paar neue Blöcke in X2C generiert und sie zu einer neuen Bibliothek „OpenAdaptronik“ (siehe Bild 1) zusammengefasst. In diesem Beitrag werde ich euch zuerst eine Übersicht über die neue Bibliothek geben und dann einige relevanten Blöcke detailliert beschreiben. Abschließend gebe ich euch den Links zum Herunterladen dieser Bibliothek und eine kurze Anleitung zur Installation neues Blocks in X2C.

Bild 1: Bibliothek OpenAdaptronik

Übersicht über die Bibliothek OpenAdaptronik

Die Bibliothek „OpenAdaptronik“ besitzt dreizehn Blöcke, mit den man Modelle für Identifikation der sekundären Strecke, breitbandige Feedforward-Regelung sowie schmalbandige Feedforward-Regelung aufbauen und implementieren kann. Die folgende ist eine zusammengefasst Beschreibung der generierten Blöcke:

  • PrbsGen: Der Block generiert ein Pseudorandom Binary Signal (PRBS) als Anregungssignal für Identifikation unbekannter Strecke. Dabei kann man je nach Bedarf die Amplitude, Offset, Signallänge und Taktzeit einstellen.
  • FIR_Filter: Der Block filtert das Eingangsignal mit einem spezifizierten digitalen FIR-Filter . Dabei kann man bis zu 500 Koeffizienten des FIR-Filters eingeben.
  • IIR_Filter: Der Block filtert das Eingangsignal mit einem spezifizierten digitalen IIR-Filter und wird zur Darstellung der identifizierten Strecke für die Regelung verwenden. Dabei kann man bis zu 500 Koeffizienten jeweils für Nenner und Zähler des IIR-Filters eingeben.
  • Standard_LMS_Controller: Der Block implementiert den LMS-Algorithmus nach [latex]\mathbf{w}(n+1)=\mathbf{w}(n)+\mu \mathbf{x}_{f}(n)e(n)[/latex] . Dabei kann man die Adaptionsschrittweite [latex]\mu[/latex] und die Filterlänge [latex]L[/latex] bis zu 500 eingeben kann. Für weitere Informationen über LMS-Algorithmus siehe bitte den vorherigen Beitrag.
  • Modified_LMS_Controller: Der Block implementiert den modifizierten LMS-Algorithmus nach [latex]\widehat{P}_{x}(n) = \frac{\mathbf{x}^{T}(n)\mathbf{x}(n)}{L}[/latex], [latex]\mu=\frac{\alpha}{L\text{max}[\widehat{P}_{x}(n),~P_{min}]}[/latex] und [latex]\mathbf{w}(n+1)=\gamma\mathbf{w}(n)+\mu \mathbf{x}_{f}(n)e(n)[/latex] . Dabei kann man Adaptionsfaktor [latex]\alpha[/latex] und die minimale Eingangssignalleistung [latex]P_{min}[/latex] zur Bestimmung der Adaptionsschrittweite [latex]\mu[/latex], den Leaky-Faktor [latex]\gamma[/latex] und die Filterlänge [latex]L[/latex] bis zu 500 eingeben.  Für weitere Informationen über LMS-Algorithmus siehe bitte den vorherigen Beitrag.
  • NarrowBand_LMS_Controller: Der Block ist für die schmalbandige Feedforward-Regelung ausgelegt und implementiert den modifizierten LMS-Algorithmus nach [latex]\widehat{P}_{x}(n) = \frac{\mathbf{x}^{T}(n)\mathbf{x}(n)}{L}[/latex], [latex]\mu=\frac{\alpha}{L\text{max}[\widehat{P}_{x}(n),~P_{min}]}[/latex] und [latex]\mathbf{w}(n+1)=\gamma\mathbf{w}(n)+\mu \mathbf{x}_{f}(n)e(n)[/latex] . Dabei ist der Filterlänge als 2 festgelegt und man kann Adaptionsfaktor [latex]\alpha[/latex] und die minimale Eingangssignalleistung [latex]P_{min}[/latex] zur Bestimmung der Adaptionsschrittweite [latex]\mu[/latex] und den Leaky-Faktor [latex]\gamma[/latex] eingeben. Für weitere Informationen über LMS-Algorithmus siehe bitte den vorherigen Beitrag.
  • Complex_Multiplication: Der Block implementiert die komplexe Multiplikation von zwei komplexen Werten und arbeitet zusammen mit dem Block NarrowBand_LMS_Controller für eine schmalbandige Feedforward-Regelung.
  • LookupTableOneDimension: Der Block kann Daten in Lookup-Table speichern und die interpolierte und extrapolierte Werte mittels linearer Interpolation und Extrapolation bestimmen. Der Block wird zur Speicherung des Amplitudengangs der sekundären Strecke für die schmalbandige Feedforward-Regelung verwendet.
  • Frequency_Estimator: Der Block misst die Frequenz des periodischen Eingangssignals. Die gemessene Frequenz wird zur Generierung des Referenzsignals für schmalbandige Feedforward-Regelung verwendet. Dabei kann man den Anfangswert und den Schwellwert zur Bestimmung der Frequenz eingeben. Bei der Anwendung am Prüfstand funktioniert dieser Block wegen dem Rauschen im Messsignal nicht gut. Deswegen wird der in meiner Arbeit nicht weiter verwendet und muss weiter optimiert werden.
  • Path_Identification: Der Block implementiert den modifizierten LMS-Algorithmus und ermöglicht eine „online“-Identifikation der Strecke. Dabei kann man Adaptionsfaktor [latex]\alpha[/latex] und die minimale Eingangssignalleistung [latex]P_{min}[/latex] zur Bestimmung der Adaptionsschrittweite [latex]\mu[/latex], den Leaky-Faktor [latex]\gamma[/latex] und die Filterlänge [latex]L[/latex] bis zu 500 eingeben.
  • DelayIC: Der Block implementiert die Verzögerung um einen Schritt. Dabei kann man den Anfangswert für den Block eingeben. Dieser Block war ursprünglich für Generierung vom PRBS-Signal gedacht und wird nicht in meiner Arbeit eingesetzt.
  • XOR: Der Block führt die bitweise Operation „XOR“ aus. Dieser Block war ursprünglich für Generierung vom PRBS-Signal gedacht und wird nicht in meiner Arbeit eingesetzt.
  • TestBlock: Der Block ist ein leeres Block zum Programmieren und Ausprobieren von neuem Code.

Programmierung der Blöcke

Aus Platzgründen beschränkt sich die Beschreibung auf sechs relativ wichtige Blöcke für die aktive adaptive Schwingungsminderung.

  • PrbsGen

Der Block „PrbsGen“ generiert ein PRBS-Signal als Anregungssigal für die Identifikation und ist nach dem in Bild 2 dargestellten Schema in C programmiert. Im Programm wird ein 16-Bit Integer „LFSR“ als der Schieberegister verwendet. Durch Verschiebung der Elementen von „LFSR“ und bitweise logische XOR-Operationen kann ein Zufallssequenz aus dem letzten Bit von „LFSR“ erzeugt werden.

Bild 2 Schematische Darstellung der Erzeugung eines PRBS-Signals[1]

  • FIR_Filter

Der Block FIR_Filter wird  zur Darstellung des identifizierten Modells einer Strecke in dem Regelmodell und zur Filterung eines Signals (z.B. Tiefpass-Filter) verwendet. Eine schematische Darstellung von einem FIR-Filter mit dem Koeffizienten [latex]b_{0} ,\cdots , b_{N}[/latex] zeigt Bild 3. Dies kann mit einem Array [latex]W[N+1][/latex] für die Filterkoeffizienten und einem Array [latex]input\_buffer[N+1][/latex] für die Eingangswerte in C umgesetzt werden. Wenn ein neuer Eingangswerte kommt, werden alle Speicherelemente in input_buffer nach rechts verschoben und der neuer Eingangswerte in dem ersten in [latex]input\_buffer[0][/latex] gespeichert. Der Nachteil dieses Verfahrens liegt darin, dass für den Schiebevorgang [latex]N[/latex] Werte im input_buffer bewegt werden müssen. Gerade bei aufwändigen Filtern mit vielen Koeffizienten ist damit ein unnötiger zeitlicher Aufwand verbunden [3].

Bild 3 Schematische Darstellung von FIR_Filter[2]

Um den Nachteil der direkten Umsetzung umzugehen, werden Ring-Buffer zur Elementspeicherung in dieser Arbeit verwendet. Bild 4 zeigt eine schematische Darstellung von einem Ring-Buffer. Bei einem Ring-Buffer werden die neuen Eingangswerte fortlaufend in den Speicher geschrieben. Ein Zeiger zeigt auf die Stelle, in die der neue Wert geschrieben wird. Wenn das letzte Element des Ring-Buffers erreicht wird, wird der Schreibvorgang bei dem ersten Bufferelement fortgesetzt. Der neue Werte [latex]x(n)[/latex] überschreibt den ältesten Wert [latex]x(n-N)[/latex] im Ring-Buffer und der Schiebevorgang entfällt [3].

Bild 4: Schematische Darstellung von Ring-Buffer [3]

  • IIR_Filter

Der Block IIR_Filter wird zur Darstellung des identifizierten Modells einer Strecke im Regelmodell verwendet. Im Unterschied zum FIR_Filter hängt der aktuelle Ausgangswert [latex]y_{n}[/latex] von einem IIR-System nicht nur von den Eingangswerten, sondern auch von zurückliegenden Ausgangswerten [latex]y_{n-1}, \cdots , y_{k-n}[/latex] ab. In Analogie zum FIR-Filter werden zwei Ring-Buffer jeweils für den Nenner und den Zähler der Übertragungsfunktion des IIR-Filters eingesetzt.

  • Standard_LMS_Controller

Standard_LMS_Controller: Der Block besteht aus zwei Teilen (siehe Bild 5). Der Teil „LMS“ implementiert den LMS-Algorithmus nach [latex]\mathbf{w}(n+1)=\mathbf{w}(n)+\mu \mathbf{x}_{f}(n)e(n)[/latex] . Diese Formel kann die Filterkoeffizienten des FIR-Filters bestimmen. Basierend auf den berechneten Filterkoeffizienten filtert der Teil „FIR-Filter“ das Eingangssignal und gibt eine Stellgröße [latex]y(n)[/latex] aus. Für das Block kann man die Adaptionsschrittweite [latex]\mu[/latex] des LMS-Algorithmus und die Filterlänge [latex]L[/latex] des FIR-Filters bis zu 500 eingeben kann.

Anmerkung: Bei der Implementierung des LMS-Algorithmus hier wird die Effekt der Sekundären Strecke (siehe Beitrag) auch berücksichtigt. Deswegen ist der hier implementierte Algorithmus streng genommen FxLMS (Filtered-X-Least-Mean-Square) statt LMS.

Bild 5: Schematische Darstellung des LMS-Controllers

  • Modified_LMS_Controller

Modified_LMS_Controller ist ähnlich wie das Block Standard_LMS_Controller. Die Unterschiede liegen darin, dass die Adaptionsschrittweite [latex]\mu[/latex] des LMS-Algorithmus kann mittels Eingangssignale geschätzt werden und der Leaky-Faktor [latex]\gamma[/latex] berücksichtigt wird. Für weitere Informationen über LMS-Algorithmus siehe bitte den vorherigen Beitrag. Dabei implementiert das Block die Gleichungen [latex]\widehat{P}_{x}(n) = \frac{\mathbf{x}^{T}(n)\mathbf{x}(n)}{L}[/latex], [latex]\mu=\frac{\alpha}{L\text{max}[\widehat{P}_{x}(n),~P_{min}]}[/latex] und [latex]\mathbf{w}(n+1)=\gamma\mathbf{w}(n)+\mu \mathbf{x}_{f}(n)e(n)[/latex] . Für das Block kann man Adaptionsfaktor [latex]\alpha[/latex] und die minimale Eingangssignalleistung [latex]P_{min}[/latex] zur Schätzung der Adaptionsschrittweite [latex]\mu[/latex], den Leaky-Faktor [latex]\gamma[/latex] und die Filterlänge [latex]L[/latex] des FIR-Filters bis zu 500 eingeben.

Anmerkung: Bei der Implementierung des LMS-Algorithmus hier wird die Effekt der Sekundären Strecke (siehe Beitrag) auch berücksichtigt. Deswegen ist der hier implementierte Algorithmus streng genommen FxLMS (Filtered-X-Least-Mean-Square) statt LMS.

  • Path_Identification

Path_Identification implementiert den modifizierten LMS-Algorithmus und ermöglicht eine „online“ Identifikation bzw. Modellbildung der Strecke. Wenn der Block ist eingeschaltet, funktioniert er nach dem Schema im Bild 5 und damit bildet automatisch ein geschätztes Modell der echten Strecke iterativ. Wenn die Ausgangsabweichung zwischen der echten Strecke und dem geschätzten Modell unterhalb 10% des Ausgangssignals der echten Strecke liegt, leuchtet dann ein LED und weist darauf hin, dass die Identifikation abgeschlossen werden kann. Danach kann man den Block abschalten und das geschätzte Modell wird automatisch in Form eines FIR-Filters  im Block gespeichert und steht zur nachfolgende Regelung bereit.

Anmerkung: Bei der Implementierung des LMS-Algorithmus hier wird die Effekt der Sekundären Strecke (siehe Beitrag) auch berücksichtigt. Deswegen ist der hier implementierte Algorithmus streng genommen FxLMS (Filtered-X-Least-Mean-Square) statt LMS.

Herunterladen und Installation

Das Paket der Bibliothek kann man momentan über diesen Links von GitHub herunterladen. Nachdem man das Paket unter dem Verzeichnis <X2CRoot>/Library/ extrahiert hat (siehe Bild 6), kann man dann die Blöcke der Bibliothek in Scilabinstallieren. Dafür muss man die einzelnen Blöcke einer nach dem anderen über die Konsole von Scilab installieren. Die Anleitung für die Generierung bzw. Installation der Blöcke in Scilab siehe unten:

Bild 6: Installationspfad für OpenAdaptronik

Generierung der Blöcke in Scilab (Auszug des vorherigen Beitrags)

Nachdem man den neuen Block programmiert hat, sollte der neue Block in Scilab generiert werden. Um den Block in Scilab zu generieren, muss man zuerst den C-Compiler in Scilab installieren. Laut der Dokumentation von Scilab unterstüzt Scilab für Windows vier Compiler: Visual Studio C++ bis Version 2013, Intel Fortran, LCC-Win32 und MinGW. In dieser Arbeit wird MinGW 64-Bit als Compiler ausgewählt. Zusätzlich zu dem Installationspaket von MinGW muss man die MingGW Toolbox für Scilab installieren. Nach der Installation des Compilers erscheint der Hinweis „Mingw Compiler support for Scilab“ bei neuem Starten von Scilab in dem Konsole. Das bedeutet, dass die Installation des Compilers abgeschlossen ist. Danach kann man den Befehl „createXcosBlock(<Bibliothekname>,<Blockname>,<Pfad des Stammverzeichnis von X2C>)“ (zB. für Block PrbsGen: createXcosBlock(‚OpenAdaptronik‘,’PrbsGen‘,’C:\X2C\‘)) in der Konsole eintippen und damit den neuen Block in Scilab generieren. Die Generierung in Scilab dauert ein paar Sekunden, danach wird Hinweis über die erfolgreiche Generierung des Blocks in der Konsole dargestellt. Zum Schluss soll man anhand der Anweisung in der Konsole die Datei „initProject.sce“ ausführen und Scilab neu starten.

In nächstem Beitrag werde ich euch erzählen, wie diese neuen Blöcke zum Aufbauen eines Regelmodells für aktive Schwingungsdämpfung verwendet werden. Bis dann!

[1]: LENZ, E.: Identifikation dynamischer Systeme. Vorlesungsskript. Technische Universität,2015/2016

[2]: FLÜGEL, H.: FIR-Filter im CPLD. Webseite, Quelle:https://www.all-electronics.de/fir-filter-im-cpld/.

[3]: ROPPEL, C.: Realisierung digitaler Filter in C. HANSER, 2006


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.