Anwendung von MATLAB / Simulink mit Geräten von InSys JSC

Eine wichtige praktische Aufgabe ist die Verwendung von Matlab / Simulink mit realen Geräten, mit denen Sie ein Signal aus der realen Welt empfangen können. Dies ist sehr nützlich zum Debuggen von Algorithmen. In diesem Dokument wird die Technologie zum Verbinden von ADC-Geräten von InSys JSC mit Simulink vorgestellt. Zum Verbinden wird eine DLL verwendet, die in Simulink als sm_adc-Komponente angezeigt wird. Für die Arbeit mit dem Gerät wird ein separates Konsolenprogramm verwendet. Die Kommunikation mit der DLL erfolgt über den gemeinsamen Speicher. Gemäß dieser Technologie können alle ADCs an beliebigen tragenden Modulen von InSys JSC angeschlossen werden. Die Arbeit präsentiert ein System aus einem A7_DAC-Generator und einem FMC128E / FM412x500M-Erfassungsmodul.

Diese Arbeit wurde auf der Konferenz „Technologien zur Entwicklung und zum Debuggen komplexer technischer Systeme“ vom 27. bis 28. März 2018 demonstriert.





Erklärung des Problems

Es erfordert die Entwicklung eines Systems aus einem Signalgenerator und einem ADC, das ein Signal mit den angegebenen Parametern erzeugt und digitalisiert. Die empfangenen Daten müssen zur Verarbeitung an Simulink übertragen werden.

Ausrüstung

Für die Arbeit wurde ein Ständer aus dem ADC-Modul und dem Generator zusammengebaut. Als ADC wird das Submodul FM412x500M verwendet, in dem vier ADC-Kanäle mit einer Abtastfrequenz von 500 MHz vorhanden sind. Das Submodul ist auf dem FMC128E-Trägermodul installiert, in dem sich ein Artix 7-FPGA und eine USB 3.0-Schnittstelle befinden. Beide Geräte sind an einen Laptop angeschlossen, auf dem Simulink ausgeführt wird. Zur Überwachung der Leistung wird natürlich ein Oszilloskop verwendet.

Aussehen des Standes:



Strukturdiagramm des Standes:



Signal erzeugt:



Der Algorithmus des Standes:

  1. Simulink bereitet den Start des ADC und des Generators vor
  2. Simulink weist den Generator an, zu starten
  3. Der Generator bildet einen Blitz (gelbes Signal) und das eigentliche Signal (blau)
  4. Der ADC an der Vorderseite des Tors beginnt mit der Datenerfassung
  5. Der ADC sammelt das Array und leitet es an Simulink weiter
  6. Simulink zeigt das vom ADC empfangene Signal an


Dies ist ein klassischer einmaliger Erfassungsmodus. Seine Besonderheit ist genau die Einzigartigkeit. Das Gerät entlang der Signalfront sammelt ein bestimmtes Datenarray. Die Phase der Datenerfassung erfolgt im "harten Echtzeit" -Modus, aber die Verarbeitung ist, wie man sie erhält. Die Erfassungsrate wird durch die Anzahl der ausgewählten Kanäle und die Abtastrate bestimmt. Für vier ADC-Kanäle und eine Abtastfrequenz von 500 MHz beträgt die Datenrate 4 GB / s. Mit dieser Geschwindigkeit können Daten in das SODIMM des FMC128E geschrieben werden. Das heißt, ein 4-GB-Beispiel kann gespeichert werden.

Ferner sollten die Daten zum Computer übertragen werden. Das FMC128E-Modul ist über die USB 3.0-Schnittstelle mit dem Computer verbunden. Die Datenübertragungsrate beträgt 300 MB / s.

Simulink empfängt ein Array von Daten und gibt sie zur weiteren Verarbeitung weiter. Die Zeit für diese Verarbeitung wird bereits durch die Komplexität des Modells bestimmt. In diesem Beispiel wird das Array einfach im Oszilloskopfenster angezeigt.

Irgendwann entscheidet Simulink, dass es notwendig ist, den nächsten Zyklus durchzuführen, und alles wiederholt sich. Wieder werden USB-Befehle gesendet, um den ADC vorzubereiten, den Generator zu starten und Daten zu sammeln.

