LabVIEWForum.de
Datenverlust beim RS232 auslesen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Instrument IO & VISA (/Forum-Instrument-IO-VISA)
+---- Thema: Datenverlust beim RS232 auslesen (/Thread-Datenverlust-beim-RS232-auslesen)



Datenverlust beim RS232 auslesen - Dominator - 20.04.2012 08:40

Hallo Leute,

mittlerweile läuft meine Routine nach einigen LabView Startschwierigkeiten ganz gut.
Ich habe jedoch ein Problem, welches ich und auch die anderen hier im Büro mit etwas LabView-Erfahrung nicht in den Griff bekommen.

Es geht um folgendes:
Ich kommuniziere über die RS232 mit einem MotionController der Firma Faulhaber + angeschlossener Motor.
Dabei gebe ich den Wert für die Geschwindigkeit vor und lese Regelmäßig den aktuellen Motorstrom sowie die Positionssignale der Hallsensoren des Motors aus. Funktioniert eigentlich alles Problemlos.
ABER: Ich habe, völlig unreglemäßig, mal alternierend, mal kurzfristig, mal länger, das Problem, dass mir beim Auslesen (oder danach vielleicht?) Teile des Strings den der Controller als Antwort zurück gibt fehlen. Um genau zu sein immer das erste ASCII-Zeichen. Schön zu beobachten ist das im Stillstand, wenn das Positionssignal konstant bleibt. Wenn mir der Controller also Position 9871276 übermittelt, wird oftmals nur 871276 ausgelesen. Der Wert wird mit der Sensor-Auflösung und der Getriebe-Übersetzung verrechnet. Meine Anzeige springt dann zb. zwischen 30 und 120 hin und her. Beim Strom das Selbe: Ich habe 120mA und hüpfe durch Verlust des ersten Zeichens zwischen 120 und 20 hin und her. Und das eben völlig nicht nachvollziehbar. Ich starte und hab keinen Fehler. Starte nochmal und hab einen. Dann passierts mal nur am Strom, dann nur bei der Position, manchmal auch beide... Manchmal scheint es sich zu ändern, wenn man die Position der Abfragen in der Flat Sequence Structure ändert. Beim nächsten Start ists wieder anders.

Ich habe die Sache soweit zurück verfolgt, dass ich weiß, dass bereits der "VISA Read" den Fehlerhaften String ausgibt.
Ich habe die Abfrage auch schon auf 2 verschieden Art und Weisen probiert, einmal selbstgebaute Sequenz und einmal einen Teil eingebaut, den ein Kollege mal von Faulhaber bekommen hatte. Beide haben das selbe Problem.

Wenn ich aber die Sequenz alleine in einem VI laufen lasse und mir z.B. nur den Positionswert hole ohne Nebenberechnungen, andere Abfragen etc., dann funktioniert es. Meistens zumindest.

Und, was immer funktioniert, ist die Abfrage mit der speziellen Software von Faulhaber. Es kann also eigentlich werder am MotionController noch an der Schnittstelle selber liegen.
Ich würd ja die Software beuntzen, aber die kann zu wenig, weswegen wir überhaupt erst auf Labview gegangen sind.

Wäre nett, wenn mir jmd ein paar Tips hätte.
Ist das Abfragen der Werte abhänig von der "Durchlauf-Frequenz" der Routine? Soweit ich weiß, meldet die Schnitstelle ja einfach nur, das Daten da sind und Labview hohlt das entsprechende Paket ab.

Grüße
Dominik


RE: Datenverlust beim RS232 auslesen - GerdW - 20.04.2012 09:41

Hallo Dominator,

dein VI bedarf mMn einer gründlichen Aufräumaktion...

Ich würde dir zu einer Statemachine raten, außerdem sind diese ganzen (quasi)parallelen Zugriffe auf eine Resource (hier: RS232) nicht so das Gelbe vom Ei. Unfein ist es auch, die Schnittstelle mittendrin zu schließen wie in dieser (unsinnigen, weil nur einmal durchlaufenden) Schleife zur Geschwindigkeitsabfrage.

Zitat:Ist das Abfragen der Werte abhänig von der "Durchlauf-Frequenz" der Routine? Soweit ich weiß, meldet die Schnitstelle ja einfach nur, das Daten da sind und Labview hohlt das entsprechende Paket ab.
Jein. Wenn du zu langsam abfragst, ist irgendwann der Lesebuffer voll...

