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!
Moin Leute,
ich bin neu hier und arbeite erst seit ein paar Wochen mit Labview. Daher ist meine Frage mit Sicherheit sehr trivial, aber ich komme nicht weiter.
Folgendes:
Ich möchte die Drehzahl einer Welle mittels eines Hallsensors messen. Dafür klebt auf der Welle ein Magnet, der dann am Hallsensor vorbeikommt. Der Sensor schaltet dann einfach nur true, wenn der Magnet gerade da ist und false, wenn nicht.
Ich verwende LabView 2019 und eine Arduino Uno über das Linx Tool. Auf der Arduino habe ich den Hallsensor über den Digitalpin angeschlossen. Nun war meine Idee zur Drehzahlmessung, dass ich über den Block "verstrichene Zeit" die Zeit stoppe und jedes Mal, wenn der Sensor True schaltet, also eine Umdrehung rum ist, die Zeit gestoppt, gespeichert und in die Drehzahl umgerechnet im GUI angezeigt wird. Anschließend wird die Zeit neu gestartet. Beim der nächsten Umdrehung wird wieder die neue Zeit gestoppt, der alte gespeicherte Wert überschrieben und wieder im GUI als Drehzahl ausgegeben.
Das zentrale Problem ist hier das Speichern des Wertes.
Wie kann ich die gestoppte Zeit als Konstante speichern und beim nächsten Mal überschreiben?
Ich habe schon diverse Dinge mit Arrays, Rückkoppelungen und Schieberegistern probiert, aber da ich keine For Schleife n Mal durchlaufen will, war das alles nicht zielführend.
Oder ist die Idee mit dem Tool "verstrichende Zeit" grundsätzlich falsch und gibt es eine ganz andere Lösung?
Im Anhang ist mein Entwurf, der aber nicht so funktioniert wie gewollt.
Aber vermutlich ist das Problem einfach meine mangende Labview Erfahrung, daher bin ich für jede Hilfe und Tipps dankbar!
Zitat:Das zentrale Problem ist hier das Speichern des Wertes.
Wie kann ich die gestoppte Zeit als Konstante speichern und beim nächsten Mal überschreiben?
Ich habe schon diverse Dinge mit Arrays, Rückkoppelungen und Schieberegistern probiert, aber da ich keine For Schleife n Mal durchlaufen will, war das alles nicht zielführend.
Wenn du einen Wert für die nächste(n) Iterationen speichern/bereitstellen willst, solltest du ein Schieberegister verwenden!
Eine "Konstante" kann man nicht speichern/ändern/überschreiben: dann wäre es ja keine Konstante mehr!
Du willst wahrscheinlich so etwas wie eine "Variable" haben: in LabVIEW ist der Draht die Variable - oder das Schieberegister!
Zitat:Oder ist die Idee mit dem Tool "verstrichende Zeit" grundsätzlich falsch und gibt es eine ganz andere Lösung?
Falsch ist die Idee nicht. Es geht aber auch einfacher: man merkt sich den Timestamp des letzten Hall-Pulses in einem Schieberegister. Beim nächsten Puls dann einfach aktueller Timestamp minus den gespeicherten rechnen. (Letztendlich macht ElapsedTime genau das gleiche…)
Zitat:Im Anhang ist mein Entwurf, der aber nicht so funktioniert wie gewollt.
Da ist nur ein Bild. Bilder kann man mit LabVIEW weder debuggen noch editieren.
Beim nächsten mal bitte echten Code anhängen!
Das mit der Konstante ist mir auch gerade aufgefallen, aber du weißt ja, was ich meine.
Ok, also Schiebregister in eine For Schleife. Ich habe auch die Funktionsweise von den Schieberegistern noch nicht so ganz verstanden. Ich will ja keine diskrete Anzahl an Schleifendurchläufen haben.
Und wie sage ich dem Schieberegister, dass es den Wert speichern soll?
Im Anhang ist jetzt die richtige Datei.
Danke nochmal und viele Grüße
Nomier
27.11.2020, 14:18 (Dieser Beitrag wurde zuletzt bearbeitet: 27.11.2020 14:24 von GerdW.)
Zitat:Ok, also Schiebregister in eine For Schleife.
Wozu die FOR-Schleife?
Du hast doch schon eine While-Loop…
Zitat:Ich will ja keine diskrete Anzahl an Schleifendurchläufen haben.
Dafür verwendest du doch schon eine While-Loop…
Zitat:Ich habe auch die Funktionsweise von den Schieberegistern noch nicht so ganz verstanden.
Ein Schieberegister "schiebt" den Wert, den man ins rechte Terminal schreibt, in die nächste Iteration der Loop und gibt ihn am linken Terminal wieder aus.
Ganz einfach…
Zitat:Und wie sage ich dem Schieberegister, dass es den Wert speichern soll?
Indem du ihn ins rechte Terminal schreibst. Wie gerade beschrieben…
So, ich habe deinen Vorschlag ausprobiert, GerdW und es funktioniert schon ganz gut. Ich kenne nur zwei deiner Blöcke nicht. Zum einen den orangen DBL Block oben rechts zwischen dem Select und dem Schieberegister. ist das dein Anzeigeelement im Frontpanel? Da habe ich keine mit Ein- und Ausgang. Ich glaube, dass er deswegen bei mir den Wert nicht speichert, weil ich mein Anzeigelement anders eingebaut habe.
Der andere ist der true/false Block in der Mitte mit der roten und grünen Lampe. Ist das auch einfach nur eine LED im Frontpanel, oder ist die wichtig?
Danke und viele Grüße
Nomier
Hier ist mein VI, hatte ich eben vergessen.
rechts oben ist ein ganz normales Anzeigeelement.
Das andere nennt sich Point-by-Point-BooleanCrossing, damit kann man boolsche Statewechsel detektieren.
Hallo GerdW,
ich habe deinen Vorschlag ausprobiert und es funktioniert aber noch nicht. Der Wert wird im Minusblock von einander abgezogen, aber in der Anzeige nicht gespeichert. Diese zählt dann immer runter, weil die Zeitdifferenz ja steigt.
Wie kann ich erreichen, dass der Wert im Anzeigeblock für eine Umdrehung konstant bleibt?