LabVIEWForum.de - Alternative zu Global Variables für Motor – Endschalter Zeitüberwachung

LabVIEWForum.de

Normale Version: Alternative zu Global Variables für Motor – Endschalter Zeitüberwachung
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
In einer Steuerung, mit einer State Machine umgesetzt, habe ich u.a. eine Motorsteuerung umgesetzt. Der Motor fährt so lange in eine Richtung, bis er in Grundstellung (Motor Endlage Normal) ist. Wenn der Motor diese Endlage in einer gewissen Zeit nicht erreichen sollte, wird der Motor gestoppt und eine Fehlermeldung ausgegeben. Programmiert habe ich das zwar, nur hätte ich gerne gewusst, ob man das auch ohne Global Variables realisieren kann, da man diese ja vermeiden soll. Ein Shift-Register finde ich nicht so optimal, da die State Machine viele States beinhaltet und dadurch der Verdrahtungsaufwand zu groß wird.

Im Bild Motor Endlage Normal.jpg werden die Endschalter des Motors abgefragt. Ist der Endschalter nicht betätigt, wird der Motor eingeschaltet und dieser State wieder angesprungen, bis der Motor den Endschalter erreicht. Dann wird der Motor ausgeschaltet Motor Position.jpg und es geht es mit dem nächsten State weiter. Im State Motor Endlage Normal wird auch noch, wie oben beschrieben, die Zeit überwacht. Dazu wird im vorhergehenden State Start-Zeit.jpg der Zeitstempel in der Global Variable abgelegt, um den Startpunkt des Motors später im State Motor Endlage Normal zu vergleichen.

Die Sub-VIs DIO Ein bzw. DIO Aus dienen dazu die Ports gezielt ein- bzw. auszuschalten.

Mit Global bzw. Local Variables kann man das zwar recht übersichtlich programmieren, aber laut NI-Regeln soll man diese ja nicht unbedingt einsetzen. Welche sinnvolle Alternative gibt es sonst?

Das ist mein erstes Programm mit LabVIEW, deshalb bin ich für jeden Hinweis dankbar.

Gruß
Frank
' schrieb:ob man das auch ohne Global Variables realisieren kann
Ohne globale Variable geht immer.

Eine Möglichkeit ist immer folgende: Mach dir ein funktionales SubVI.

Das SubVI einhält eine Whileschleife mit Schieberegister, das den Wert der "globalen Variablen" enthält. Die Whileschleife wird immer nur ein einziges Mal durchlaufen, das SubVI wird also sofort wieder beendet. In der Whielschleife befindet sich eine Case-Sequenz, die mit einem Enumerator angesteuert wird. Beim Beenden des SubVIs wird das Schieberegister immer zurückgegeben. Der Enumerator, der ein Eingang am SubVI ist, enthält die Funktion, die ausgeführt werden soll: Das Schieberegister, also die Variable, beschreiben. Nichts tun, also nur auslesen. Spezielle Sachen wie z.B. Uhrzeit laden.

Vorteil dieser Methode: Nah an einer gloablen Variablen, da (fast) genau so einfach einsetzbar - aber es ist eben keine. Außerdem kann man hiermit die "Globale Variable" sequenzieren!
Danke für die Antwort, das werde ich bei Gelegenheit mal probieren.
Referenz-URLs