LabVIEWForum.de
Interruptauswertung - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Interruptauswertung (/Thread-Interruptauswertung)



Interruptauswertung - brenner2305 - 19.10.2006 09:59

[attachment=3676][attachment=3676]Hallo alle miteinander!

Ich habe folgendes Problem:
Ich habe eine digitale Zählerkarte im Einsatz, an der Drehgeber angeschlossen sind. Die Karte ist von einem Fremdhersteller, also nicht von National Instruments. Bei der Karte handelt es sich um eine APCI-1710 von Addi-Data.com. Grundsätzlich wird LabVIEW natürlich unterstützt.
Meine Aufgabe ist es eine Messwerterfassung nach zu programmieren, die es bei uns schon für Delphi gibt. Die verwendeten Bibliotheken für Delphi sind natürlich auch unter LabVIEW vorhanden, so sieht es auf den ersten Blick nach einer Abschreibübung aus.
Meine Programmierung in LabVIEW sieht nun folgendermaßen aus:

Initialisierung der Messkarte und der darauf verwendeten Module.
( 2 Inkrementalzähler für die Drehgeber; 1 Timer als Zeitbasis um, die Messzeit zu erfassen; 1 Zähler, der nach eine bestimmten Anzahl von Impulsen von Geber 1, einen Interrupt auslöst. Darauf hin sollen die aktuellen Messwerte und die Zeit von der Karte in den Speicher des Rechners (bei mir Arrays) gelesen werden.)

While Schleife.
(Hier wartet das Modul für die Interruptauswertung auf einen Interrupt und speichert dann die Daten in die Arrays die Messdaten)

Deinitialisierung der Messkarte und der Module


In der While Schleife liegt nun mein Problem. Verwende ich keinen Timer, dann ist die Prozessorauslastung enorm hoch. Verwende ich einen Timer, dann sieht es so aus, als ob das Interrupt Modul nur einmal mit der Schleife ausgeführt wird und damit nur einen anstehenden Interrupt verarbeitet. Kommen jetzt sehr viele Interruptauslösungen herein, schafft es der Rechner nicht, sie alle abzuarbeiten. Es staut sich quasi. Und wenn keine neuen Daten mehr hereinkommen, also keine Interrupts mehr ausgelöst werden, arbeitet der Rechner immer noch die alten Interruptauslösungen ab, obwohl ja eigentlich keine neuen Daten mehr im Speicher der Karte vorhanden sind. Ich hoffe das war verständlich.

Der Delphiprogrammierer meinte nun Folgendes:
Das Intrruptmodul sollte aus der While Schlife herausgenommen werden und parallel zur Schleife aktiviert sein. Wird ein Interrupt ausgelöst, dann hat dieser Vorrang vor der While Schleife und wird abgearbeitet (Daten speichern), während die Schleife getoppt wird. (Vorher wurde der Interrupt ja erst nach einem Schleifendurchgang bearbeitet) D. h., die Schleife könnte ja dann auch mit einem großzügigen Timer ausgestattet sein (10 ms oder 100 ms).
Leider fällt mir keine Lösung ein dies so zu realisieren und ich hoffe jemand kann mir da weiter helfen.

Ich hänge mal meine Datei mit an. Beim Öffnen gibt es eine Fehlermeldung, dass bestimmte Bibliotheken nicht gefunden werden, was klar ist, da bei euch die Messkarte nicht installiert ist. Aber die Struktur und der Aufbau des Programmes sollten erkennbar sein. Falls dieses Programm anders aussehen sollte, als ihr das gewohnt seid, ich habe mich bei der Programmierung durch Beispiele vom Messkartenhersteller anleiten lassen.

Schönen Gruß aus Dresden.


Interruptauswertung - IchSelbst - 20.10.2006 15:15

Ich empfehle folgendes: Hast du LabVIEW, nimm NI-Karten. Hast du NI-Karten, nimm LabVIEW. Und zwar deswegen, weil der DAQMx alles handwarenahe für dich erledigt. Eine Nicht-NI-Karte würde ich nur dann einsetzen, wenn der DAQMx diese Karte beherrscht.

