How to generate own new Block in X2C #2

By:

Hallo Zusammen. Ich bin Ruo Yi.  In dem letzten Beitrag habe ich die erste Hälfte über die Generierung eigener neuen Blöcke in X2C erzählt. Nun lass uns weitermachen.

2. Generierung neuer Blöcke

2.1 Grundlegende Einstellung des X2C-Block-Generators

…… (Siehe den letzten Beitrag)

2.1.1 Block Parameter

Die Einstellung der Blockparameter kann einfach nach dem Schema in Bild 2 oder der Anleitung in der X2C-Dokumentation durchgeführt werden. Hierbei soll man auf folgende Punkte achten:

  • Library:
    Hier soll „External“ für externe Blöcke ausgewählt. Dadurch wird ein neues Verzeichnisses in der Bibliothek von X2C erzeugt. Dann können“Library Name“ für die Bezeichnung des neuen Verzeichnis und „Pre-Namespace“ für Java Konvertierungsfunktion eingegeben werden.
  • ID:
    Für externe Blöcke soll die ID eindeutig und zwischen 4000 bis 8191 sein.
  • Visualizations:
    Hier kann die Visualisierung des Blocks separat für MATLAB und ScilabXcos definiert werden. Für die Darstellung des neuen Blocks in X2C sind die Optionen „BlockIconDefaultSize“ und „Style“ relevant, wobei die Größe des Symbols des neuen Blocks über „BlockIconDefaultSize“ in der Form von [Breite, Höhe] eingestellt und der Pfad eines Symbols über „Style“ in Bild 3 dargestellten Form definiert wird. Das Symbol kann als svg-Datei erstellt werden. Zur Erstellung einer svg-Grafik ist die offene Software „Inkscape“ zu empfehlen.

Bild 3 X2C-Blockparameter für Visualisierung

2.1.2 Implementations

Die Einstellung für die Implementierung kann einfach nach dem Schema in Bild 2 oder der Anleitung in X2C-Dokumentation durchgeführt werden. Hierbei sollte man auf folgende Punkte achten: Current

  • Implementation:
    Hier wird der Datentyp für die Implementierung definiert. Den Datentyp kann man entweder als Bool, FiP8(8-Bit Fixed Point),FiP16(16-Bit Fixed Point), FiP32(32-Bit Fixed Point), Float32(32-Bit Floating Point) oder Float(64-Bits Floating Point) auswählen. Außerdem ist auch die Generierung von neuen Datentypen möglich.
  • ID:
    Je nach Datentyp für die Implementierung soll die ID eindeutig und zwischen 0 bis 15 sein. Für die vorgenannten bestehenden Datentypen sind die ID so zugeordnet: 0–FiP8, 1–FiP16, 2–FiP32, 3–Float32 und 4–Float64.
  • Controller Inports und Controller Outports:
    Die Controller Inports und Outports werden automatisch erstellt werden, wenn man Mask Inports und Outports definiert hat. Hierbei kann man den Datentyp aus dem Dropdown-Menü ausgewählen. Es ist hier angemerkt, dass der Datentyp im dem Dropdown-Menü leicht versehentlich durch das Mausrad verändert werden kann.
  • Controller Parameters:
    Die Controller Parameters kann man als speicherbare Zwischenvariablen in der Implementierung betrachten. Wenn man die zurückliegenden Daten zur Berechnung aktueller Werte brauchen, sollte Controller Parameter dafür definiert werden. In Bild 4 ist der Dialog-Fenster von Controller Parameter zu sehen. Hier kann man den Datentyp und Standardwert für den Controller Parameter definieren. Darüber hinaus sind die drei Optionen „Load & Save Enable“, „Array“ und „Array in flash memory“ zu beachten. Die Option „Load & Save Enable“ ermöglicht das downloaden (save) und uploaden (load) von Parametern zur Laufzeit. Die Option wird deaktiviert, wenn man Controller-Parameter hat, die von der PC-Seite nicht geändert werden (dürfen), z.B. State-Variablen [1]. Die Option „Array“ ermöglicht die Einstellung eines Vektors als Controller Parameter. Wenn diese Option aktiviert ist, kann man noch die Option „Array in flash memory“ auswählen. „Array in flash memory“ heißt, dass der Vektor als Konstante gespeichert wird und während der Laufzeit des Blocks nicht geändert werden darf. Es ist hier zu empfehlen, dass die Option „Load & Save Enable“ für Controller Parameter in Form von einem großen Vektor so weit wie möglich zu deaktivieren, wenn eine Übertragung in Echtzeit zwischen „Mask Parameters“ und „Controller Parameters“ nicht notwendig ist. Sonst kann die Effizienz des Blocks wegen der unnötigen Übertragung der Parameter vom PC zum Controller beeinträchtigt werden.
  • Conversion Function Type:
    Hier kann man entweder Java, Python oder JavaScript für die Konversion des Datentyps zwischen Mask-Parameter und Controller-Parameter auswählen. Wenn keine Mask-Parameter definiert sind, ist die Conversion Function nicht notwendig.

Bild 4: X2C-Controller Parameter

