Software: FEM - Tutorial - Magnetfeld - Kennfeld-Nutzung zur System-Simulation
Verwendete Software
Es soll am Beispiel des Programms SimulationX gezeigt werden, wie der exportierte C-Code mit geringem Aufwand zur System-Simulation eines Magnet-Antriebs genutzt werden kann. Dank gebührt Herrn Tobias Nähring (Mitarbeiter der Firma ITI GmbH) für seine wertvollen Tipps zum Einbinden externer Funktionen in SimulationX-Modelle.
Wir verwenden den freien Gnu-C-Compiler gcc, der Bestandteil der GNU-Compiler Collection ist. Eine Portierung dieser Compiler Collection für Windows läuft unter Cygwin. Von http://www.cygwin.com/ kann man eine aktuelle setup.exe für die Cygwin-Installation kostenlos herunterladen.
Ausführliche Hinweise zur Installation enthält die Installation_Cygwin.pdf von Herrn Sönke Hoffmann (Hochschule Ostwestfalen-Lippe). Von den darin angegebenen Komponenten der Development-Umgebung genügt für unsere Zwecke:
- gcc-core, der C-Compiler,
- make, ein Hilfsprogramm (dass man sicher benötigt)
Hinweis: Im Beispiel konnte bei der Benutzung der Download-Seite der TU-Dresden die Installation nicht vollendet werden, weil etwas fehlte. Ein Wechsel auf die Ruhr-Uni-Bochum führte zum Erfolg!
Die Windows-Systemvariable PATH wird, wie in der Anleitung beschrieben, durch den Verweis auf den cygwin\bin-Ordner erweitert. Damit ist gewährleistet, dass man den C-Compiler im Konsolen-Fenster von Windows direkt aufrufen kann.
Hinweis: Man muss in diesem Verzeichnis nachschauen, welche Version des Compilers installiert ist. In der Beispiel-Installation war es gcc-3.exe, deshalb ist dann der Compiler in der Konsole mit gcc-3 aufzurufen!
Erzeugen einer Windows-DLL
SimulationX bietet die Möglichkeit, externe Funktionen einzubinden, welche sich in einer Windwos-DLL befinden. Deshalb erzeugen wir aus dem vorliegenden C-Quelltext durch Compilieren mit dem gcc eine solche DLL-Datei:
- Der exportierte c-Quelltext der aktuellen OptiY-Version ist noch nicht vollständig kompatibel mit den Anforderungen des gcc und der Schnittstelle zum SimulationX. Das soll sich mit der nächsten OptiY-Version ändern. Bis dahin sind noch folgende Änderungen im Quelltext vorzunehmen:
- Das den Kennfeld-Variablen vorangestellte Zeichen # muss entfernt werden (im Beispiel #i und #s durch i und s ersetzen). Ansonsten kommt es zu einem Syntax-Fehler im gcc-Compiler!
- Der Datentyp float muss überall durch double ersetzt werden (Kompatibilitaetsforderung zu SimulationX).
- Danach hat die Datei Magnet_RSM.c die folgende Form (gekürzt):
double Covariance(double x1[],double x2[],double p[]) { double Co, W; W = 0; for(int i = 0; i<2; i++) { W = W + (x1[i]-x2[i])*(x1[i]-x2[i])*p[i]*p[i]; } Co = exp(-W); return Co; }
double F(double i, float s) { double p[2]; double x1[2]; double x2[2]; double y = -46.7372056; y = y+10.5264863*pow(i,1); y = y+4.62081477*pow(s,1); p[0] = 0.161298213; p[1] = 0.928373134; x1[0] = i; x1[1] = s; x2[0] = 5.01; x2[1] = 2.02; y = y-183.986679*Covariance(x1,x2,p); x2[0] = 0.01; x2[1] = 0.02; y = y-8624.5598*Covariance(x1,x2,p); x2[0] = 2.01; x2[1] = 0.02; y = y+27677.7263*Covariance(x1,x2,p); : : x2[0] = 10.01; x2[1] = 4.02; y = y-1042.30105*Covariance(x1,x2,p); return y; }
double Psi(double i, double s) { double p[2]; double x1[2]; double x2[2]; double y = 0.0189621757; y = y+0.00649675907*pow(i,1); y = y-0.00349272992*pow(s,1); p[0] = 0.590637256; p[1] = 0.777378104; x1[0] = i; x1[1] = s; x2[0] = 5.01; x2[1] = 2.02; y = y-0.000721074847*Covariance(x1,x2,p); x2[0] = 0.01; x2[1] = 0.02; y = y-0.0269366063*Covariance(x1,x2,p); x2[0] = 2.01; x2[1] = 0.02; y = y+0.0298939078*Covariance(x1,x2,p); : : x2[0] = 10.01; x2[1] = 4.02; y = y-0.00522234634*Covariance(x1,x2,p); return y; }
- Man startet die Windows-Konsole (Start - Ausführen - cmd) und wählt als aktuelles Verzeichnis das, worin sich die C-Quelltext-Datei (hier Magnet_RSM.c) befindet.
- Mittels der Kommandozeile (im Beispiel für die Compiler-Version gcc-3):
gcc-3 -mno-cygwin -shared -o Magnet_RSM.dll Magnet_RSM.c
- sollte ohne Fehlermeldung die Datei Magnet_RSM.dll im gleichen Verzeichnis erzeugt werden.
Das Verzeichnis, in dem Magnet_RSM.dll abgelegt wird, muss in die Liste der Verzeichnisse fuer die externen Funktionen von SimulationX eingetragen werden:
- Diese Liste findet man in SimulationX unter Extras->Optionen->Verzeichnisse->Externe Funktionen.
- Entweder man kopiert die .dll-Datei in eines der Standard-Verzeichnisse oder man ergänzt die Liste dieser Verzeichnisse um den aktuell genutzten Ordner.
- Im Prinzip könnte man in der obigen Kommadozeile die .dll-Datei in eines der Standard-Verzeichnisse von SimulationX lenken.
Kennfeld-Testmodell
Bevor man die Kennfelder in ein kompliziertes Antriebsmodell einbindet, sollte man unbedingt ein Testmodell aufbauen, um das richtige Funktionieren zu überprüfen:
- Wir beginnen im SimulationX mit einer neuen Datei, welche wir als Test_Kennfeld.ism speichern.
- Es werden zwei lokale Element-Typen im Modell definiert, welche jeweils eine der Kennfeld-Funktionen bereitstellen. Der Test erfolgt dann durch eine Rastersuche in einem OptiY-Experiment.
- Wir beginnen im SimX-Modell mit dem Elementtyp F_RSM für das Kraft-Kennfeld:
- Als Symbol wird ein 61x61-Pixel-Bild verwendet, welches eine modifizierte Kopie des 2D-Kennfeld-Symbols aus der SimX-Bibliothek darstellt:
- Zum Testen speisen wir die Funktionsvariablen Strom i und Luftspalt s als Parameter in das Element ein und führen den Funktionswert der Kraft F als Variable nach außen:
- Achtung: Für diese Komponenten sollte man die gleiche Einheit für die physikalischen Größen wählen, wie sie im FE-Modell verwendet wurden. Das bedeutet, die Luftspalt-Werte sind in mm einzuspeisen! Das ist zur Zeit noch erforderlich, wenn man mittels Rastersuche im OptiY die Kennfelder in den gleichen Grenzwerten darstellen möchte, wie die aus der FEM-Simulation gewonnene Antwortfläche. In OptiY erfolgen noch keine Umrechnungen zwischen unterschiedlichen Einheitsdimensionen.
- Das F-Kennfeld wird im Element-Typ unter Lokale Typen als externe Funktion definiert:
Durch Bearbeiten der Funktionseigenschaften definiert man die Schnittstelle zwischen dem SimX-Modell und der externen Function innerhalb der .dll-Datei:
- Für die allgemeinen Einträge genügen die Standard-Vorgaben.
- Als Argumente der Funktion definieren wir zwei Eingabe- und einen Ausgabeparameter:
- Dabei berücksichtigen wir ebenfalls die Maßeinheiten der Funktionsargumente (z.B. Luftspalt in mm).
- Die Atrribute der Argumente belassen wir auf den Standard-Einträgen.
- Unter den Aufrufkonventionen ist die Liste der Argumente bereits eingetragen. Wir definieren noch den Namen der benutzten .dll-Datei und den Typ der Schnittstelle:
- Beim Fertigstellen der Funktionsdefinition erfolgt eine Warnung, dass keine grafische Darstellung definiert wurde. Diese Warnung können wir ignorieren.
- Für das Verhalten des Element-Typs definieren wir abschließend den Funktionsaufruf unter Berücksichtigung der physikalischen Einheiten (Luftspalt in mm):
- Achtung: Die Umrechnung 'm->mm' ist unbedingt erforderlich, da die Kennfeld-Funktion auf der Einheit mm basiert. Innerhalb der SimulationX-Modelle wird aber grundsätzlich mit SI-Einheiten gerechnet, auch wenn man für einzelne Komponenten wegen der Anschaulichkeit abweichende Dimensionen definiert.
- Der lokale Element-Typ F_RSM wird als Element F_Kennfeld innerhalb des SimX-Modells verwendet.
- Für einen ersten Test wurde der Stromeingang i mit der Simulationszeit t belegt, die von 0 bis 10 s läuft.
- Sowohl für den Luftspalt s=0 mm, als auch für s=4 mm ergeben sich korrekte Funktionsverläufe:
- Die Rastersuche nach Einbindung des Modells in ein OptiY-Experiment zeigt die komplette Funktionsfläche. Dabei wurden die gleichen Bereichsgrenzen verwendet, wie zuvor bei der Ermittlung der Antwortfläche anhand des FE-Modells:
Die Einbindung der C-Funktion für das Psi-Kennfeld verläuft analog, wie bei dem F-Kennfeld. Es handelt sich praktisch um den gleichen Element-Typ, nur dass die Kraft F durch den Koppelfluss Psi ersetzt wird:
- Man exportiert (kopiert) den lokalen Typ F_RSM in den Bibliotheksordner ExternalTypes.
- Dort benennt man F_RSM in Psi_RSM um. Dazu muss man zusätzlich den external Type im Type-Designer öffnen und unter "Allgemein" auch den Namen ändern.
- Danach kopiert man den external Type Psi_RSM zu den lokalen Typen des Modells und ersetzt systematisch die Kraft durch den Koppelfluss.
- Es kann das nebenstehende Symbol für Psi_RSM verwendet werden.
- Auch hier sollte man die Implementierung gründlich verifizieren, bevor man beide Kennfelder in das richtige Antriebsmodell einfügt:
Achtung:
- Die Arbeitskopie von Psi_RSM in der ExternalTypes-Bibliothek sollte man löschen, um eine spätere fehlerhafte Anwendung zu vermeiden!
- Sind beide lokalen Element-Typen verifiziert, exportiert man Kopien in den Bibliotheksordner ExternalTypes. Damit stehen die externen Funktionen auch für die Implementierung in das eigentliche Antriebsmodell zur Verfügung.
Elektromagneto-mechanischer Wandler
Beide Kennfelder dienen zusammen zur Nachbildung des mittels FE-Modell simulierten konkreten Elektro-Magneten in einem dynamischen Systemmodell des kompletten elektromagnetischen Antriebs.
Zur Demonstration wird dafür im Folgenden das Beispiel des Blindenschrift-Prägers aus dem Tutorial zur System-Simulation verwendet.
- Wir öffnen das verifizierte SimX-Modells (ab Wintersemester 2010 mit Toleranzen, Wirbelstrom und Magnet-Hysterese) und speichern es unter dem neuen Bezeichner Magnet-RSM.ism:
- Der markierte farbige Bereich entspricht dem elektromagneto-mechanischem Wandler (E-Magnet ohne Ankermasse).
- Nachdem wir für den elektromagneto-mechanischen Wandler einen neuen lokalen Element-Type RSM_Wandler definiert haben, können wir die beiden externen Funktionen mittels Drag&Drop in diesen lokalen Type hinein kopieren (mit gedrückter Strg-Taste):
- Als Symbol für den RSM_Wandler kann man nebenstehendes Bild verwenden.
- Alle Netzwerk-Elemente innerhalb des farbig markierten Wandler-Bereiches können gelöscht werden.
- An ihre Stelle platzieren wir den RSM_Wandler als Magnet_RSM:
Nun bleibt uns nur noch die Aufgabe diesen Element-Typ zum richtigen Verhalten zu führen:
- Die mechanische Seite des Wandlers ist relativ einfach durch die Definition zweier mechanischer translatorischer Anschlüsse zu realisieren.
===>>> Hier geht es bald weiter!!!