TIA Rollladensteuerung S7 1200

tomlei

Level-2
Beiträge
72
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen!

Ich bin SPS Anfänger und beschäftige mich im Wesentlichen privat mit diesem Thema. Auf Arbeit habe ich mit SPS Programmierung / Fehlersuche selten zu tun (leider).
Ich habe eine Rollladensteuerung für 10 Fenster mit einer 1200er realisiert. Für jeden Motor gibt es einen physischen AUF/AB Taster.

Derzeitige Funktion:
Press1 Start - Timer für komplett AUF/AB
Press2 Stop - Reset Timer
LongPress1 am Fenster1 startet AUF/AB an allen Rollos
Sprachsteuerung über Alexa

Da ich keine Motoren mit Positionserkennung habe überlege ich jetzt, wie ich eine Positionierung hinbekommen könnte - also 30% offen oder zu zum Beispiel).

Jeder Motor hat einen eigenen FB und alle Timer und Zähler sind als Multiinstanzen ausgeführt (Static im FB).
Ich dachte, ich kann eine Variable hoch- und runterzählen mit den Ausgängen der AUF/AB Timer und diesen Wert speichern, sodass die Steuerung weiß, wo der Rollladen steht. Leider finde ich keinen richtigen Ansatz das umzusetzen. Kann das überhaupt funktionieren und wenn, wie genau könnte das sein? Da der Hochlauf und Runterlauf nicht genau die gleiche Zeit benötigt befürchte ich, dass über die Zeit der Zählerstand nicht mehr die Wirklichkeit widergibt.

Hat jemand eine Idee dazu?

Gruß Tom

PS: Gibt es hier eine Möglichkeit den FUP Code einzufügen ohne ein Screenshot / Bild machen zu müssen?
 
Guten Morgen
die genaue Position wirst du nicht hinbekommen. Ich selbst habe folgenden Ansatz am laufen.
1. du brauchst drei Laufzeiten hoch, runter maximal
2. du stoppst die Zeit in der der Rollo in eine Richtung fährt bis er stoppt.
3. du rechnest die gestoppte Zeit mit der hoch oder runter Zeit zusammen und erhälst einen Prozentsatz den du an die Stellung addierst.

Bsp.
Zeit Runter 10s Zeit hoch 15s Zeit Max 20s oder größter Wert von runter hoch mal 1,?

Rollo ist unten
fährt 5s hoch --> 5s von 15s = 33% --> 0% + 33% = 33%
fährt 2s runter --> 2s von 10s = 20% --> 33% - 20% = 13%

