# Berechnung



## Ratoncito (16 November 2020)

Hallo,

schon wieder Fragen.

Ich benutze die SPS zur Steuerung von Rolläden. Bedingt durch die Schwerkraft laufen diese schneller AB als AUF. Im Prinzip kein Problem, an den Endlagen stoppt sie durch interne Endschalter.

Tagsüber möchte ich, zum Beispiel bei Sonnenschein, diese nur bis zu einem bestimmten Punkt absenken. In meiner alten SPS habe ich dies über einen Zähler realisiert, der mit einem Systemmerker mit einem Blinktakt von 10Hz zählte. Bei mehrmaligen AB und AUF verändert sich der vorgegebene Haltepunkt, da die Rollade in einem gleichen Zeitraum unterschidliche Strecken für AUF und AB zurücklegt. 

Nehmen wir mal an, dass die Rollade AB 10% schneller ist als AUF.
Wir fahren AB bis der Zähler auf 1000 steht. Von dort fahren wir 500 Zähler AUF und stoppen erneut. Hier habe ich den Zähleristwert (1000 - 500 = 500) um 10% (500 x 10% = 50) erhöht.

Das hat eigentlich recht gut funktioniert, auch bei mehreren AUF und AB. Wurde die Rollade ohne Stop an eine Endlagen gefahren habe ich die berechneten Werte wieder durch die Fixwerte für Oben oder Unten ersetzt.

Fragen:

1.) Hat jemand eine bessere Idee?
2.) Gibt es fertige Taktgeber oder muss ich den mit der Funktion BLINK erstellen?
3.) Die Berechnung sollte mit den mathematischen Bausteinen in FUP realisierbar sein. Welches Datenformat muss ich verwenden?

Vielen Dank und einen guten Start in die neue Woche.


----------



## Larry Laffer (16 November 2020)

Hallo,
das deine Rollo's schneller runter als rauf fahren (oder besser gesagt anders) hat m.E. weniger mit dem Gewicht sondern mehr mit der Übersetzung zu tun. Überlege bitte mal :
die Jalousie ist im aufgewickelten Zustand eine dicke Rolle und abgewickelt ein dünnes Rohr. Der Motor macht in etwa immer die gleiche Umdrehungszeit - also werden bei der ersten Umdrehung z.B. 50 cm  abgewickelt, bei der zweiten vielleicht noch 30 und am Ende vielleicht 15. Beim Aufwickeln ist es dann anders herum. Du kommst da also so ganz einfach nicht weiter.

Auf jeden Fall :  wenn du rechnen willst dann solltest du REAL als Zahlenformat wählen - das kann Nachkommastellen.

Gruß
Larry


----------



## Ratoncito (16 November 2020)

Hallo,

erst mal Danke für den Hinweis auf REAL

Aber dann:



> Überlege bitte mal :
> die Jalousie ist im aufgewickelten Zustand eine dicke Rolle und  abgewickelt ein dünnes Rohr. Der Motor macht in etwa immer die gleiche  Umdrehungszeit - also werden bei der ersten Umdrehung z.B. 50 cm   abgewickelt, bei der zweiten vielleicht noch 30 und am Ende vielleicht  15. Beim Aufwickeln ist es dann anders herum. Du kommst da also so ganz  einfach nicht weiter.



Nun ja, überlegt habe ich das schon vor gut 25 Jahren, und an der Wirkung der Schwerkraft hat sich auch nach neuesten Erkenntnissen nichts geändert. 

Deine Aussage ist nicht falsch, die Geschwindigkeit ändert sich mit dem Durchmesser der Rolle. Der ist aber für die zurückgelegte Strecke für AB und AUF jeweils gleich. Das an der Rolle hängende Gewicht beeinflusst die Drehzahl für AUF und AB.
Daher ist der Geschwindigkeitsunterschied ein klein wenig anders ob man im oberen oder unteren Bereich fährt.

Und noch etwas am Rande. Der Motor hat durch den geringen Durchmesser der Rolle im abgerollten Zustand ein höheres Drehmoment, muss aber auch das höhere Gewicht der ganz abgerollten Rollade ziehen.


Trotzdem, wenn jemand eine Idee oder Verbesserung hat - immer her damit.


----------



## Methi (16 November 2020)

schau dir mal die Jalousie-Bausteine (BLIND_...) der Oscat Building lib an. Habe damit nun auch im 2. Haus gute Erfahrungen gemacht.
Wird dort aber ähnlich wie du bisher gemacht - jeweils Kalibrierung bei Endlagen.


----------



## Larry Laffer (16 November 2020)

