LabVIEWForum.de - LV Bsp: Basic 2 Port Serial Write and Read.vi o. Timeout

LabVIEWForum.de

Normale Version: LV Bsp: Basic 2 Port Serial Write and Read.vi o. Timeout
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi!

Habe beschlossen noch einmal von von anzufangen...
Bin gerade dabei das LV Beispiel "Basic 2 Port Serial Write and Read.vi" zu modifizieren.

Habe bisher aber so keine Änderungen vorgenommen.
Das Programm läuft wunderbar durch, dann aber, nach dem VISA geschrieben hat, tritt ein Fehler auf, -1073807339 - Timeout abgelaufen, bevor Operation vollständig.
Mach ich hier dann ok, schau in meine Ausgabefelder (read string) dann stehen dort aber die Werte, die ich über den Port gesendet habe (Werte aus string to write).

Warum kommt hier dann ein Timeout?!
Hi Sarah,

das Serial Read ist erst dann befriedigt, wenn es die Ende Marke bekommt
(möglicherweise ist das das Problem).
Dans Endbyte kannst Du beim Serial Config angeben, meist n (Linefeed)
oder r (return), 3 bei Binärdaten etc. - das geht mit VISA ebenso wie mit
"native" Routinen.

Grüsse von der Achse A8 Ulm/Stgt./München,
Robi
Robi Biswas schrieb:Hi Sarah,

das Serial Read ist erst dann befriedigt, wenn es die Ende Marke bekommt
(möglicherweise ist das das Problem).
Dans Endbyte kannst Du beim Serial Config angeben, meist n (Linefeed)
oder r (return), \03 bei Binärdaten etc. - das geht mit VISA ebenso wie mit
"native" Routinen.

Grüsse von der Achse A8 Ulm/Stgt./München,
Robi

Hallo Robi!

Hmm, also das Feld "Abschlusszeichen" denk ich mal.
Dort steht ja (0xA='n'=LF)
Was bedeutet das?
Und in dem Feld darunter kann man nur Ziffern und Buchstaben wählen, aber so nichts schreiben.
Abschlusszeichen ist auch aktiviert.
Und bei dem oberen ist A voreingestellt.


Edit:

Was ich eben gesehen habe, wenn ich das Beispiel einfach so ohne Änderungen laufen lasse, dann gibts keine Probleme, auch kein Timeout.
Kopier ich nun das ganze, das ich auf zwei Stellen über die Ports testen kann, geht es nicht mehr ohne diese Meldung. Pack ich jedes in eine Schleife, auch nicht, pack ich jedes in einen Case mit Button auch nicht, immer wieder kommt dann das Timeout.
Ich geb doch aber verschiedene Ports an, also einmal 3 und 4 und dann 5 und 6.
Mit nur einem, läuft es bei beiden Angaben.
Warum meckert er nun wenn ich das ganze nur verdoppel?!
Am Ende brauch ich bis zu zwölf und nun gehts nicht mal mit zwei :-s
Hi Sarah,

stell doch mal Dein Beispiel rein..

Grüsse,
Robi
Robi Biswas schrieb:Hi Sarah,

stell doch mal Dein Beispiel rein..

Grüsse,
Robi

Huhu Robi,

oder so, mal schauen, aber sollte alles "passend" verbunden sein :roll:
Hab versucht das Chaos in Grenzen zu halten *gg*


Edit:
Wenn ich alle zusammen laufen lasse dann bekomm ich die Meldung
VISA: Unzulässige Information zu Speicherort, oder Device oder Resource ist nicht im System vorhanden.
Kann das wegen dem weiteren Port sein?
Hab eben in meinem System geschaut, laufen sollten bei mit Port 5 und 6 und 3 und 4. Die hab ich auch eingestellt. 5 und 6 laufen, hab nun sogar mal eine grüne LED bekommenSmile
Hi Sarah,

hab mal in Dein Beispiel reingeschaut und folgende comments:

1) warum schreibstest Du auf unterschiedl. Ports?
Kommt auf com6 die answer von com5? Nehme an ja.

2) wenn das so ist, warum liest Du nicht NACH dem schreiben?

3) Jeder Serial Port muss nur 1x geöffnet und 1x geschl. werden,

also:
a) erstelle eine Routine "Sarah_Serial Open.vi" mit Configuration Teil
B) erstelle eine Routine "Sarah_Serial Send and Receive.vi" mit Timeout
stelle Message und Answer auf Code Display. Wichtig: Hänge an Deine Message
ein Linefeed (rosa Pfeil nach unten) dran!! (Im Code Display = n)
c) erstelle eine Routine "Sarah_Serial Close.vi", die auch im Error Case aufräumt.
d) mach die R. "Sarah_Serial Send and Receive.vi" reentrant (VI Properties)
e) erstelle/verwende zusätzlich eine Routine "Sarah_Serial Clear.vi", die vor dem
schreiben erstmal nicht abgeholten Müll aus der Leitung saugt!!!
f) setze "Bytes to Read" auf z.B. 255, um alles abzuholen, Dein Gerät muss dann auch ein
Linefeed (0x0A oder n) an die Antwort anhängen, was das Lesen beendet.
g) Stelle mit MAX sicher, dass die Ports auch im System existieren com1=ASRL::1

Connector Tip "Sarah_Serial Send and Receive.vi":
- immer 4er Pattern verwenden (unterste Reihe 3. v. li.)
- immer u. li.=err in, u. re=err out (Error Cluster ist das wichtigste bei LabVIEW)
- immer o. li.=message, o. re=answer
- oben 2 für Visa Ports
- Clustere die Port Config Daten und schleif sie ni. immer mit, es ist Ballast.

