Timing bei Prüfprogramm mit VISA-Schnittstelle

Gast #7283382
Hallo zusammen,

ich schreibe gerade ein Nadeladapter-Prüfprogramm für Platinen in C#. 
Als Prüfgerät dient der Multimetereinsatz eines Agilent 34972. Das ganze 
spreche ich per VISA-Schnittstelle über USB an.
Soweit funktioniert das auch ganz gut, eine Sache wäre aber noch 
optimierbar bzw. ist mir auch einfach nicht ganz klar.

Möchte ich eine Spannung Messen mach ich das aktuell beispielsweise mit 
folgendem Code:
1
agilent_string = "MEASure:VOLTage:DC? 100, 0.00003, (@101)\n";
2
viError = visa32.viPrintf(session, agilent_string);
3
Thread.Sleep(3000);
4
viError = visa32.viScanf(session, "%lf", value_d);

Das funktioniert, is aber unschön, weil die 3 Sekunden Wartezeit 1. 
unflexibel sind und 2. das ganze schneller laufen könnte. Rufe ich das 
viscanf zu schnell auf, kommt mist.
Nun drängt sich natürlich die Frage auf, ob es da nicht einen Befehl 
gibt, wo das gewarte ein Ende hat und ich direkt aus der Funktion 
zurückkomme wenn das Gerät gelesen hat. Quasi ein kombiniertes 
printf&scanf, und die Wartezeit dazwischen wird automatisch eingehalten.
Sorry, falls es eine doofe Frage is, aber es is das erste mal, dass ich 
mit der VISA-Schnittstelle arbeite.

Beste Grüße und vielen Dank,
Fabian
Gast #7283527
Hallo,

schau mal ob ein query nach "*opc?" hilft.
Das sollte blockieren bis die "operation complete" ist, danach kannst du 
regulär die Daten lesen. visa timeout beachten!

Grüße
Gast #7284384
Hallo Chris,
die Idee is gut, leider bekomme ich es aber net hin. Evtl. passt auch 
die Syntax nicht:
[pre]
agilent_string = "MEASure:VOLTage:DC? 100, 0.00003, (@101)\n";
viError = visa32.viPrintf(session, agilent_string);
viError = visa32.viPrintf(session, "*OPC?\n");
viError = visa32.viScanf(session, "%lf", value_d);
[\pre]

Irgendwo hatte ich noch gelesen, man solle ein read nach dem *OPC? 
schicken, aber auch das hat nicht funktioniert. im value_d steht dann 
immer der Wert "0".

Hat sonst noch jemand Vorschläge? Hatte erwartet hier arbeiten viele mit 
diesen Geräten?:-O

Beste Grüße,
Fabian
#7284423
*OPC? und deine Messung schreiben doch in den selben Output-Buffer, dass 
funktioniert von der Reihenfolge schon nicht.

Was gehen könnte wäre vielleicht (nicht ausprobiert):

CONFigure:VOLTage:DC
INIT
*OPC?
blocking read
FETC?
blocking read

Allgemein auch mal das *ESE kontrollieren.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.