Dieser Modus ist sehr praktisch zum Debuggen von Hardware und Algorithmen. Sie können nirgendwo hetzen. Sammeln Sie ein Array von Daten. Sie können es ruhig betrachten, auf eine CD brennen und Kaffee trinken. Wenn aber alles geklärt ist, ist es bereits möglich, in einen kontinuierlichen Erfassungsmodus zu wechseln.

DLL-Verbindung

Mit Matlab können Sie Funktionen verbinden, die in externen DLLs implementiert sind. Simulink kann auch externe DLLs verbinden, während einige Anforderungen hinzugefügt werden. In Simulink sieht die externe DLL wie ein S-Funktionsblock aus.



MATLAB bietet eine Vielzahl von Beispielen, einschließlich der Erstellung externer DLLs. Die von MATLAB angebotene Methode ist jedoch nicht sehr praktisch. Es gibt ein OpenSource easyLink- Projekt. Dieses Projekt hat eine Klassenbibliothek für die Verbindung mit Simulink entwickelt.

Um eine Komponente zu erstellen, müssen Sie eine von BaseBlock abgeleitete Klasse erstellen und Ports deklarieren:





DLL-Verbindungsprobleme

Externe DLLs erlauben viel, aber es gibt eine Reihe von Problemen bei der Arbeit mit ihnen. Die wichtigsten für mich persönlich sind die folgenden:

  1. Das Debuggen von DLLs ist schwierig
  2. Es ist umständlich, die Ausgabe von printf () zu sehen
  3. Das Neukompilieren einer DLL erfordert das Beenden von MATLAB

Beim Debuggen eines Programms ist ein schrittweises Debuggen erforderlich. Bei einer DLL ist es möglich, eine Verbindung zu einer bereits in den Speicher geladenen DLL herzustellen, dort einen Haltepunkt zuzuweisen und eine Debugging-Sitzung durchzuführen. Es ist jedoch notwendig, den Moment des Ladens der DLL über Simulink zu erfassen und den Arbeitsbeginn irgendwie zu verzögern. All dies kann getan werden, ist aber unpraktisch.

Dabei möchte ich unbedingt die Debug-Ausgabe sehen, die als Standard-Standard-Stream erstellt wird. Im Fall der DLL kann dieser Thread irgendwie abgefangen werden, aber es ist mir nicht gelungen.

Und schließlich ist die wichtigste Unannehmlichkeit die Notwendigkeit, MATLAB beim Neukompilieren der DLL zu beenden. Andernfalls können Sie einfach keine neue Datei schreiben. Das Beenden und anschließende Starten von MATLAB nimmt viel Zeit in Anspruch.

Um diese Probleme zu lösen, gibt es einen klassischen Weg, komplexe Softwaresysteme zu erstellen. Dies ist die Interaktion zwischen Programmen über den gemeinsamen Speicher.

Shared Memory-Verbindung

Mit modernen Betriebssystemen, sowohl Windows als auch Linux, können Sie gemeinsame Speicherbereiche organisieren. Auf diese Weise können Sie zuverlässige Programme erstellen. Beispielsweise kann ein Programm eine grafische Oberfläche enthalten und mit dem Bediener interagieren, und ein anderes Programm kann mit dem Gerät interagieren. In diesem Fall führt das Einfrieren des Programms, das mit dem Gerät interagiert, nicht zum Einfrieren des Interaktionsprogramms mit dem Bediener. Im Fall von Simulink bietet dieser Ansatz auch einige Vorteile. Das Programm für die Arbeit mit dem Gerät wird einmal gestartet, bereitet das Gerät vor und wartet über den gemeinsam genutzten Speicher auf den Befehl. Die DLL wird jedes Mal geladen, wenn Sie Simulink in der Simulation ausführen. Da die DLL nicht direkt mit der Hardware funktioniert, erfolgt dieser Start schnell.

Für diesen Stand wurden zwei Programme und zwei DLLs entwickelt:

  1. simulink_a7dac - Generatorsteuerungsprogramm
  2. simulink_adc - ADC-Steuerprogramm
  3. sm_ctrl - Generatorsteuerungs-DLL
  4. sm_adc - ADC-Steuer-DLL