Vermutung:
Du hast konkurrierende Prozesse auf verschiedenen Write/Read Ports, und dann jedesmal mit Config,
dazu mit begrenztem "Bytes to Read". Irgendwas beisst sich, oder es liegt noch Müll in der Leitung.


Bisle viel? Gute Übung, die hilft für weitere Projekte. Wenns nich klappt, melde Dich nochmal.

Grüsse aus Ulm,
Robi

robi@biswas.de
Uiiiii... ob ich das alles so hinbekomm... auf die Schnelle mal ein paar Antworten.

Zitat:1) warum schreibstest Du auf unterschiedl. Ports?
Kommt auf com6 die answer von com5? Nehme an ja.
Ja, es soll auf 3 geschrieben/gelesen werden und dazu auf 4 gelesen/geschrieben werden
Das selbe mit 5 und 6.
Zitat:2) wenn das so ist, warum liest Du nicht NACH dem schreiben?
Weil es so im LV Beispiel war und da es von LV ist denk ich das wird schon richtig sein, immerhin haben die ja auch LV erstellt :roll:

Zitat:3) Jeder Serial Port muss nur 1x geöffnet und 1x geschl. werden,
Hmm, ok, nur ich hab ja in dem Fall zwei mal auszuwählende Ports. Und ich kann an ein "Visa seriellen Port konf." nur einen Port per Bedienelement anschließen. Darum auch alles doppelt. Außer du sagst mir, das man es doch irgendwie anderst machen kann...
Dann, im LB Beispiel gab es Visa öffnen nicht, fand ich seltsam, aber da es beim ersten Durchlauf immer mal wieder zu keinem Error kommt, warum auch immer, geht es ja so auch, werde nun aber dennoch mal ein open bei jedem rein machen.

Zitat:B) erstelle eine Routine "Sarah_Serial Send and Receive.vi" mit Timeout stelle Message und Answer auf Code Display. Wichtig: Hänge an Deine Message
ein Linefeed (rosa Pfeil nach unten) dran!! (Im Code Display = n)
Meinst du hier das Timeout das man unter Visa findet?!
Und was meinst du "stelle Message und Answer auf Code Display"?
Ist das dann eine Zeilenvorschubkonstante? Was kann diese? In der Hilfe steht kaum etwas, das mit weiterhelfen könnte :?
Zitat:c) erstelle eine Routine "Sarah_Serial Close.vi", die auch im Error Case aufräumt.
Meinst du hier Visa zurücksetzen oder einfach einen leeren String setzen?

Zitat:reentrant
Was ist in dem Fall anderst? Klar kann es einstellen, aber in dem Fall wüßte ich nicht was dahintersteckt Sad

Zitat:f) setze "Bytes to Read" auf z.B. 255, um alles abzuholen, Dein Gerät muss dann auch ein
Linefeed (0x0A oder n) an die Antwort anhängen, was das Lesen beendet.
Die Größe ist ja erst mal Nebensache denk ich. Für den ersten Test reichen 10 Zeichen aus. Es soll ja nur sichergestellt werden, das die Kommunikation über die jeweiligen Ports steht, also wird ein Wert von 0123456789 geschickt und damit man auch sagen kann es kam auch "drüben" an auf dem anderen PC (weil beim Programmieren kann ich es erst mal nur an einem PC testen mit RS232 drum auch die beiden Kabel), wird es dort per Scrit zu 9876543210 und das kommt dann auch bei mir wieder an.
Nur wie kann ich nun etwas anhängen? Das müßte ja dann das Script machen, welches auch den Wert umkehrt, oder?
Zitat:g) Stelle mit MAX sicher, dass die Ports auch im System existieren com1=ASRL::1
Das hab ich schon von Anfang an festgelegt, der hatte mir anfangs immer mal wieder den "echten" Namen angezeicht, aber das macht er nun auch nimmer. Ist dort soweit alles vergeben.

Zitat:- Clustere die Port Config Daten und schleif sie ni. immer mit, es ist Ballast.
Wie mach ich das am besten?

Ja, Fragen über Fragen *g*... :roll:
Moin Sarah,

zu 1)
auf com3 sitzt also der Client, der Fragen stellt, auf com 4 der Server, der Fragen beantwortet. Es spricht nix dagegen den

Client: mit einem Write......Read (Timeout) sequentiell zu gestalten,

und den

Server: mit einem Read (langes oder unendl. Timeout) mit anschliessendem Write, beides innerhalb einer While Loop, so das der
Server auf die Frage wartet, richtig?

zu b: Timeout
entweder Du nimmst das Timeout von Visa, oder Du tust das Read in eine Loop, wo Du die vorhandenen Bytes in der Leitung pollst. So realisiert man
einen Timeout.

Code Display: (keine Ahnung wie das deutsche LabVIEW es nennt)
ist die Darstellungsform eines Strings. Rechte Maustaste auf das string control .....

zu c) Close:
ein VISA Close, um die Schnittstelle wieder freizugeben.

reentrant:
Eine reentrante Routine kann parallel an anderer stelle aufgerufen werden,
ohne dass die beiden sich gegens. blockieren. Es laufen quasi 2 unabh. Kopien im Speicher.

zu f)
Die Grösse ist dann nebensache, solange Du alles au der Leitung abholst,
wenn also die Endmark kommt.
Gleichwohl musst Du beim Handshaketyp "Endmark" immer eine solche
an Deine Message dranhängen, damit der andere weiss, wann Du mit reden fertig bist. Anhängen tust Du mit dem String tool Concatenate.


"Clustern": Wenn Du zuviele Drähte hast, nehme ein leeres Cluster und
tu alles zusammengehörende rein.

hilft das erstmal?

Grüsse aus Ulm
Robi
Referenz-URLs