Rollo fährt ganz hoch --> 20s von 15s = 100% --> 13% + 100% = 100% (Damit bereinigst du jedes mal beim hoch oder Runterfahren die Werte

Gruß Florian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo und danke für Deine Rückmeldung!

Die Berechnung über den Prozentwert von 100% Fahrweg war auch meine Überlegung. Die Frage für mich war, wie setze ich das im Programm um.
Das heißt, wie speichere ich die aktuellen Werte der Fahrwegs-Timer der AUF/AB Bewegung bei Stop des Motors und addiere und subtrahiere die Werte in einer Variablen.
 
Hallo,
Ich würde mir an deiner Stelle einen FB "Rollo" anlegen, den du 10x aufrufst als Multiinstanz.
Dann einen Globalen DB mit einem Array of "Rollodaten" indem du alle Informationen ablegst (Parameter struct, State struct, Control struct)

dann am FB "Rollo" ein INOUT vom Typ Rollodaten und da hängst du ein Element des Globalen DBs dran.

Im FB Rollo würde ich eine ganz einfache Schrittkette programmieren. Laufzeit messen geht am einfachsten mit "Runtime"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Berechnung über den Prozentwert von 100% Fahrweg war auch meine Überlegung. Die Frage für mich war, wie setze ich das im Programm um.
Das heißt, wie speichere ich die aktuellen Werte der Fahrwegs-Timer der AUF/AB Bewegung bei Stop des Motors und addiere und subtrahiere die Werte in einer Variablen.
Das wird ganz schön tricky werden, da dein Motor sich ja konstant dreht und aber sich sein Übersetzungsverhältnis zur Jalousie (wegen Wickeldurchmesser) ändert.
Ich würde in dem Fall (also wenn du z.B. von 30% auf 60% ändern willst) ggf. noch etwas ausrechnen - dann aber irgendwann über ganz offen oder ganz geschlossen (also quasi als Referenzfahrt) gehen ...
Ansonsten genau so wie es @Florian_123 im Beitrag #2 geschrieben hat.

GGf. wäre such noch folgender Ansatz bei der manuellen Bediennung denkbar (1-Tasten-Bedienung) :
Taste erstes Mal kurz gedrückt : fährt komplett runter
Taste zweites Mal kurz gedrückt : Stop
Taste drittes Mal kurz gedrückt : fährt komplett rauf
Taste viertes Mal kurz gedrückt : Stop
Taste fünftes Mal kurz gedrückt : wie 1
-
Taste erstes Mal lang gedrückt : fährt solange runter wie gedrückt wird
Taste zweites Mal lang gedrückt : fährt solange rauf wie gedrückt wird
Taste drittes Mal lang gedrückt : wie 1
-
 
Das wird ganz schön tricky werden, da dein Motor sich ja konstant dreht und aber sich sein Übersetzungsverhältnis zur Jalousie (wegen Wickeldurchmesser) ändert.
Ich würde in dem Fall (also wenn du z.B. von 30% auf 60% ändern willst) ggf. noch etwas ausrechnen - dann aber irgendwann über ganz offen oder ganz geschlossen (also quasi als Referenzfahrt) gehen ...
Ansonsten genau so wie es @Florian_123 im Beitrag #2 geschrieben hat.

GGf. wäre such noch folgender Ansatz bei der manuellen Bediennung denkbar (1-Tasten-Bedienung) :
Taste erstes Mal kurz gedrückt : fährt komplett runter
Taste zweites Mal kurz gedrückt : Stop
Taste drittes Mal kurz gedrückt : fährt komplett rauf
Taste viertes Mal kurz gedrückt : Stop
Taste fünftes Mal kurz gedrückt : wie 1
-
Taste erstes Mal lang gedrückt : fährt solange runter wie gedrückt wird
Taste zweites Mal lang gedrückt : fährt solange rauf wie gedrückt wird
Taste drittes Mal lang gedrückt : wie 1
-
Missverständnis - ich habe jeweils einen Taster pro Motor für Hoch und auch für Runter. Also keine 1 Tastenbedienung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich würde mir an deiner Stelle einen FB "Rollo" anlegen, den du 10x aufrufst als Multiinstanz.
Dann einen Globalen DB mit einem Array of "Rollodaten" indem du alle Informationen ablegst (Parameter struct, State struct, Control struct)

dann am FB "Rollo" ein INOUT vom Typ Rollodaten und da hängst du ein Element des Globalen DBs dran.

Im FB Rollo würde ich eine ganz einfache Schrittkette programmieren. Laufzeit messen geht am einfachsten mit "Runtime"
Danke für den Denkanstoß. Muss ich mal schauen, wie ich so etwas umsetzen kann. So eine Lösung habe ich noch nicht umgesetzt.
Wenn ich nicht weiterkomme, dann melde ich mich nochmal.
 
ich habe das mit dem IoBroker als SmartHome Broker realisiert. Zwar mit einer 300er, aber es funktioniert!!

Am InOut habe ich die errechneten Positionen, dort schreibt auch nachher die Alexa ihre Prozentzahl rein.
Mein Programm ist nicht 100% fertig, aber es funkioniert ;)
 
ich habe das mit dem IoBroker als SmartHome Broker realisiert. Zwar mit einer 300er, aber es funktioniert!!

Am InOut habe ich die errechneten Positionen, dort schreibt auch nachher die Alexa ihre Prozentzahl rein.
Mein Programm ist nicht 100% fertig, aber es funkioniert ;)
Hi,

ich habe auch den IOBroker laufen (extra MiniPC mit SQL Server zur Datensicherung). Allerdings wollte ich die Grundfunktionalität nicht von dem IOB abhängig machen. Den nutze ich nur für die Umsetzung der Alexa Sprachsteuerung der Rollos. Das funktioniert auch alles schon.
Da ich keine physische Positionserkennung der Rollos habe, habe ich jetzt mit Zählern experimentiert. Den Timer für die maximale Fahrzeit Hoch oder Runter habe ich wieder rausgeworfen und kann jetzt mit dem Zähler die exakte Position des Rollos verarbeiten. Das hat auch den Vorteil, dass nicht mehr die komplette maximale Laufzeit (Timer) gestartet wird, wenn das Rollo eigentlich nur noch 20cm fahren muss. Das funktioniert jetzt.