Was soll das hier:
[attachment=39535]
Das ist RubeGoldberg vom Allerfeinsten:
- Wenn Bool2=TRUE dann FALSE sonst TRUE
- Bools in DBL (!) umwandeln
- DBL-Werte verrechnen (in einer FormulaNode!), um boolschen Wert, verpackt als INT32 zu erhalten
- INT32 dann wieder zu BOOL umwandeln und dabei auch gleich noch negieren
Wieso nicht einfach: z = NOT(B1 AND NOT(B2)) in schöner einfacher boolscher Algebra, die in LabVIEW mit einer einzigen Compound-Arithmetik-Node abgebildet werden kann... So z.B.:
[attachment=39536]


RE: Datenverlust beim RS232 auslesen - Dominator - 20.04.2012 10:39

(20.04.2012 09:41 )GerdW schrieb:  Hallo Dominator,

dein VI bedarf mMn einer gründlichen Aufräumaktion...

Ich würde dir zu einer Statemachine raten, außerdem sind diese ganzen (quasi)parallelen Zugriffe auf eine Resource (hier: RS232) nicht so das Gelbe vom Ei. Unfein ist es auch, die Schnittstelle mittendrin zu schließen wie in dieser (unsinnigen, weil nur einmal durchlaufenden) Schleife zur Geschwindigkeitsabfrage.

Hallo Gerd,

danke erstmal fürs Durchschauen!

Also dafür, dass ich vor ner Woche mit Labview angefange habe, find ichs gar nicht so schlimm Big Grin Wink
Auch wenn das bestimmt einfacher und ordentlicher geht, aber Profi in ner Woche is nich Wink Sad
Von dem was ich bis jetzt so gesehen habe, wäre diese Event-Struktur was feines... Gibts aber nicht im "Base-Pack".

State Machine... ich hab das mal gegoogelt, was konkret das für mich bedeuten soll... Naja ;D Hab mich schon mal schlauer gefühlt Big Grin

Also das einmalige Schließen und die Schleife hab ich rausgekickt. Ach ja, ich setzte die Geschwindigkeit, frage sie nicht ab.
Das mit den Aufrufen ist so ne Sache. Ich muss eben 2 mal aufrufen, weil der blöde MotionController das so will. Ich schick ihm den nen Befehl und bekomm die Antwort. Ich brauch regelmäßig Position und Stromstärke. Und ich kann nicht beides auf einmal abfragen, der liefert dann nur ne Rückgabe auf den ersten Befehl. Wenn ich Strom und Position beides gleichzeitig abfrage (mit: pos grc) bekomm ich z.B. nur die Antwort für pos. Deswegen das mehrmalige Zugreifen.

(20.04.2012 09:41 )GerdW schrieb:  
Zitat:Ist das Abfragen der Werte abhänig von der "Durchlauf-Frequenz" der Routine? Soweit ich weiß, meldet die Schnitstelle ja einfach nur, das Daten da sind und Labview hohlt das entsprechende Paket ab.
Jein. Wenn du zu langsam abfragst, ist irgendwann der Lesebuffer voll...

Hm, ok. Meine Routine läuft in der Tat ar***lahm. 2-3 Durchgänge pro Sekunde.
Denkst du, das wird durch's aufräumen besser?
Oder gibts da andere Tricks? Ich mein, das System ist kaum ausgelastet, also sollte theoretisch doch auch noch mehr gehn.

(20.04.2012 09:41 )GerdW schrieb:  Was soll das hier:

Das ist RubeGoldberg vom Allerfeinsten:
- Wenn Bool2=TRUE dann FALSE sonst TRUE
- Bools in DBL (!) umwandeln
- DBL-Werte verrechnen (in einer FormulaNode!), um boolschen Wert, verpackt als INT32 zu erhalten
- INT32 dann wieder zu BOOL umwandeln und dabei auch gleich noch negieren
Wieso nicht einfach: z = NOT(B1 AND NOT(B2)) in schöner einfacher boolscher Algebra, die in LabVIEW mit einer einzigen Compound-Arithmetik-Node abgebildet werden kann... So z.B.:

Big Grin Jaaaa, was soll ich sagen. Ich wusste nich, dass es dieses nette Instrument gibt. Bzw. das dieses Symbol genau das macht, was ich will. Aber hey... ich habs mir selber ausgedacht und es hat funktioniert!! Wink
Aber ich habs jetzt auch geändert, sieht deutlich schöner aus jetzt Wink
Danke für den Tipp.

Aber so was ganz konkretes, wie "mach das und das" dann hast du den fehler nicht mehr fällt dir nicht ein? Blush

Liebe Grüße
Dominik


RE: Datenverlust beim RS232 auslesen - Dominator - 20.04.2012 14:43

Hey Gerd,

also an der Software liegts nicht. Wir waren grad im Labor an nem anderen Rechner, da funktioniert alles Problemlos ohne Fehler. Big Grin

Gruß
Dome