Das Blockdiagramm ist in der folgenden Abbildung dargestellt:



Das Programm simulink_adc basiert auf der Bardy-Bibliothek. Mit diesem Programm können Sie mit jedem von InSys JSC hergestellten ADC arbeiten. Die Abstimmung auf einen bestimmten ADC und ein bestimmtes Trägermodul erfolgt über Initialisierungsdateien.

Schemaansicht in Simulink

Und schließlich, wie es in Simulink aussieht:



In Simulink sieht alles so aus wie es ist. Eine Einheit für die ADC-Steuerung. Der zweite Block zur Steuerung des Generators. Zur Steuerung des Generators stehen eine Reihe von Parametern zur Verfügung. Für den ADC erfolgt alles über die Initialisierungsdatei. Bei Bedarf kann auch eine Reihe von ADC-Parametern auf Blockebene angezeigt werden.

Beachten Sie die beiden Master-Oszillatoren. In Bezug auf die Modellzeit geben sie die Startzeit und den Zeitpunkt der Datenerfassung an. Diese Punkte sind sehr wichtig. Sie stellen tatsächlich die Verbindung zwischen dem Modell und der realen Welt her. Das Startsignal tritt in den ADC-Block ein und wird in der DLL verarbeitet. Über den gemeinsamen Speicher gelangt er in das ADC-Programm. Dann wird es in eine Folge von Schreibbefehlen in die Register umgewandelt, die über USB in das FPGA gelangen. Und innerhalb des FPGA ist die Suchvorderkante des Startsignals gespannt. Und erst wenn die Maschine in die entgegengesetzte Richtung gespannt ist, durchläuft die Bestätigung dieselbe Kette. Wenn die Bestätigung Simulink erreicht, erscheint das start_out-Signal am Ausgang des sm_adc-Blocks, der an den sm_ctrl-Block übergeben wird. Und es wird der gleiche Moment der Modellzeit sein. Im sm_ctrl-Block wird entlang derselben Kette das Signal an das FPGA des Generators übertragen und bildet das Signal. Der ADC erfasst dieses Signal in seinem Speicher. Ein Datenerfassungssignal wird vom zweiten Masteroszillator erzeugt. Auf die gleiche Weise gehen die Daten an Simulink und an die Datenausgabe des sm_adc-Blocks. Im Moment wird ein Block mit 16384 Zählungen zurückgegeben. Der empfangene Block wird auf dem Oszilloskop angezeigt.



Ergebnisse

Die Arbeit mit gemeinsam genutztem Speicher hat sich als effektiv erwiesen. Mit dem ADC-Verwaltungsprogramm können Sie mit jedem unserer ADCs arbeiten. Gleichzeitig bleibt eine bequeme Möglichkeit, Parameter über die Konfigurationsdatei zu konfigurieren. Das Programm ist als Konsolenanwendung konzipiert, während die gesamte Debug-Ausgabe sichtbar ist. Es gibt einen Hinweis auf die Funktionsfähigkeit. Mit der SM_CTRL-Komponente können Sie verschiedene externe Anwendungen zur Steuerung von Geräten verbinden. Das Debuggen des ADC-Steuerprogramms verursacht keine Schwierigkeiten. Dies ist ein gängiges Programm, mit dem Sie Haltepunkte setzen und Fehler beheben können. Mit der gleichen Technologie können andere Programme für die Interaktion zwischen Matlab / Simulink und der Außenwelt entwickelt werden.

Die Arbeit wird auf der Website hub.exponenta.ru veröffentlicht ;

Referenzen:
  1. SIMULINK_SM-Projekt - Programmquellcode: https://github.com/dsmv/simulink_sm
  2. EasyLink-Projekt: https://sourcesup.renater.fr/frs/?group_id=1500
  3. Trägermodul FMC128E http://insys.ru/fmc/fmc128e
  4. Submodul FM412x500M http://insys.ru/mezzanine/fm412x500m
  5. Telegrammkanal InSys Research

Source: https://habr.com/ru/post/de470327/


All Articles