Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ärgerliches Problem.
Ich steuere ein Keithley Multimeter über RS232 mit VISA an. Die Kommunikation senden/empfangen (SCPI) klappt prinzipiell.
Irgendwann taucht aber Fehler 1073807339 auf, soll heißen, ich will Daten lesen obwohl nichts anliegt. Es wird auch angezeigt, dass 0 bytes anstatt 16 Bytes ausgelesen werden.
Da zum K2000 und Fehler 1073807339 schon im Forum/Netz einiges zufinden ist, habe ich auch einiges ausprobiert:
- Timeout zwischen Schreiben und Lesen erhöht (ändert nix)
- Baudrate, Flußkontrolle, Abschlusszeichen variiert (ja, an Hard- und Software) (hilft nix)
- NI Treiber für KE2000 probiert (error im subsubsubsub...-vi)
- erst in Gerätespeicher schreiben und dann auslesen (ebenfalls nix)
Im angehängten vi habe ich bspw. "fetch?" in der Schleife laufen. Das geht mal 50, mal 200 mal gut, und dann kommt die Fehler-Meldung.
Das folgende beruht nur auf Halbwissen und behebt auch die Ursache nicht (ohne das Gerät eh schwierig), aber vielleicht hilfts ja:
Bricht die Kommunikation komplett ab, oder sind das nur einmalige Ausfälle? Wenn bei 1000 Messwerten mal einer verloren geht, ists ja ned so schlimm.
Vielleicht hilfts ja wenn Du ein Event einfügst, dass er bis zum Eintreten mit dem Lesen wartet.
Oder aber Du verringerst die Schleifenanzahl und lässt häufiger initialisieren.
Jaja, keine eleganten Lösungen. Wenns nich hilft, einfach ignorieren.
Aber mein Vorschlag ist die Wartezeit wegzumachen und stattdessen das Timeout z.B. auf 1000 zu erhöhen. Und falls so ein Fehler kommt den Befehl noch Mal zu senden.
Aber wenn er das macht und ein Error auftritt wird er doch niemals etwas lesen können weil der Fehler im Schieberegister erhalten bleibt. Oder soll er am Ende den Fehler quittieren? Wenn ja, wozu soll der Nichtfehler dann zur nächsten Iteration durchgeschliffen werden?
Ich mache es z.B. immer so und verstehe immer noch nicht wozu der Fehler im Schieberegister:
' schrieb:Aber wenn er das macht und ein Error auftritt wird er doch niemals etwas lesen können weil der Fehler im Schieberegister erhalten bleibt. Oder soll er am Ende den Fehler quittieren? Wenn ja, wozu soll der Nichtfehler dann zur nächsten Iteration durchgeschliffen werden?
Es kommt halt darauf an, ob es was ausmacht, wenn Daten fehlen.
Was ist, wenn schon vor der For-Schleife ein Fehler auftritt?
Ich vermute, dass der Befehl nicht geschrieben werden konnte, und daher das lesen Fehler macht.
Ich gehe weiter davon aus, dass er kein Wait mehr hat, ich weis nicht wer sowas macht. Schauen ob es Daten hat, und dann lesen ist meiner Meinung nach das einzig richtige Vorgehen.
Wenn dann ein Fehler auftritt, wird die For-Schleife (??) ohne schreiben, lesen noch die Anzahl N gemacht, da die Funktionen bei Fehlereingang nichts mehr machen.
Aber, dein Vorschlag geht auch und ist einfacher.
EDIT: So wie in deinem Bild, braucht es das SR nicht, da gebe ich dir Recht, Peter04 macht es aber "noch" nicht so
.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu machen <--(¯`·.
07.11.2008, 15:18 (Dieser Beitrag wurde zuletzt bearbeitet: 07.11.2008 15:29 von Lucki.)
Das kann doch auch an der Gegenstelle liegen, daß sie manchmal nichts sendet. Wenn es so selten ist, dann ist doch die Frage für Dich: brauche ich dieses eine Datenelement wirklich, oder kann ich mir leisten, dieses Datenelemant auzuslassen.
Hier zwei Beispiele zur Fehlerbehandlung:
Zitat:Irgendwann taucht aber Fehler 1073807339 auf, soll heißen, ich will Daten lesen obwohl nichts anliegt.
Die Formulierung gefällt mir gar nicht, und in Verbindung mit der überflüssigen Wartezeit vor dem Lesen (Worauf Eugen schon hinwies), beweist es, daß Du die Funktion Lesen noch nicht richtig verstanden hast.
Also: Daß im Moment des Aufrufs des Lesen-VI noch kein Daten im Buffer sind, ist ganz normal und kein Grund für eine Fehlermeldung. Das VI wartet dann geduldig, und zwar so lange, bis eines von dem geschieht:
1.) das Abschlußzeichen wird detektiert
2.) die vorgegebene Anzahl von Bytes ist erreicht
3.) Timout ist erreicht.
Bei 3.) kommt eine Fehlermeldung und man hat keine gültigen Daten am Ausgang.
Ich würde auch mal die Reaktionszeiten protokollieren und sehen, ob sie stark schwanken, und das Timout sehr hoch nehmen: