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 möchte gerne eine Timerfunktion schreiben, mit der man den Zeitwert sowohl incrementieren als auch decrementieren kann. Es geht dabei um die Ansteuerung eines Ventils.
D.h. wenn das Ventil geschlossen ist, dann sendet der Endschalter dafür das Signal "1" (Zeitwert ist in dem Fall 0 Sekunden). Sobald das AUF-Signal kommt soll der Timer solange laufen, bis es wieder weggenommen wird. Hier haben beide Endschalter den Signalwert "0". Die Zeit soll an dieser Stelle angehalten werden können. Angenommen das Ventil ist jetzt in der Mittelstellung und von meiner SPS kommt das Signal ZU, dann soll die Zeit wieder, solange der Befehl ansteht, zurücklaufen.
Mit anderen Worten: Ist der Zweitwert 0 sek, dann ist das Ventil GESCHLOSSEN (Endschalter ZU=true). Ist der Zeitwert bswp. 10 sek, dann ist das Ventil OFFEN (Endschalter AUF=true). Bei Zeitwerten die dazwischen haben beide Endschalter den Wert "false"
Ich habe mich gerade 2h lang an der Lösung des Problems versucht, allerdings mit nur wenigen Erfolgserlebnissen. Es passiert was, aber noch nicht das was passieren soll. Der Code ist relativ wirr, aber ich hoffe, dass jemand gaaaaaaanz viel Langeweile hat und sich den Krautsalat mal anschaut.
So ein Ventil hat ja ne bestimmte Zeit, die es braucht um von OFFEN zu GESCHLOSSEN zu kommen. Da die Ansteuerung binär erfolgt, muss ich also mit der Zeit arbeiten.
' schrieb:Du hast einen Wert der steigen soll? Ab wann, wie lange?
Der Zeitwert soll steigen, wenn der Befehl ÖFFNEN von der SPS kommt. Sobald der Befehl weggenommen wird oder der Endwert (Maximaldauer von ÖFFNEN nach SCHLIESSEN) erreicht wurde, z.B. 10 Sekunden, bleibt die Uhr sozusagen stehen. (Der aktuelle Zeitwert entspricht dann der momentanen Stellung des Ventils)
' schrieb:Dann soll er zurücklaufen? Ab wann, wie lange?
Zurücklaufen kann er nur dann, wenn der Zeitwert nicht 0 Sekunden ist. Er soll dann, beginnend vom momentanen Zeitwert der Ventilstellung, solange zurück laufen, bis entweder der Zeitwert 0 Sekunden enspricht oder der Befehl SCHLIESSEN nicht mehr ansteht.
' schrieb:Triggern soll der Wert auch was?
Triggern soll er die Beiden Endschalter! Ist der Zeitwert 0 Sekunden, dann soll der Endschalter (LED) für das GESCHLOSSENE VENTIL aufleuchten. Ist der Zeitwert, wie in diesem Beispiel, 10 Sekunden, dann soll der Endschalter (LED) für das OFFENE VENTIL aufleuchten.
So ich habe mich nochmal dran gesetzt und bin ein gutes Stück weiter gekommen. Allerdings habsch ein Problem mit den Schleifen. Die Incrementierung meines Ausgangswertes ist immer wieder verfälscht. Schauts euch mal an. Wies funktionieren soll steht ja oben ...
nach ca. 8 h Arbeitszeit habsch die Lösung gefunden. Allerdings gibts da nochn Problem. Und zwar musste ich den Zeitwert (den das Ventil von ZU nach AUF braucht) durch 2 Teilen und dann wieder mit 2 Multiplizieren, um erstens die richtigen Werte angezeigt zu bekommen und zum anderen die korrekte Zeit ablaufen zu lassen. Ohne diese Division bzw. Multiplikation würde das ganze nämlich doppelt solange laufen.
Konkret heißt das, wenn ich 3000 ms eingebe, dann läuft er 6000 ms.
Ich glaube aber, dass meine momentane Lösung zu Ungenauigkeiten führt. Was meint ihr?
Obwohl ich nicht glaube, dass jemand mal ein ähnliches Problem haben wird, gebe den Spaß dennoch mal für die Allgemeinheit frei. Denjenigen, die ernsthaft zu helfen versucht haben, sei hiermit gedankt.
Auch wenn das Problem eigentlich schon gelöst ist, erlaube ich mir hier meinen Vorschlag anzubringen (nachdem ich ja auch schon Anfangs ganz neunmalklug eine detaillierte Beschreibung gefordert habe).
Ich komme auch gänzlich ohne SubVis und komplizierter Logik aus. Denke aber dennoch, dass das Programm tut, was gefordert wurde.
Ich danke dir Kvasir. Das VI würd ich noch lieber verwenden. Nur habsch jetzt das Problem, dass ich es als SubVI einbinden möchte und zwar so, dass es mir kontinuierlich die Werte an mein MainVI liefert. Ich habs versucht nur hängt sich das MainVI dabei auf ...
Gelesen habe ich zu diesem Thema schon mehrere Beiträge aus diesem Forum, nur haben die mich nicht wirklich weitergebacht... Die While-Schleife in deinem VI wirkt fürs MainVI wie eine Endlosschleife und deshalb kommt nix zurück. Wie kann ich das erreichen?