Normalerweise müsstest du für diese Karte einen Callback, der durch einer Interrupt von der Karte aktiviert wird, bereitstellen um eine saubere Datenerfassung machen zu können. Ohne diese Funktionalität bleibt dir quasi nur pollen - mit allen bekannten (und noch unbekannten) Problemen. Und eben diese Funktionalität beherrscht der DAQMx.

Und noch eine Anmerkung:
"LV-Treiber" wie der von AddiData sind keine Treiber, sondern DLL-Aufrufe in VI-Form. Ich halte solche Treiber für eine sinnvolle Datenerfassung für ungeeignet.

Nichtsdestoweniger kannst du natürlich diese Karte auch gepollt mit LabVIEW betreiben. Es kann ja sein, dass dein Anwendungsfall das zulässt. Das halte ich aber nur für eine halbe und auch nur eine Notlösung.

Für deinen Anwendungsfall könnte ich mir folgendes vorstellen:
Verlagere den Teil, der "den Interrupt pollt", in eine eigene While-Schleife, die möglichst schnell pollen kann. Tritt ein Interrupt ein, so kannst du die Daten mittels einer Queue weiterleiten. In der "Hauptschleife", die die Daten z.B. anzeigt, liest du die Queue aus. Das kann dann aber langsam geschehen.


Interruptauswertung - brenner2305 - 23.10.2006 14:25

Schönen Dank erstmal für die Tipps!
Ich bin schon fasst soweit, dass ich dir darin zustimme, dass mit dieser Messkarte keine vernünftige Datenerfassung mit LabVIEW möglich ist. Aber noch habe ich nicht aufgegeben. Ich habe mich inzwischen mit dem Kartenhersteller in Verbindung gesetzt und bin gespannt, was die mir für Lösungsmöglichkeiten für meinen Anwendungsfall aufzeigen. Denn wenn die schon Unterstützung für LabVIEW anbieten, sollte das ja auch einigermaßen funktionieren.
Mit der Messkarte verhält es sich so, dass sie vor Begin meines Projekts schon vorhanden war. An der Uni ist leider kein Geld vorhanden, um für den eigenen Anwendungsfall immer neue Hardware zu kaufen und so muss ich leider damit klarkommen. LabVIEW habe ich gewählt, da erstens die Software verfügbar ist und die Karte LabVIEW unterstützt (theoretisch). LabVIEW halte ich auch für gut geeignet, da man sich als nicht Programmierer einfacher in die grafische Programmierung einarbeiten kann als z.B. in den Code von C++ oder Delphi. Wenn die Sache mit LabVIEW nicht klappen sollte, dann hätte ich viel Zeit und Aufwand umsonst in meine bisherige Arbeit gesteckt. Das wäre Katastrophal! Ich hoffe es kommt nicht soweit, dass ich auf eine andere Programmiersprache umsatteln muss.

Also wünsche ich uns allen viel Erfolg und maximalen Wirkungsgrad!
Gruß aus Dresden!


Interruptauswertung - IchSelbst - 23.10.2006 14:45

' schrieb:sollte das ja auch einigermaßen funktionieren.
Was "einigermaßen" bedeutet, darüber lässt sich streiten.

Aber mir ist da noch ein Weg eingefallen. Die Uni hat kein Geld, und LV kann die Karte nicht. Ersteres weis der Professor, letzteres wird er ja wohl einsehen, er müsste da Abhilfe schaffen. Da ist es nur recht, wenn er einen - erfahrenen - Programmierer sucht, der den bereits vorhandenen, zum Ansprechen der Karte notwendigen Teil in eine DLL auslagert. Du bekommst dann die DLL und kannst mit der dann in LV weitermachen. Du musst dich nur mit dem DLL-Programmierer auf eine Schnittstelle einigen.