@TE:
Ich hatte dir das geschrieben weil ich da auch schon so meine Erfahrungen gemacht hatte. Ich hatte mir dafür auch mal einen Baustein gebastelt (den habe ich allerdings nicht mehr im Zugriff). Dieser hatte die echte Verfahrzeit gemessen und berücksichtigt, das die Zeit-Weg-Kurve nicht linear ist ... UND ... der auch berücksichtigt hatte, dass du unten von "Jalousie aufgesetzt" (also zu 95% zu) und "Jalousie geschlossen" noch ein paar Umdrehungen fahren mußt. Das hatte ganz gut funktioniert und auch ziemlich wiederholgenau (sowohl auf wie ab) - ich hatte aber auch eine Korrektur in den Endlagen gemacht.

Das Jalousie-Gewicht sollte bei einem korrekt dimensionierten Motor eigentlich keine Rolle spielen - war bei mir jedenfalls so.
Allerdings :  wenn du sagst, dass dein System schon > 25 Jahre alt ist dann könnten natürlich mittlerweile noch andere Faktoren eine Rolle spielen ...

Gruß
Larry


----------



## Ratoncito (16 November 2020)

Hallo,

@Larry

Eigentlich hatte ich gehofft, dass jemand eine einfachere Lösung hat. Mit der Korrektur ist es ein wenig aufwändig, da jede Rollade ein etwas anderes Verhalten hat und einzeln angepasst werden muss.



> Dieser hatte die echte Verfahrzeit gemessen und berücksichtigt, das die Zeit-Weg-Kurve nicht linear ist ...



Hierzu würde ich gerne nochmal auf Dich zurückkommen, wenn ich darf.
Rolläden AUF und AB hatte ich im Verlauf des Jahres an die Tageslänge angepasst. Wenn man diese Zeit an eine nicht lineare Kurve anpassen könnte wäre das super. Hierzu müsste ich dann aber noch genaue Angaben machen.


----------



## Larry Laffer (16 November 2020)

Ratoncito schrieb:


> Hierzu würde ich gerne nochmal auf Dich zurückkommen, wenn ich darf.



Darfst du ... 
Ganz grundsätzlich hatte ich als Basis die maximale Verfahrzeit (für das jeweilige Fenster) angegeben. Das war also ein Parameter an FB.
Für die Kurve hatte ich einfach Eckpunkte angegeben und die linearisiert - eine Formel wäre sicherlich auch machbar gewesen - es reichte aber so.
Die Eckpunkte waren tatsächlich in etwas so, wie eben schon genannt - eben wieviel Prozent habe ich ab komplett auf nach 10% der Fahrtzeit geschafft, wieviel nach 20% usw.
Das Gleiche dann aber unterschiedlich für Auf und Ab.
Meine Zielposition war dann ein Schließwert von 0% (ganz offen) bis 100% (ganz zu). Es ging sogar einigermaßen von 75% auf 50% zu fahren (oder umgekehrt).

Gruß
Larry


----------



## Ratoncito (23 November 2020)

Hallo,

wenn ich darf möchte ich das Thema gerne nochmal aufgreifen.

Eine Rollade soll bei AB an einem bestimmten Punkt (Ziel) stoppen. Wird die Rollade wieder AUF gefahren und gestoppt steht sie (nach der Zeit gerechnet) an Punkt X. Da sie AUF langsamer als AB fährt, würde sie, wenn man die gleiche Zeit AB fährt, das Ziel überfahren.

Meine Idee zur Lösung: den verfahrenen Weg um die Differenz zu kürzen. Im Prinzip hatte ich das in der alten SPS so gemacht.

Nehmen wir mal für die Differenz 10% an, den genauen Wert muss ich noch ermitteln.

In der alten SPS hatte ich den Weg über einen Zähler und Blinktakt von 10Hz ermittelt. Nach AUF habe habe ich den neuen Zählwert um (letzter Verfahrweg - 10%) vermindert. Siehe Skizze.

Der Timer für AUF und AB war länger als der tatsächliche Fahrweg, da die Rolladen durch interne Endlagenschalter gestoppt werden. Wurde die Rollade nicht zwischendurch gestoppt, erfolgte ein Reset der Zählwerte. Dadurch wurden die Differenzen bei den Berechnungen eliminiert.

Grundsätzlich halte ich einen zusätzlichen Zähler CTUD mit einem 10Hz Blinktakt geeigneter als eine Lösung über die Timer, oder sieht das jemand anders?
Ich gehe davon aus, dass für die Berechnung ein Baustein in strukturiertem Text am besten geeignet ist.

Nun habe ich eine große Bitte:

