Nur ausgewählte Kanäle scannen.
Danke für die Antwort!
Wie ich schon befürchtet habe bin ich nicht ganz verstanden worden.
Ich weiss auch nicht wie ich es besser erklären soll.
Also 1. bekomme ich keinen Fehler. Ich füge auch nur die Kanäle zu meiner "Scanliste" hinzu, die ich auch scannen möchte.
Diese lese ich dann auch nur aus.
Ich habe hier den entsprechenden Sourcecode in C++ gefunden für das Scannen von 2 Kanälen, anhand ich die Problematik nochmal erkläre.
P1202_AddToScan(0,0,1,0,0,0); /* CH:0 */
P1202_SaveScan(0,data[0]); /* Ch0 und Array um die Daten zu speichern(IN/OUT Parameter als Pointer) */
P1202_AddToScan(1,0,1,0,0,0); /* CH:1 */
P1202_SaveScan(0,data[1]); /* Ch1 und Array um die Daten zu speichern(IN/OUT Parameter als Pointer) */
P1202_StartScan(200,DATACOUNT); // Total sampling rate: 8M/200 + Anzahl der Abtastwerte
Um das in LabVIEW umzusetzen habe ich eine stacked sequence mit 6 Frames. In denen ich analog zu dem code die funktionen in dieser reihenfolge aufrufe.
Dabei ist die Funktion SaveScan in LabVIEW anders umgesetzt, da es in LabVIEW ja keine Pointer gibt. also gibts hier einen Input-Parameter, der ein initialisiertes Array übergeben wird, und ein Outputparameter, den ich als sequence local speichere. Im 6. und letzten Frame lese ich dann die Daten über die sequence local aus.
Soweit funktioniert das auch. Jetzt würde ich aber gerne nur den ersten oder nur den zweiten Kanal (oder beide) auslesen. Also ein kleines KonfigurationsVI erstellt mit zwei boolschen Variablen, die Angeben welcher Kanal gescannt werden soll.
Dann habe ich die Frames in denen die Funktionen addtoscan und savescan aufgerufen werden mit einer case-structure versehen und die Funktionen in die case-structure verlagert. Die boolschen Variablen mit den entsprechenden Case-Structeres verbunden, sodass nur wirklich die Kanäle in die Scanliste aufgenommen werden, die ich scannen möchte. Ausserdem musste der Rückgabewert der FUnktion addToScan über die Case-Structure getunnelt werden, um diese als sequence local anzulegen. Und genau da scheint das Problem zu liegen. Denn nun kommen im letzten Frame, wo ich die "Rückgabewerte über die sequence local" mit den Abtastwerten auslesen, keine Daten mehr an.
Also der einzige Unterschied zwischen den beiden Varianten ist, dass der eine Rückgabewert über die case-structure getunnelt wird. Da ja ganeu dieses in c++ als pointer übergeben wird, sodass die Funktion einen zu beschreibenden Speicher zur Verfügung gestellt bekommt, verhält sich das in LabVIEW ewas anders und leider auch unerwartet. Wenn jemand Erfahrung hat mit der Einbundung von Funktionen einer dll-Datei, wo genau dieser Sachverhalt vorliegt, also wo der Übergabe-/Rückgabeparameter ein Pointer ist.
Genauer kann ich es nicht beschreiben. Kann das vi leider nicht hochladen, da man die dll-Datei benötigt.
Tom
|