Bei der Generierung eines neuen X2C-Blocks sollte man darauf achten, dass ein X2C-Block mit Controller-Parameter in Form von Vektoren zum Absturz oder zu einer Fehlermeldung bei der Simulation des Modells in Xcos führen kann. Wenn man Controller-Parameter in Form von Vektor definiert und die Option „Load & Save Enable“ deaktiviert, dann tritt bei der Simulation des X2C-Modells die Fehlermeldung „runtime error“ auf. Aber wenn man die Option „Load & Save Enable“ für den vektorielle Controller-Parameter aktiviert, kann die Simulation wegen der großen Datenmenge für die Parameterübertragung abstürzen. Dieser Fehler wurden schon dem Software-Hersteller LCM mitgeteilt. Laut der Antwort von LCM wurden bisher Blöcke mit vektoriellen Controllerparameter noch nicht intensiv getestet und diese Situation werde bei Gelegenheit behandelt [1]. Aber dieser Fehler betrifft nur die Simulation in Xcos und hat keinen Einfluss auf die Code-Generierung und die Inbetriebnahme der Regelung mit dem Mikrocomputer.

Nach Abschluss der Einstellung in Block-Generator kann man über „save“ die Einstellungen für den neuen Block in dem Stammverzeichnis von X2C speichern. Somit werden eine XML-Datei, eine C-Datei und gegebenenfalls eine Java- oder Python-Datei in dem Verzeichnis der Bibliothek automatisch erzeugt.

2.2 Konversion der Datentyp mit Java

Wenn Mask-Parameter bei der Einstellung des X2C-Block-Generators definiert werden, wird eine Java- oder Python-Datei je nach der Einstellung für „Conversion Function Type“ automatisch unter dem Verzeichnis der Bibliothek erzeugt. In dieser Arbeit wird Java zur Konversion der Datentypen für Mask-Parameter verwendet. Eine zusammengefasste Anleitung für die Programmierung der Java-Datei ist im folgenden geschrieben.

In Bild 5 ist die Java-Funktion zur Konversion des Datentyps dargestellt. In der automatisch erzeugten Java-Funktion sind der Gesamtrahmen und der meiste Code schon erstellt. Man muss nur die Funktion mit entsprechendem Code für die zu konvertierenden Mask-Parameter ergänzen. Die Teile, die von Benutzer ergänzt werden müssen, werden mit dem Kommentar „USERCODE-BEGIN , . . . , USERCODE-END“ gekennzeichnet. Bei der Programmierung geht es hier um die Zuweisung der Mask-Parameter an die Controller-Parameter und umgekehrt. Die Programmierung ist nicht kompliziert und kann nach dem Schema von einem bestehenden Block von X2C erfolgen.

Bild 5: Java-Skript zur Konversion des Datentyps für Mask-Parameter

2.3 Programmierung der Blockfunktion in C

Die Funktion bzw. Algorithmus des neuen Blocks wird in Sprache C programmiert. Wie zuvor ist der Gesamtrahmen in der automatisch erzeugten C-Datei auch schon erstellt. Man muss nur in den Funktionen „PreProcessor“, „Update“ und „Initialization“ den entsprechenden Code für die Funktion bzw. den Algorithmus hinzufügen.

2.4 Generierung der Blöcke in Scilab

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.

Quellen;

[1] X2C: E-Mail-Korrespondenz mit Stefan Fragner

Letzter Beitrag:

How to generate own new Block in X2C #1


5 thoughts on “How to generate own new Block in X2C #2

  1. Hallo zusammen,

    ich bin studentischer Mitarbeiter am Linz Center of Mechatronics an der Johannes Kepler Universität. Teil meiner Arbeit ist es neue X2C Blöcke zu implementieren.
    Ich habe gesehen ihr habt schon einige zu LMS, FIR, etc. gemacht. Nun meine Frage, sind diese Blöcke frei zugänglich?

    Mit freundlichen Grüßen
    Wenninger Johannes

    1. Hallo Wenninger,
      ich freue mich über dein Kommentar. Natürlich sind diese Blöcke frei zugänglich.
      Diese Blöcke sind im Rahmen meiner Masterarbeit generiert, damals habe ich bei der Generierung neuer Blöcke in X2C viel Unterstützung und Anregungen von Herrn Stefan Fragner von LCM bekommen. Ich bedanke mich bei LCM und möchte gerne Leistung zur deinen Arbeit beitragen. Ich werde diese Woche ein Verzeichnis mit allen Blöcken auf GitHub hochladen. Wenn es klappt, sage ich dir einen Bescheid.
      Mit freundlichen Grüßen aus Darmstadt,
      Ruo Yi

        1. Hallo Wenninger,
          wie gesprochen, habe ich ein Paket mit allen neuen Blöcken auf GitHub hochgeladen. Für weitere Informationen siehst du bitte mal meinen neuen Beitrag 🙂

          Anmerkung: Diese neue Bibliothek ist eigentlich gezielt zur Realisierung der aktiven Schwingungsdämpfung programmiert. Deswegen sind die Funktionen mancher Blöcke (z.B. Standard_LMS_Controller, Modified_LMS_Controller und Path_Identification) ein bisschen schwer zu verstehen, ohne dass man die entsprechenden Fachkenntnisse über aktive Schwingungsdämpfung besitzt, die in meinen vorherigen Beiträgen vorgestellten wurden. Im Vergleich zu diesen Projekt-spezifischen Blöcken sind andere Blöcke wie FIR_Filter, IIR_Filter,PrbsGen usw. für allgemeine Anwendungen völlig geeignet.

          Wenn du Frage über die Funktion oder den Codes, kannst du mich immer mit Kommentaren oder per Email cagaan.iruu@gmail.com erreichen.
          Mit freundlichen Grüßen,
          Ruo Yi

          1. Hallo Ruo,

            vielen Dank für deine Unterstützung! Falls weitere Fragen auftauchen werde ich mich bei dir melden. 🙂

            Mit freundlichen Grüßen
            Wenninger Johannes

Schreibe einen Kommentar

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