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!
28.12.2007, 17:21 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2007 17:22 von IchSelbst.)
ja Dein Programm ist nicht viel gewachsen bis auf eine Funktion die den Port öffnet und eine die vom Port Daten abholt. Trotzdem im Anhang, Version 8.2.
das funktioniert. Habe jetzt das ganze noch durch ein "array to cluster" und "unbundle" erweitert um mit den einzelnen Elementen weiter arbeiten zu können.
Momentan ist meine Aktualisierungsrate des Mikroprozessors höher als die Zeit die das Programm wartet um Daten zu sammeln. Zum einen ist das gut, da es so nie dazu kommt das die Werte wieder auf null zurückfallen. Andererseits kommt es vor das das Programm so zwei Datensätze sammelt. Eigentlich fast egal, die Elemente sind ja immer noch an ihrer stelle. Nur wird der zweite Datensatz nicht verwertet.
Jetzt müsste ich
- es so Gestalten das die Daten behalten werden, zumindest für mehrere Zyklen damit die Anzeigen nicht auf null zurückfallen (dies z.B. wenn die Aktualisierungsrate des µC geringer ist als die Zeit um sammeln von LabVIEW)
- Wenn das Ende empfangen wurde dann array Löschen. Also hab ich in der While Schleife jedes Element auf 0xC0 überprüft, falls ja, dann Zähler der Schleife zurück auf null. Geht aber leider scheinbar nicht
z.B. so vorgehen:
Ich mach mir ein SubVI, das nichts weiter tut, als die Serielle Schnittstelle zu bearbeiten. Dieses SubVI besteht aus einer Statemachine (guckst du Onlinehilfe von LV bzw. Internet etc.) - eine Statemachine ist eine Whileschleife mit einer Case-Sequenz drinnen. Es gibt da z.B. folgende States: VISA konfiguriueren, VISA öffnen, Daten lesen, VISA schließen, SubVI beenden, etc. Das SubVI selbst wird mittels einer Queue (guckst du wieder Onlinehilfe und Beispiele) gesteuert, d.h. welcher State ausgeführt werden soll, wird von außen über die Queue mitgeteilt. Hauptsächlich wird sich dieses SubVI - das einmalig gestartet wird und dann prinzipiell ewig läuft - sich also im State "Daten lesen" befinden. Immer wenn ein Datensatz gelesen wurde, wird der in eine Queue (oder einen Melder (den wieder nachlesen)) geschrieben und somit ist der Datensatz für die Außenwelt verfügbar.
Zitat:das die Daten behalten werden, zumindest für mehrere Zyklen damit die Anzeigen nicht auf null zurückfallen (dies z.B. wenn die Aktualisierungsrate des µC geringer ist als die Zeit um sammeln von LabVIEW)
Das kannst du machen, indem du die Daten in einen Melder schreibst. Dort bleiben sie dann stehen, bis sie überschrieben werden. "Herausholen" aus dem Melder tust du sie NICHT mit "Meldedaten lesen" (hiermit würden sie gelöscht werden), sondern mit "Meldestatus lesen" (hiermit sind sie bei jeden Lesen verfügbar). Wenn du die Daten z.B. nur Anzeigen willst, ist ein Melder ausreichend. Wenn du sie z.B. mit einem Timestamp abspeichern willst, würde ich eine Queue nehmen. Queues sind flexibler einsetzbar, bedürfen aber einen ausführlicheren Programmierung.
Zitat:Wenn das Ende empfangen wurde dann array Löschen. Also hab ich in der While Schleife jedes Element auf 0xC0 überprüft, falls ja, dann Zähler der Schleife zurück auf null.
Das würde im SubVI alles automatisch gehen.
Die Sache mit dem SubVI ist aufwändig. Da hab ich bisher keine Lust gehabt, eine Mustervorlage zu erstellen. Aber wer weiß, das Jahr ist ja noch lang. Ich hab mal angefangen, eine Whileschleife zu machen, die praktisch zeichenweise einen Datensatz lesen könnte - nach entsprechendem Ausbau.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
30.12.2007, 15:56 (Dieser Beitrag wurde zuletzt bearbeitet: 02.01.2008 14:14 von jg.)
leider verstehe ich nicht ganz wie das Programm funktioniert
- Die Whileschleife wird alle 5ms ausgeführt
- bei weniger als 5 byte 20ms warten, bei mehr auswerten
- alle 5ms wird dann das array mit den im Buffer befindlichen Daten zur Auswertung gefüllt
- das n elemente des Arrays werden wieder gelöscht
Problem ist nur, das ich zum senden (wie ich es eingefügt habe) und zum empfangen jedesmal des Stop Button zum beenden der While schleife drücken muss (wobei das ja selbst erledigt werden sollte ->while schleife). Man herangenesweise wäre gewesen - wobei ich nciht weiß ob es so in LabVIEW abbildbar ist:
- lauschen ob auf der RS232 was kommt.
- wenn was kommt, dann ab damit in das array
- solange füllen bis ein 0xC0 kommt
- wenn ein 0xC0 kam, dann auswerten und gleichzeitig das array zurücksetzen
' schrieb:eider verstehe ich nicht ganz wie das Programm funktioniert
Das macht nichts. - Naja. Eigentlich schon. Aber warte nur, bis du diesen Anhang heruntergeladen hast. Der macht jetzt nämlich das, was du willst (naja größtenteils hoffe ich), so wie ich mir das vorgestellt habe.
Zitat:wobei ich nciht weiß ob es so in LabVIEW abbildbar ist:
Es gibt nichts - naja vielleicht eher wenig - was nicht in LV abbildbar ist.
Zitat:- lauschen ob auf der RS232 was kommt.
- wenn was kommt, dann ab damit in das array
- solange füllen bis ein 0xC0 kommt
- wenn ein 0xC0 kam, dann auswerten und gleichzeitig das array zurücksetzen
Das würde wohl auch gehen. Würde aber voraussetzen, dass der Datensatz immer gleich aussieht. Wegen dem nicht explizitem Start.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Erstens: Elemente im Cluster.
In deinem Falle kannst du dir einigen Platz im BD sparen, wenn du die jeweils 8 Boolschen Werte in einem Cluster zusammenfasst.
Zweitens:
Ich empfehle, alles so zu programmieren, dass nirgends die roten Konvertierungspunkte erscheinen. Viele lassen sich ganz einfach dadurch entfernen, indem du die Bedienelemente bzw. Konstanten manuell von Int32 auf double umstellst. An gegebener Stelle kann man auch ein Int32 - in deinem Falle U8 - einfügen (wie du das ja an mehreren Stellen schon praktiziert hast). Nicht immer kommt bei einer automatischen Konvertierung (durch den roten Punkt am Eingang) das heraus, was man haben will. Der Typ der Eingänge sollte immer so sein, wie der Typ des Ausganges respektive des Anzeigeelementes es verlangt.
Drittens:
Die Forderung, in einem Blockdiagramm nicht mehr zu programmieren als auf eine Bildschimseite passt, ist auf den ersten Blick vielleicht übertrieben. Auf den zweiten - wie in deinem Falle - aber nicht: Die Sache wird einfach übersichtlicher. Wenn man den Bildschirminhalt verschieben muss, nur um ein Wire zu verfolgen, dann wird das mit der Zeit lästiger als mehrere SubVIs zu haben. Berechnungen oder z.B. Whileschleifen mit selbst nur einem Eingang und einem Ausgang sollte man lieber in ein SubVI auslagern. Das Icon hierfür verbraucht erheblich weniger Platz - was der Übersichtlichkeit dient. Entsprechendes gilt eben auch für das Zusammenfassen von Elementen in einem Cluster.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Oje, das erschlägt. Werde mal versuchen erst die ganzen unter VIs zu verstehen. Das man die Aufgaben in einer großen Endlosschleife bearbeitet ist sicherlich sinnvoll. Aber jetzt muss ich auch noch herausfinden wie ich vom Frontpanel aus auf die "Aln_Klasse" mit dem Datenarray zurückgreifen kann.
Zitat:Zweitens:
Ich empfehle, alles so zu programmieren, dass nirgends die roten Konvertierungspunkte erscheinen..
Werde ich versuchen zu beherzigen
Zitat:Drittens:
Die Forderung, in einem Blockdiagramm nicht mehr zu programmieren als auf eine Bildschimseite passt, ist auf den ersten Blick vielleicht übertrieben. Auf den zweiten - wie in deinem Falle - aber nicht: Die Sache wird einfach übersichtlicher.
Am Anfang tat ich das auch und hab mir so mini VIs z.B. 32Bit in 4x8 Bit wandeln usw. Muss wohl damit wieder anfangen. Aber damit habe ich noch nicht so intensiv gearbeitet.
Nebenbei, ein gutes neues und Danke für die Hilfe!
' schrieb:Aber jetzt muss ich auch noch herausfinden wie ich vom Frontpanel aus auf die "Aln_Klasse" mit dem Datenarray zurückgreifen kann.
Indirekt. Eben mittels Queue und/oder Melder.
Zitat:Am Anfang tat ich das auch und hab mir so mini VIs z.B. 32Bit in 4x8 Bit wandeln usw. Muss wohl damit wieder anfangen. Aber damit habe ich noch nicht so intensiv gearbeitet.
Du kommst früher oder später (eher früher) in Teufels Küche, wenn du's nicht machst.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).