Hallo zusammen,
Ich bin ein relativ frischer LabView Nutzer und versuche Messdaten über eine serielle Schnittstelle auzulesen. Zur Problemstellung: Es sollen bis zu vier bürstenlose DC Motoren von Faulhaber des Typs 2232..BXCSD angesteuert werden. Dabei soll die Drehzahl vorgegeben werden, die Istströme und Istdrehzahlen ausgelesen werden.
Die Ansterung, d.h. die Drehzahlvorgabe, klappt sehr gut, das Auslesen von Iststrom und Istdrehzahl versuche ich mit VISA read and write Befehlen. Allerdings bekomme ich lediglich ein konstantes Signal mit dem Wert Null zurück.
Ich bin mittlerweile ziemlich ratlos, weil ich das Problem, das nur Nullwerte zurückgegeben werden, nicht verstehe. Meine Vermutungen sind, dass es entweder ein Problem der Taktung oder der Messdatenspeicherung ist.
Ich habe meine bisherige Lösung als VI angehängt und hoffe, dass sich vielleicht jemand die Mühe macht und mal drüberschaut. Für jeden Tipp, der hilft das VI zu verbessern und das Problem mit dem Auslesen der Daten zu lösen, bin ich sehr dankbar. Falls irgendwelche Informationen fehlen sollten, reiche ich die gerne nach.
Mit freundlichen Grüßen,
dtk[
attachment=33262]
Problem dürfte eher sein, dass du deine RS232 falsch konfiguriert hast.
Die steht auf "Termination Char" enabled, das Trennzeichen ist ebenfalls auf Standardwert=Linefeed. Das bedeutet, dass dein VISA-Read auf ein Linefeed als Ende einer Nachricht wartet.
Jetzt eine Vermutung: Deine Befehle, die du sendest, beendest du mit einem "Carriage Return". Ist möglicherweise das Trennzeichen für den Empfang von Nachrichten auch ein "Carriage Return"? Das kannst aber
nur du nach Blick ins Handbuch beantworten.
Weiteres Problem: Zu dem Fall "Visa Read" kommst du bei deinem Programm wahrscheinlich NIE, denn:
Direkt nach Absetzen einer Abfrage schaust du nach, wie viele Bytes im Empfangbuffer sind. So schnell ist keine RS232, dass da direkt danach der Zähler schon größer Null ist. Aber vielleicht brauchst du das gar nicht, denn wenn meine Vermutung mit CR als Trennzeichen zutrifft, dann kannst du dir die "Bytes at Port" Abfrage sparen.
Gruß, Jens
EDIT: Nachtrag: Ich habe inzwischen
das Protokoll gefunden. Das Linefeed als Abschlusszeichen für den Empfang von Nachrichten kannst du doch verwenden. Trotzdem oder gerade deshalb solltest du auf die "Bytes at Port"-Abfrage verzichten. VISA-Read erledigt für dich das Warten, bis die Antwort vollständig empfangen wurde.
Hallo Jens,
Vielen Dank für Deine ultraschnelle Antwort. An Probleme bei der Konfiguration hatte ich nicht gedacht und anscheinend auch nicht sorgfältig durchdacht. Werde ich morgen früh sofort überprüfen und Dir dann natürlich Feedback geben.
Viele Grüße,
dtk
Hallo zusammen,
ich habe den Vorschlag von Jens ausprobiert. Die Konfiguration habe ich nicht verändert, da es anscheinend so funktioniert. Die Bytes-at-port anfrage habe ich nun weggelassen. Stattdessen habe ich der Read funktion eine feste Bytezahl vorgegeben. Diese Bytezahl habe ich ermittelt, indem ich mir diese bei der Write Funktion anzeigen habe lassen. Zudem habe ich noch Visa-Clear Funktionen eingebaut.
Nun habe ich es einmal (!) geschafft Daten von 2 Motoren auszulesen. Als ich versuchte drei Motoren gleichzeitig anzusteuern ist mir der PC abgestürtzt. Seitdem bekomme ich nach einer gewissen Zeit immer einen Bluescreen und der Rechner startet neu, auch wenn ich lediglich 2 Motoren ansteuern möchte. Insgesamt würde ich gerne 4 Motoren parallel ansteuern.
Kann mir jemand erklären, an was dies liegen könnte und was man dagegen unternehmen muss? Ich habe das gegenwärtig benutzte VI angehängt und hoffe das sich jemand daran wagt
.
Gruß,
dtk[
attachment=33283]
Hallo dtk,
als erstes solltest du mal die Anzahl der lokalen Variablen auf ein Minimum reduzieren.
- Was soll es bringen, wenn du einen Wert gleichzeitig ins Terminal und in eine lokale Variable desselben Indicators schreibst? Reicht einmal schreiben nicht aus - oder willst du auf Nummer Sicher gehen?
- Wozu liest du Werte aus Controls aus und schreibst sie umgehend wieder in lokale Variablen der Controls? Um sicherzugehen, das sich der Wert nicht zufällig ändert?
- Warum haben diverse Controls/Indicators den selben Namen? Lernt man sowas bei text-basierter Programmierung?
Dann bitte alle mehrfach genutzten Konstrukte (diverse Cases etc.) in subVIs auslagern und damit dein HauptVI übersichtlicher gestalten. Dein BD umfasst momentan ca. 8 Screens meines Laptops - definitiv zu groß zum Fehlersuchen![/align]
Ich habe mir mal die Mühe gemacht, (fast) alle lokalen Variablen rauszuschmeissen, ebenso die meisten Sequenzen und das Ganze auf Arrays und For-Schleifen umzubauen:
[
attachment=33324]
Netter Nebeneffekt: Viel kleineres BD.
Gruß, Jens
P.S.: Die ganzen VISA-Clear und VISA-Flush sind ziemlich sicher ebenfalls überflüssig.
Hallo zusammen,
Ich wollte nur kurze Rückmeldung geben, dass nun alles ordnungsgemäß funktioniert. Für die erhaltenen Anregungen, konstruktiven Kritiken und erhaltene Hilfe möchte ich mich ganz herzlich bedanken!
Viele Grüße,
dtk