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!
ich würde gerne eine Pumpe (DO) steuern. Die Steuerung funktioniert so:
Alle 5 Minuten (Bsp. Wert) sollte die Pumpe einmal für 10 Sec. eingeschaltet werden. Einfach gesagt, ich brauche einen digitalen Wert, der alle 5 Minuten für 10 Sec. auf True gesetzt wird dann wieder auf False.
Da ich mit Zeitsteuerung in LabVIEW wenig erfahrung habe, hänge ich an das Problem. Ich habe mit dem Block "Verstrichene Zeit" & "Case" probiert, aba bekomme ich kein vernüftiges Ergebnis.
Wäre dankbar wenn jemand mir einen Tipp gibt.
Viele Grüße,
Prince.
Coming together is a beginning, keeping together is progress, working together is success.
Du musst halt statt 5 s (wie im Bsp.) bei Dir 300 s eingeben und statt 1000 ms 10000 ms (im True-Case). Ich habe die Zeiten so eingestellt, damit man es besser sieht. In meinem Bsp. geht alle 5 s die LED für 1 s an.
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
so jetzt habe ich ein bis. rumprogrammiert, aber das Endergebnis sieht nicht besonders gut aus.
Ich würde gerne eine Boolische Konstante aus dem Case herausziehen und weiter an DAQ leiten. Generell arbeite ich mit State machine da ich viele Zustände habe. Diese Pumpensteuerung was ich jetzt einfügen will sollte eigentlich parallel zu meiner Steuerung laufen.
Markus, die Funktion Zeit zu zählen funktioniert ganz gut mit SR. nur das Anhalten der Zeit (bsp. pumpe sollte 10 Sec. laufen) ist das problematisch. da ich erstmal die Konstante aus dem Case rausziehen muss damit an DAQ weitergeleitet wird... Gibts da andere möglichkeiten ausser die "Warte" funktoin?
Mit warten Fkt. bleibt die ganze Schleife dann für diese Zeit inaktive.
Beste Grüße,
siehe VI:
(im VI ist der DAQ Input zur Info.)
LV 2010
Coming together is a beginning, keeping together is progress, working together is success.
' schrieb:Hab' Dir schnell ein Bsp. gemacht:
[attachment=60495:Zeitsteuerung.vi]
Gruß Markus
so. jetzt habe ich das problem mit Z.Automat gelöst.
Nur das einzige was mir fehlt ist die Zeiterfassung ! Irgendwie geht die Pumpe nur für eine m.sec. an dann wieder geht er aus !
irgendwo habe ich im Automat ein Denkfehler.
Grüße,
LV Version 2010
Coming together is a beginning, keeping together is progress, working together is success.
sobald du die Pumpe anschaltest, startet die nächste Iteration. In dieser wird die aktuelle Zeit mit der gespeicherten verglichen: das Resultat ist FALSE! Mit diesem FALSE schaltest du aber sofort wieder in den Idle-Case...
sobald du die Pumpe anschaltest, startet die nächste Iteration. In dieser wird die aktuelle Zeit mit der gespeicherten verglichen: das Resultat ist FALSE! Mit diesem FALSE schaltest du aber sofort wieder in den Idle-Case...
danke genau das ist das problematik da. Aba wie sollte ich sonst die Zeiterfassung realisieren (außer boolian), damit ich nicht jedes mal in Idle modus schaltet?
Grüße,
Coming together is a beginning, keeping together is progress, working together is success.
22.12.2010, 15:48 (Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2010 15:59 von NWOmason.)
nach 10 Sekunden wird die Pumpe einmalig auf true gesetzt. Das liegt daran, dass du im "True"-Case der Zeitauswertung (>10) die aktuelle Zeit an das Schieberegister übergibts. Im nächsten Schleifen durchlauf wird ja wieder abgefragt, ob die aktuelle Zeit größer ist, als die Zeit im Schieberegister. Da aber im Schieberegister nun nicht mehr die Anfangszeit vom Programmstart drinsteht, sondern die Zeit aus dem Schleifendurchlauf davor, ist die Bedingung wieder false und dein Program wechselt wieder in den "idle"-State. Und dort ist ja auch deine Pumpe aus.
Ich hoffe, ich habe es verständlich erklärt.
Ich würde das ganze zu einer State-Maschine zusammenfassen, in der es nur einen Idle-State gibt. Aktuell müsstest du es in die Richtung umbauen, dass die Abfrage währendessen die Pumpe ein ist, nicht ausgeführt wird.
Oder ein Abrage im False-State, ob die Pumpe läuft.
Oder, oder. Es gibt viele programmatische Lösungen dafür, denke ich
Beste Grüße,
NWO
9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris.
NI schrieb:To use the abort button is like using a tree to stop a car!
Ich würde das ganze zu einer State-Maschine zusammenfassen, in der es nur einen Idle-State gibt. Aktuell müsstest du es in die Richtung umbauen, dass die Abfrage wärendessen die Pumpe ein ist, nicht ausgeführt wird.
Beste Grüße,
NWO
Besten Dank für die Erklärung. Eine Abfrage des PumpenStatuss habe ich jetzt drin. Jetzt funktioniert. Ich hätte ne kurze frage dann:
Während Z.Machine in Waiting modus ist, ist die ganze While schleife dann auch im Wartemodus. Das ist aba nicht so fein finde ich. Gibts ne andere lösung dass die andere Aktionnen in der Schleife weiterausgeführt werden (ausser 2 Paral. Schle.) ?
anbei mal eine Version (in), wo die Logik zum Ausschalten der Pumpe nach einer einstellbaren Zeit integriert ist.
Da du schon eine Wartefunktion in der Whileschleife hast, brauchst du die nicht mehr im Wait-State. Da wird nur kontrolliert, ob die Pumpe wieder ausgeschaltet werden soll...
Tipps:
- benenne den "Wait"-State nach "Wait for SwitchOff" um (ist eindeutiger, finde ich)
- benutze eine TypeDef für das Enum, dann kann man leichter neue States hinzufügen
- mache einen ähnlichen Case für ein Anschalten der Pumpe nach einer gewissen Zeit statt einer vorgeschalteten Logik mit zweiter Case-Struktur - so hast du immer genau definierte States, in denen sich dein Programm gerade befindet!