Würde mir jemand diesen Baustein erstellen?

Es ist eigentlich nicht meine Art, meine Aufgaben von anderen erledigen zu lassen, aber das wäre ein gutes Beispiel um zu sehen, wie man es richtig macht, und eine gute Hilfe für meine weiteren Aufgaben. Ich habe bisher noch nichts in strukturierten Text gemacht.

Im Voraus schon mal vielen Dank


----------



## Heinileini (23 November 2020)

Ratoncito schrieb:


> Der Timer für AUF und AB war länger als der tatsächliche Fahrweg, da die Rolladen durch interne Endlagenschalter gestoppt werden. Wurde die Rollade nicht zwischendurch gestoppt, erfolgte ein Reset der Zählwerte. Dadurch wurden die Differenzen bei den Berechnungen eliminiert.
> 
> Grundsätzlich halte ich einen zusätzlichen Zähler CTUD mit einem 10Hz Blinktakt geeigneter als eine Lösung über die Timer, oder sieht das jemand anders?


Grundsätzlich kann man sich die Funktion eines Timers auch mit einem Zähler und einem ZeitTakt "basteln". Aber warum zusätzlich? Als NotBremse, wenn der Timer mal nicht so tut, wie er soll?

Timer ... länger als der tatsächliche Fahrweg:
Damit wird "sichergestellt", dass der Rollladen ganz auf bzw. ganz zu fährt. Auch dann, wenn er - durch welchen Einfluss auch immer - mal etwas langsamer läuft als "sonst".
Wo kommt dabei der ZählerReset ins Spiel? Du hast doch keine Rückmeldung von den *internen* EndlagenSchaltern. Misst Du etwa die StromAufnahme des Motors und kannst so feststellen, wann die Endlage erreicht ist?
Wenn Du den Rollladen zufährst mit Reserve für "wirklich ganz zu" oder auffährst mit Reserve für "wirklich ganz auf", dann weisst bzw. unterstellst Du, dass Du auch bei 0% bzw. 100% ankommst.
Diesen Zuschlag auf die Laufzeit darfst Du nur dann wirksam machen, wenn Du aus der aktuellen Position nach "ganz auf" oder "ganz zu" fährst. Nicht, wenn Du z.B. von 20% auf nach 80% auf fahren willst.


----------



## Ratoncito (23 November 2020)

Hallo,

vielen Dank für Deine Antwort.

An den Fragen sehe ich, dass meine Erklärung nicht ausreichend war. Ich habe versucht zu erklären, wie ich es in der alten SPS gelöst habe, mit Timer und Zähler. 

Grundsätzlich ist der Timer so bemessen, dass die Rollade immer den ganzen Weg verfahren kann. Alle Rolladenmotoren besitzen Endschalter, die den Motor in den Endlagen stoppt.

Wie schon beschrieben sollen die Rolladen nicht ganz geschlossen werden. Würde ich das über einen Timer machen, würde ich für AUF und AB jeweils einen eigenen Timer benötigen, sonst fährt die Rollade nicht mehr ganz auf. Außerdem würde sie bei einer Unterbrechung der AB Bewegung und einem erneuten Start nicht mehr an der gewünschten Position stoppen.

Daher verwende ich einen Zähler CTUD, der bei AB oder AUF zählt. Unterbricht man die Bewegung und startet sie neu, wird sie immer noch am gewünschten Stop bei erreichen des Zählwertes gestoppt.
Ein Problem machen die unterschiedlichen Geschwindigkeiten zwischen AUF und AB. Gezählt wird die Zeit und nicht der Fahrweg. Daher möchte ich nach einer AUF-Bewegung den aktuellen Zählwert um 10% der Differenz vom letzten Haltepunkt bis zum aktuellen Haltepunkt verringern.

Ein Beispiel:
Rollade fährt 40s AB, der Zähler steht auf 600.
Nun fährt sie 20s AUF, der Zähler steht auf 300. Da sie sich langsamer bewegt hat, steht sie aber an einer Stelle, die dem Zählwert 330 entspricht.
Lösung: der aktuelle Zählwert wird korrigiert. 600 - (300 - (300 * 0,1)) = 330
In Worten: neuer Wert = letzter Wert - (aktueller Wert - (aktueller Wert * 10%))
Hoffentlich kann dem jemand folgen ;-)

So wird nach jeder AUF-Bewegung der Zähler um die Differenz durch die langsamere Geschwindigkeit angepasst. Das passt auch nach mehreren Richtungswechseln recht gut.

Wird die Rollade ohne Stop bis ganz oben gefahren wird der Zähler durch den abgelaufenen Timer auf 0 gesetzt.

