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!
26.01.2015, 18:32 (Dieser Beitrag wurde zuletzt bearbeitet: 26.01.2015 18:34 von Gesetzt.)
Im Grunde sollte es sich um ein einfaches Problem handeln. Ich will einen Befehl eingeben, dieser soll ausgeführt werden, aber beim nächsten Durchlauf soll das Texteingabefeld wieder leer sein, damit der gleiche Befehl nicht nochmal mitgenommen wird. Das gleiche Problem habe ich bei den 2 Cases die ich über Schalter steuern will.
Ich betätige den Schalter, dadurch wird der Befehl mitgenommen, aber ich muss den Schalter manuell wieder ausstellen, damit der Befehl nicht zweimal mitgenommen wird. Ich hätte mir vorgestellt den "True Status" zwischenzuspeichern, sobald man den Schalter drückt( dieser springt automatisch wieder zurück, das kann man umstellen hab ich gesehen), weiß aber leider nicht genau wie man das realisieren kann.
Der Vorschlag von Jens löst Dein Problem, so wie Du gefragt hast. Wenn aber kein neues Kommando eingegeben wird, dann wird nicht etwas Nichts an das Gerät gesendet, sondern es werden ununterbrochen Zeilenendezeichen gesendet - mit maximaler Baudrate. Vielleicht soll das so sein, aber vorstellen kann ich mirs nicht.
Vielen Dank schonmal für die Antworten. Ich kann Labview erst nächste wieder benutzen, bin aber bei einigen Dingen nicht sicher, ob ich sie verstanden habe.
Die Lösung mit der lokalen Variable verstehe ich nicht ganz, hab bis jetzt noch nichts damit gemacht in Labview. Also: Ich setze das Texteingabefeld als lokale Variable, sodass die Eingabe dort gespeichert wird. Nach VISA Write wird dann die lokale Variable des Eingabefeldes mit einem leeren String befüllt? Hab ich das richtig verstanden? Wenn ja, wie stelle ich denn sicher, dass die lokale Variable genau nach VISA Write hineingeschrieben wird?
Mit freundlichen Grüßen
Gesetzt
27.01.2015, 11:20 (Dieser Beitrag wurde zuletzt bearbeitet: 27.01.2015 11:20 von GerdW.)
Zitat:wie stelle ich denn sicher, dass die lokale Variable genau nach VISA Write hineingeschrieben wird?
THINK DATAFLOW!
Du musst per DATAFLOW sicherstellen, dass dieser Schreibzugriff erst nach dem VISAWrite erfolgt: packe eine flache Sequenz um deine lokale Variable und schließe den ErrorCluster, der aus dem VISAWrite herauskommt, am Rahmen dieser Sequenz an.
DATAFLOW: Eine Struktur/Funktion wird erst dann ausgeführt, wenn alle benötigten Inputs vorhanden sind!
Zitat:Ich setze das Texteingabefeld als lokale Variable, sodass die Eingabe dort gespeichert wird.
Du erzeugst eine lokale Variable deines Stringinputs.
THINK DATAFLOW: LabVIEW speichert Daten nicht in "Variablen", sondern in Drähten und Schieberegistern.
Lokale Variablen erlauben das Beschreiben von Controls und das Lesen von Indicatoren - und erzeugen (fast) immer Datenkopien der entsprechenden Daten.
Zitat:Nach VISA Write wird dann die lokale Variable des Eingabefeldes mit einem leeren String befüllt?
Ja, man schreibt in die lokale Variable und darüber in das Control…
Ich habe versucht die Tipps mal umzusetzen. Das Eingabefeld wird auch ordnungsgemaess geloescht, aber wenn ich wahrend dem Programmablauf einen neuen Befehl in das Eingabefeld eingebe wird dieser nicht mitgeholt beim naechsten Durchlauf, sondern der alte. Woran liegt das?
Zitat:wenn ich wahrend dem Programmablauf einen neuen Befehl in das Eingabefeld eingebe wird dieser nicht mitgeholt beim naechsten Durchlauf, sondern alte.
Solche Sachen kann mit mit Highlight-Debugging und Sonden wunderbar selbst herausfinden. Hast du das versucht?
Wie soll ich das anhand deines Bildes machen?
Hinweise:
- Du arbeitest mit einem TermChar. Lass also bitte das BytesAtPort weg und frage eine ausreichende Anzahl Zeichen ab! (Hier könnte eine Fehlerursache liegen!)
- Sende keinen leeren Befehl zum Gerät - es sei denn, dieses verlangt danach…
- Verstecke NIE die Labels von Terminals im Blockdiagramm!
- Wie schnell läuft deine Schleife momentan?
Wie Gerd schon sagte: Mit der Funktion bytes on Board hebelst Du die wunderbere Steuerung über TermChar wieder aus!
Deinem Bild nach ist klar, dass Du bei einem Schleifendurchlauf nicht die Antwort auf die Eingabe erhältst:
Mit "Senden" wird nur der Ausgabepuffer gefüllt, dass dauert 0 µs. Danach fragst Du ohne Warrtezeit ab, wie viele Bytes im Empfangspuffer sind. Zu diesem Zeitpunkt ist aber der Befehl noch nicht mal vollständig gesendet worden, von irgendeiner Antwort kann da noch gar keine Rede sein. Es ist nichts im Empfangspuffer - und wenn doch, dann deshalb, weil es nicht der erste Schleifendurchlauf war und sich die schließlich eingegangene Antwort aus dem vorangegangenem Schleifendurchlauf im Empfangspuffer befindet.
Also ich habe die String-Control jetzt geändert, sodass jedes mal der aktuelle Wert abgeholt wird. Das mit BytesAtPort werde ich aendern, auch wenn ich den Zusammenhang mit dem TermChar nicht verstehe( Vllt kann das jemand kurz erläutern?). Das mit dem leeren String ist eher eine Notlösung.
Natürlich würde ich es gerne so machen, dass der ganze Kram mit Visa Write nur ausgefuehrt wird, falls entweder einer der Schalter auf True steht, oder ein String eingegeben wurde. Meine Idee: Den Status von den Schaltern über ein logisches "Oder" verknüpfen. Zusätzlich müsste halt noch überprüft werden, ob etwas im Eingabefeld steht, also quasi wieder True oder False. Da weiß ich leider nicht, wie das mit Labview möglich ist. Das könnte quasi so aussehen: If "Empty String" then false else True. Die 3 könnte man dann über ein weiteres "Oder" verknüpfen und an eine Case Structure führen. Soviel zu meiner Idee. Das ganze sollte wenn möglich dann auch alle 500 ms überprüft werden.
Zusatzfrage dazu: Wenn ich jetzt den Befehl mit Enter bestätige, dann muss das ganze wieder in einer lokalen Variable gespeichert werden, oder merkt Labview sich automatisch die Eingabe bis abgefragt wird?