Jetzt habe ich noch die Aufgabe zu lösen, wie ich dem Programm nach Neustart die aktuelle Position der Rollos (komplett AUF oder ZU) übergebe. Ich habe an eine Art Referenzfahrt gedacht bei dem der Zähler für die Position auf 100% AUF oder 100% ZU gesetzt wird. Bisher habe ich noch keine vernünftige Lösung gefunden.

Wie kann man einem Zähler (CTUD) einen Wert (Int) vorgeben? Einfach nur Reset?
Wenn jemand einen Tip hat, dann würde ich mich über Hinweise freuen.

Gruß Tom
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest dir statt eines Zählers eine remanente Variable nehmen und die inkrementieren und dekrementieren - die könnte dann sogar Bestandteil der Instanz deines FB's sein. Der Instanz-DB "vergisst" seine letzten Werte nicht ...
Einen Zähler selber zu erstellen ist ja nun auch nicht die Aktion ...
 
...Der Instanz-DB "vergisst" seine letzten Werte nicht ...
Der Zähler wird im Instanz-DB gespeichert. Wenn der Instanz-DB noch keine letzten Werte hat - weil das Programm das erste mal läuft und das Rollo aber nicht unten (Position 0) sondern oben (Position Max Oben) ist, wie setze ich dann den Anfangswert?
Deswegen dachte ich an eine Art Referenzfahrt "alle Rollos komplett runter" und dann stimmt auch der Anfangswert "0" für den Zähler.
 
wenn das Rollo komplett oben ist dann hast du genauso deinen Referenzwert ...
und ...
wenn ich mich nicht total vertue (habe gerade kein Step 7) dann ist der CTUD nicht remanent ...
 
was zählst du übrigens ? Doch wohl Zeiteinheiten ... also hast du dann ja doch im Grunde einen Timer ...
Letztlich zähle ich über einen 10Hz Timer Impulse - das ist eine Zeiteinheit, richtig.

Mein Zähler steht jetzt auf 0 (komplett zu) und das Rollo ist aber oben. Ich könnte das jetzt alles komplett umstricken, aber es muss doch möglich sein, dem System den Ist-Zustand zu übergeben. Das versuche ich jetzt gerade - bin halt noch Anfänger und will nicht nochmal alles neu machen.
Diese Art eine Int Variable zu benutzen habe ich gemacht, weil ich den Eindruck hatte, dass Vergleiche (<,>=, etc) mit Integer besser funktionieren. Das kann natürlich auch Blödsinn sein.
 
wie schon geschrieben ... du solltest dir einen eigenen Zähler bauen, der mit einer Instanz-INT deines FB's zählt. Der vergisst dann auch nicht und der weiß dann auch noch, dass deine Jalousie jetzt ganz oben ist ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie schon geschrieben ... du solltest dir einen eigenen Zähler bauen, der mit einer Instanz-INT deines FB's zählt. Der vergisst dann auch nicht und der weiß dann auch noch, dass deine Jalousie jetzt ganz oben ist ...
Was ist damit gemeint. Ich habe doch einen Zähler eingebaut der eine Instanz-Int zählt?

Ich habe jetzt eine Funktion zur Referenzfahrt "Komplett Zu" erstellt und jetzt stimmt die tatsächliche Position auch mit der Zählerposition überein.
Jetzt muss ich noch prüfen, wie sich der unterschiedliche Weg pro Zeit (Rollendurchmesser) auf die Position auswirkt...
 
Was ist damit gemeint. Ich habe doch einen Zähler eingebaut der eine Instanz-Int zählt?
... aber dieser Zähler ist ja nicht remanent ... sondern du weist seinen Wert ja nur einem Instanz-INT zu ... und dieser Zähler hat beim Neustart dann halt Null und somit deine Instanz-INT auch.
Nun könntest du ja auch die INT selber zählen (dafür mußt du dann natürlich selber eine Flankenauswertung davor setzen - das ist aber nicht so schwer) dann hättest du das Problem mit dem Wertverlust nicht mehr ...
 
ich hab es mit dem Blinkmerker realisiert. und dann als Zähler addiert. so habe ich immer einen Integer zur Verfügung, mit dem ich rechnen kann.

ich kann dir gerne mein Programm mal zukommen lassen. ich hab denn von iobroker mir ein Übergabebit (als Flanke) schicken lassen. dann kann ich die verschiedenen Positionen per Übernahme fahren lassen.
 
Zurück
Oben