Ich hoffe, dass meine Erklärung verständlich ist, sonst fragt bitte nochmal nach.

Wenn ich irgendeinen Ansatz hierzu in strukturiertem Text hätte, könnte ich mich damit auseinandersetzen. Postet mir bitte irgendetwas, auch wenn es nicht ganz passt. Ich setze mich gerne damit auseinander.

Vielen Dank


----------



## Blockmove (23 November 2020)

@Wolfgang
Die Vorgehensweise ist schon ok.
Lässt sich übrigens in e!Cockpit auch gut in FUP umsetzen.


----------



## Heinileini (23 November 2020)

Ratoncito schrieb:


> Postet mir bitte irgendetwas, auch wenn es nicht ganz passt.


Hier kommt "irgendetwas", völlig ungetestet und in PseudoCode angedacht.
Eine (manuelle?) Unterbrechung eines PositionierVorgangs habe ich nicht eingeplant. :-(

```
// Zu  :   0,00 %
// Auf : 100,00 %
// iSollNeu : 0 .. 10000 ; Vorgabe in Hundertstel Prozent, woher auch immer

bStartImpuls := iSollNeu <> sSollAlt AND NOT TOF.Q ;
IF bStartImpuls Then
    IF iSollNeu = 0 OR iSollNeu = 10000 Then // zur EndPosition
        sZeitZuschlag := Konstante ; // Anzahl s für "EndAnschlagZuschlag"
    ELSE // sonst
        sZeitZuschlag := 0 ; 
    END_IF ;
    tDiff := cSollNeu - sSollAlt ; // RegelAbweichung zw. Sollwert und "vermeintlichem" Istwert
    bsAuf := tDiff > 0 ; // RichtungsErrmittlung
    bsZu  := tDiff < 0 ;
    sZeitFürTimer := (ABS(tDiff) + tDiff / Faktor1) * Faktor2 + sZeitZuschlag ; 
    // Faktor1 : beeinflusst unterschiedliche Offsets für "Auf" (+) und "Ab" (-)
    //           Vorsicht! Für "leicht lesbar" wären hier GleitkommaZahlen und 
    //           Multiplikation statt Division (mit entspr. TypKonversionen) besser!
    // Faktor2 : für Umrechnung Hundertstel Prozent in Sekunden
sSollAlt := iSollNeu ;
END_IF ;

TOF(IN:= bStartImpuls, T:= sZeitFürTimer) ;
obAuf := TOF.Q AND bsAuf ;
obZu  := TOF.Q AND bsZu ;
```


----------



## Ratoncito (24 November 2020)

Hallo,

vielen Dank.

@Blockmove
Wenn es in FUP geht, werde ich es probieren. FUP liegt mir mehr.

@Heinilein
Dein Beispiel ist auf dem Timer aufgebaut. Ich muss mich erstmal durchwurschteln, wird eine Weile dauern. So auf den ersten Blick sehe ich noch nicht wie das Ganze gestartet wird. Egal, ich beschäftige mich mal damit.

Allen einen schönen Tag


----------



## Heinileini (24 November 2020)

Ratoncito schrieb:


> So auf den ersten Blick sehe ich noch nicht wie das Ganze gestartet wird.


Möglicherweise habe ich die Aufgabenstellung falsch verstanden oder zu sehr vereinfacht.
Da Du als "HauptThema" die unterschiedlichen Geschwindigkeiten beim AUF-fahren und beim AB-fahren hattest, bin ich davon ausgegangen, dass der Rollladen entsprechend einem vorgegebenen ZahlenWert (quasi die SollPosition) gefahren werden soll.
Diese Vorgabe geschieht über iSollNeu. Woher dieser Wert kommen soll, wie Du ihn vorgibst, das ist nicht Bestandteil der Routine. Sie reagiert lediglich darauf.
Vermutlich fehlt noch das Bedienen über Tasten (AUF- bzw. AB-fahren, solange die entsprechende Taste betätigt wird) UND das Ermitteln, welche IstPosition der Rollladen auf diese Weise erreicht haben müsste.
Jetzt beginne ich auch zu verstehen, wozu Du einen Zähler verwenden willst.  Dazu kann man übrigens auch einen Timer verwenden. Der muss nur lange genug laufen können und man liest aus, wie weit er gekommen ist, wenn man das Fahren beendet.


----------



## Larry Laffer (24 November 2020)

Ich habe zur Verdeutlichung mal das Fahrverhalten ge-Excel-t (siehe Bild).
Als Daten habe ich ein beliebiges Fenster angenommen aber mit realisitischen Lamellen-Maßen.
Wenn man möchte dann kann man sehen, dass z.B. 1 Sekunde fahren von einem beliebigen Punkt in Aufwärtsrichtung einen völlig anderen Weg zurücklegt als vom gleichen Punkt an das Abwärtsfahren.
Wenn man jetzt noch berücksichtigt, dass Wolfgang ja schreibt, dass seine Jalousie für komplett rauf länger braucht wie für komplett runter dann ergibt sich hier dann ein noch logarhytmischeres Bild.
Ich finde, dass man das bei allem berücksichtigen sollte.

Ganz grundsätzlich finde ich es aber richtig, die Zeit des Verfahrens zu messen und zu verrechnen und nicht Takt-Impulse zu zählen.
Verfahren kann hier natürlich heißen :
- Tippen per Hand
- Fahre auf eine bestimmte Position

Wenn man nun die im Screenshot zu sehende Tabelle als Basis nimmt dann läßt sich schon berechnen, wie lange wirklich gefahren werden muss um welche Position zu erreichen.

Gruß
Larry


----------



## Ratoncito (24 November 2020)

Hallo,



> Möglicherweise habe ich die Aufgabenstellung falsch verstanden oder zu sehr vereinfacht.



Nein, es ist noch einfacher!

@Larry
Sorry, dass Du Dir soviel Mühe mit der Tabelle gemacht hast, das war nicht meine Absicht.
Noch eine kleine Bemerkung am Rande. Die Differenz zwischen AUF und AB kommt nicht durch die unterschiedliche Wegstrecke durch den geänderten Durchmesser der Welle, sondern durch die unterschiedliche Drehzahl der Welle für AUF und AB durch das Gewicht.

Das ganze Ding ist viel einfacher, daher nochmals ein paar Erklärungen.

Rollade AB oder AUF - die Bewegung wird über einen Taster gestartet und nach Ablauf einer Zeit gestoppt. Die Zeit ist länger als die tatsächlich benötigte Zeit, an den Endlagen wird sie über die internen Schalter (nicht über die SPS) gestoppt.
Möchte man unterwegs stoppen betätigt man den Taster erneut, oder den für die Gegenrichtung.

Einige Rolladen sollen nicht ganz geschlossen werden, sondern kurz vor Ende gestoppt werden. Das hatte ich über einen Zähler gelöst. Die AB-Bewegung könnte unterwegs gestoppt und erneut gestartet werden. Solange man nur AB fährt stoppt die Rollade immer noch am gewünschten Punkt. Erst wenn zwischendurch mal eine Bewegung in Richtung AUF erfolgt stimmt der Zählwert wegen der geringeren Geschwindigkeit in Richtung AUF nicht mehr. Daher muss nach AUF der aktuelle Zählwert korrigiert werden.

Und ich möchte immer nur diesen einen festen Punkt am unteren Ende anfahren, keine anderen Punkte zwischendurch. Einzige Ausnahme - die Rollade steht am unteren Punkt und wird erneut in Richtung AB gestartet. Aber das ist kein Problem.

Und noch einmal für Alle, die irgendetwas von mir lesen. Geht bitte vom Wissensstand eines Erstklässlers aus! Zumindest in Punkto SPS 

Ich habe übrigens den Baustein "EXECUTE" in FUP entdeckt. Ich glaube der ist für den Fall genau das Richtige.
Leider habe ich da meine Probleme mit der richtigen Schreibweise oder der Deklaration der Variablen :-(

Gibt es irgendwo ein gescheites Tutorial (möglichst kein YouTube) für die Programmierung in ST?


----------



## Blockmove (24 November 2020)

Execute ermöglicht Gemischt-Programmierung (KOP/FUP - SCL)
Gehört auch zu meinen Lieblingen


----------



## Ratoncito (25 November 2020)

Hallo,

vielen Dank an alle Beteiligten.

Ja, ich habe es geschafft. Es ist lediglich ein kleiner Zweizeiler übriggeblieben. 


```
CV_aktuell := M_CV - ((CV_letzter - M_CV) / Faktor);
CTUD_0 ( PV := CV_aktuell, LOAD := TRUE);
```

Sehr nützlich finde ich den Baustein EXECUTE, den ich dabei gefunden habe.

Auch wenn der gepostete Code nicht verwendet wird, mir hat er sehr geholfen um den Aufbau zu verstehen, und wie man Bausteine anspricht.

Ich habe mich für die Lösung mit einem Zähler entschieden, auch wenn einige eine Lösung über den schon vorhandenen Timer richtiger finden. Für mich war es verständlicher.


----------

