Share this

Eine Implementierungsmethode für ein Echtzeit-Hochgeschwindigkeits-Datenerfassungs- und -speichersystem

2026-02-21 12:39:54 · · #1
Mit der rasanten Entwicklung der Informationswissenschaft hat sich die Datenerfassungs- und Speichertechnologie zu einer entscheidenden Komponente der digitalen Signalverarbeitung entwickelt und bestimmt maßgeblich die Leistungsfähigkeit des gesamten Systems. Sie findet breite Anwendung in Radar, Kommunikation, Telemetrie und Fernerkundung und ist zu einem wichtigen Mittel geworden, um externe Informationen zu gewinnen. Busbasierte Datenerfassungs- und Speichersysteme sind aufgrund ihrer Zuverlässigkeit, einfachen Implementierung und Kosteneffizienz weit verbreitet. Die Aufrechterhaltung der Zuverlässigkeit und Echtzeitfähigkeit von Hochgeschwindigkeits-Datenspeichern stellt jedoch bei hohen Datenübertragungsraten eine Herausforderung dar. 1. Einleitung Um diesem Problem zu begegnen, bieten einige Hersteller Dual-Bus-Technologien und 64-Bit/66-MHz-PCI-Bussysteme an. Diese Technologien sind jedoch relativ teuer und berücksichtigen nicht die Kompatibilität mit vorhandener Hardware. Durch Experimente und Untersuchungen haben wir die ultraschnelle digitale I/O-Karte ADLINK PCI-7300A_RevB ausgewählt und ein vorhandenes Computersystem mit einem einzelnen (32-Bit/33-MHz) PCI-Bus genutzt, um eine kostengünstige Hardwareplattform zu entwickeln. Mithilfe unseres selbstentwickelten Softwaresystems erreichten wir schließlich eine kontinuierliche Datenerfassung und -speicherung mit hoher Geschwindigkeit (45 MB/s). 2. Hardwarekonfiguration und Sicherheitsvorkehrungen Um vorhandene Hardware optimal zu nutzen und Kosten zu senken, verwenden wir die ADLINK PCI-7300A_RevB High-Speed-Digital-I/O-Karte für die Datenerfassung. Ihre Hauptmerkmale sind: • 32-Bit-Digital-I/O-Kanäle • 32-Bit-PCI-Bus • Start der Datenerfassung durch Triggersignale • 100-poliger SCSI-Anschluss • Verteiltes/aggregiertes DMA • Maximale Übertragungsrate von 80 MB/s. Für die Echtzeit-Datenspeicherung mit hoher Geschwindigkeit reichen herkömmliche Festplatten nicht aus. Daher wählten wir die Seagate ST3146707LC SCSI-Festplatte mit einer Kapazität von 146 GB, die für die Speicherung großer Datenmengen ausreicht, und einer Drehzahl von 10.000 U/min. Der zugehörige SCSI-Festplattencontroller ist der Adaptec19160 Ultra160-SCSI-Festplattencontroller. Bei der Einrichtung der Hardwareplattform müssen mehrere Punkte beachtet werden, da das System sonst nicht ordnungsgemäß funktioniert. Erstens: Obwohl die PCI-7300A_RevB-Karte ein verteiltes/aggregiertes DMA-Verfahren nutzt, ist ihr CPU-Ressourcenverbrauch sehr hoch. Tests haben gezeigt, dass nur ein Computer mit einem Pentium 4 1,7 GHz oder höher den reibungslosen Betrieb des gesamten Datenerfassungs- und Speichersystems gewährleisten kann. Zweitens: Windows-Systeme erlauben es mehreren Geräten, eine einzige Interrupt-Anforderungsnummer (IRQ) gemeinsam zu nutzen. Um die Echtzeitfähigkeit des Speicherprozesses sicherzustellen, ist es unerlässlich, dass der SCSI-Festplattencontroller und die PCI-7300A_RevB-Karte unterschiedliche IRQs verwenden. Dies kann im BIOS des Motherboards für PnP- (Plug & Play)/PCI-Geräte manuell konfiguriert werden. Schließlich unterstützen Windows 2000 Service Pack 2 (SP2) und ältere Versionen keine Festplatten mit mehr als 137 GB. Zuerst muss Service Pack 3 installiert werden. Anschließend muss der REG_DWORD-Parameter „EnableBigLba“ in der Registrierung (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Atapi\Parameters) hinzugefügt und sein Wert auf 0x1 gesetzt werden. Nur dann funktioniert eine 146-GB-Festplatte korrekt. 3. Software-Design: Das Software-Design bestimmt direkt, ob die Hardware ordnungsgemäß funktioniert und ihre Leistung voll ausgenutzt werden kann. 3.1 Funktionsprinzip von PCIS-DASK und Dual-Buffer-Modus: PCIS-DASK ist ein Treiberpaket von ADLINK für seine Produkte. Es bietet eine Reihe von API-Funktionen, die speziell für kontinuierliche Multi-Buffer-Operationen bei der Hochgeschwindigkeits-Datenerfassung entwickelt wurden. Mithilfe dieser API-Funktionen lässt sich auf Basis des Dual-Buffering-Prinzips eine kontinuierliche Datenerfassung und -speicherung in Echtzeit mit hoher Geschwindigkeit realisieren. Der Dual-Buffer-Modus ist in der Technik auch als „Ping-Pong“-Puffermodus bekannt. Im Vergleich zum üblicherweise verwendeten Einzelpuffermodus besteht der Vorteil des Doppelpuffermodus darin, dass er mit weniger Speicher auskommt und dennoch nahezu unbegrenzte Datenmengen kontinuierlich puffern kann (Ein- und Ausgänge müssen zusammenarbeiten). Das Funktionsprinzip dieses Puffermodus ist wie folgt: Zwei gleich große Puffer (im Folgenden als erster bzw. zweiter Puffer bezeichnet) werden im Speicher für die kontinuierliche Dateneingabe reserviert. Zu Beginn des Betriebs schreibt die Datenerfassungskarte zunächst Daten in den ersten Puffer. Gleichzeitig beginnt die Datenerfassungskarte, Daten in den zweiten Puffer zu schreiben, während das Benutzerprogramm bei Bedarf Daten aus dem ersten Puffer für die spezifische Verarbeitung abrufen kann. Sobald der zweite Puffer voll ist, beginnt die Datenerfassungskarte wieder am Anfang des ersten Puffers und schreibt neue Daten, indem sie die alten Daten überschreibt. Gleichzeitig ruft das Benutzerprogramm Daten aus dem zweiten Puffer ab. Der gesamte Datenerfassungs- und -verarbeitungsprozess kann in dieser Schleife fortgesetzt werden. 3.2 Einstellungen und Hinweise zum Board-Treiber: Ein tiefes Verständnis des Board-Treibers ist Voraussetzung für die Entwicklung effizienter Datenerfassungs- und Speicherprogramme. Im Modus der kontinuierlichen Dateneingabe muss der Treiber der Platine einen Puffer im Systemspeicher als sekundären Cache reservieren. Die Größe dieses Puffers kann vom Benutzer festgelegt werden. Gehen Sie dazu wie folgt vor: Öffnen Sie das Dialogfeld „DASK2000-Gerätetreiberkonfiguration“ über das Menü „Start/Programme/PCI-DASK/NuDAQ PCI-Konfigurationsprogramm“. Wählen Sie im Kombinationsfeld „Kartentyp“ den Eintrag „Pci7300A_RevB“ aus, geben Sie die gewünschte Puffergröße im Feld „DI“ ein und klicken Sie auf „OK“, um die Einstellung abzuschließen. Beachten Sie, dass zwischen der vom Treiber der Platine festgelegten Puffergröße (Treiberpuffer) und der vom Benutzerprogramm reservierten Puffergröße (Benutzerpuffer) ein bestimmtes Verhältnis besteht. Nach zahlreichen Tests haben wir festgestellt, dass die Kapazität des Treiberpuffers etwa dreimal so groß ist wie die des Benutzerpuffers. Daher treten Fehler auf, wenn der Treiberpuffer zu klein und der Benutzerpuffer zu groß ist. 3.3 Einrichten der Visual C++-Entwicklungsumgebung Um die von PCI-DASK bereitgestellten API-Funktionen für kontinuierliche Multi-Buffer-Operationen sowie die API-Funktionen zur Initialisierung des Boards und zur Einstellung des Betriebsmodus zu nutzen, muss Visual C++ die von PCI-DASK bereitgestellte dynamische Linkbibliothek (Pci-dask.lib) einbinden. Die Vorgehensweise ist wie folgt: Öffnen Sie das Projekt, öffnen Sie den Dialog „Projekteinstellungen“ über das Menü „Projekt/Einstellungen…“, wechseln Sie zur Registerkarte „Verknüpfen“, fügen Sie Pci-dask.lib im Abschnitt „Objekt-/Bibliotheksmodule“ hinzu und klicken Sie auf „OK“, um die Einrichtung abzuschließen. Fügen Sie abschließend die Header-Datei Dask.h zum Projekt hinzu. 3.4 Entwurf einer Multithread-fähigen Echtzeit-Datenspeichersoftware Um die Anforderungen an schnelle, Echtzeit- und kontinuierliche Datenerfassung und -speicherung zu erfüllen, muss das System Daten kontinuierlich erfassen und gleichzeitig in Echtzeit speichern. Andernfalls kommt es zu Datenverlust und -unvollständigkeit. Um dieses Problem zu lösen, haben wir Windows-Multitasking-Technologie in die Softwareimplementierung integriert. Im Programm werden zwei Worker-Threads erstellt, die jeweils die Datenerfassung und die Datenspeicherung übernehmen. Das Pufferungsverfahren nutzt den oben beschriebenen Doppelpuffermodus. Während der Datenerfassungsthread (SampleThreadProc) die erfassten Daten in den ersten Puffer schreibt, speichert der Datenspeicherthread (StorageThreadProc) die Daten aus dem zweiten Puffer auf der SCSI-Festplatte. Schreibt der Datenerfassungsthread Daten in den zweiten Puffer, speichert der Datenspeicherthread die Daten aus dem ersten Puffer auf der SCSI-Festplatte usw. In praktischen Tests erreichte der Adaptec 19160 Ultra160-SCSI-Festplattencontroller in Kombination mit einer Seagate ST3146707LC SCSI-Festplatte eine kontinuierliche Schreibrate von 80 MB/s, die die Erfassungsrate von 45 MB/s deutlich übertrifft. Bevor der Datenerfassungsthread also einen Puffer füllt, hat der Datenspeicherthread die Daten aus dem anderen Puffer bereits auf der SCSI-Festplatte gespeichert. Dieses Verfahren gewährleistet Echtzeitfähigkeit, Datenintegrität und Datenkontinuität. 3.5 Software-Implementierung Aus Platzgründen ist unten nur der Kerncode des Programms aufgeführt. BOOLEAN BufferID=0; // Puffer-ID; 1 für den ersten Puffer, 0 für den zweiten Puffer. BOOLEAN Stop=0; // Datenerfassung und -speicherung stoppen, 1: Stopp, 0: Fortfahren. U32 Buffer1 [data_size], Buffer2 [data_size]; // Blockpuffer zuweisen. FILE *fp; // Verzeichnis zum Speichern der Daten. UINT SampleThreadProc (LPVOID pParam) {BOOLEAN HalfReady=0; // Flag, das anzeigt, dass der Puffer voll ist do {HalfReady=0; do(DI_AsyncMultiBufferNextReady (card,&HalfReady,&viewidx)) // Warten, bis der Treiber meldet, dass der Puffer voll ist. } while (!HalfReady); // Wenn HalfReady!=0, // zeigt dies an, dass der Puffer voll ist. BufferID = !BufferID; AfxBeginThread(StorageThreadProc,NULL); //Starte den Datenspeicher-Thread
Read next

Zur Entwicklung und Anwendung der Drehzahlregelungstechnik mit variabler Frequenz in meinem Land

Die Drehzahlregelung mit variabler Frequenz (VFR) hat vielversprechende Zukunftsaussichten hinsichtlich Entwicklung und ...

Articles 2026-02-20