# Rolladen steuern mit CodeSys ST



## ez2000 (26 Februar 2012)

Hallo,
ich möchte meine Rolladen per Wago 750-841 mit 2x750-530 und 1x750-430 mit Wago Relais 788-375 steuern.
Verhindern möchte ich das ein Motor abraucht. Gesteuert wird mit WebVisu, Tastern und später bei Dunkelheit automatich mit Dämmerungsensor.
Mein Programm sieht so aus:

_VAR
    Bad_Button_schliessen : BOOL; (* Button an WebVisu *)
    Bad_Button_oeffnen : BOOL;        (* Button an WebVisu *)
END_VAR
__(* InputBit1 = Taster *)__(* OuputBit1 = Motor schliessen *)__(* OuputBit2 = Motor öffnen *)_
_IF Bad_Button_schliessen=TRUE AND Input_Bit1=FALSE THEN
    Output_Bit2:=0;
    Output_Bit1:=1; __(* Wenn an WebVisu Button Bad Rolladen schliessen betätigt dann Ausgang1 einschalten *)__
END_IF

IF Bad_Button_schliessen=FALSE AND Input_Bit1=TRUE THEN
    Output_Bit2:=0;
    Output_Bit1:=1;__ (* Wenn  Taster im Bad betätigt wird dann Ausgang1 einschalten *)__
END_IF

IF Bad_Button_schliessen=FALSE AND Input_Bit1=FALSE THEN
    Output_Bit2:=0;
    Output_Bit1:=0; __(* Wenn an WebVisu Button Bad Rolladen schliessen und Taster im Bad nicht betätigt dann Ausgang1 ausschalten *)__
END_IF

IF Bad_Button_schliessen=TRUE AND Input_Bit1=TRUE THEN
    Output_Bit2:=0;
    Output_Bit1:=0; __(* Wenn Buton links und Taster betätigt dann Ausgang1 ausschalten *)__
END_IF_

Das Programm funktioniert ist allerdings zu unübersichtlich, wenn noch Dämmerungssensor dazu kommt wirds noch komplizierter, hat jemmand Tips für mich wie ich das einfacher programmieren kann?
Ich möchte das aber in ST programmieren, weil ich mit Pascal ziemmlich vertraut bin.

Herzlichen Dank.


----------



## Blockmove (26 Februar 2012)

Nur mal so als Tip:
Schau dir die OSCAT-Lib an.
Darin findest du Rolladen und Jalousie-Steuerungen mit allen Comfort und Luxus.

Dein Problem mit der Unübersichtlichkeit, kommt aufgrund deiner Pascal- oder allgemeiner gesagt deiner PC-Belastung.
Du hast dich noch nicht richtig mit der Funktionsweise einer SPS angefreundet.
Ich würde dir mal empfehlen das Ganze in einer grafischen Sprache zu lösen.
Probiers doch mal mit CFC (auch so als Hinblick auf die OSCAT-Lib).

Gruß
Dieter


----------



## LargoD (27 Februar 2012)

```
[COLOR=#0000FF][I]IF Bad_Button_schliessen XOR Input_Bit1 THEN
   Output_Bit1:=1;
ELSE
[/I][/COLOR][COLOR=#0000FF][I]   Output_Bit1:=0;
[/I][/COLOR][COLOR=#0000FF][I]END_IF
[/I][/COLOR][COLOR=#0000FF][I]Output_Bit2:=0;[/I][/COLOR]
```
 
Gruß
Erich


----------



## ez2000 (27 Februar 2012)

Hallo,

@Dieter alias                                                                                      Blockmove, Danke für  den Tip mit der OSCAT Librarry. Mit CFC kann ich mich leider nicht  anfreunden. Ich blicke da nicht durch. (Werde aber es nochmal  versuchen.)

@Erich alias LargoD, Danke das sieht doch schon sehr gut aus. Eine Frage habe ich noch, was passiert mit Output_Bit2? Ist es immer Aus? Wollte Output_Bit2 für Motor rauf benutzen.

Sollte noch jemand Tips für mich haben, würde ich mich sehr freuen.

Danke und Gruß Gerhard.


----------



## LargoD (27 Februar 2012)

Output_Bit2 ist doch in Deinem Code auch immer aus.
Ich habe das, was Du programmiert hast kürzer hingeschrieben.

Gruß
Erich


----------



## drfunfrock (27 Februar 2012)

Ich würde das anders angehen. Du brauchst bei automatischem Betrieb einen Timer, der verhindert, dass sein Motor zu lange unter Strom steht, wenn der Rolladen blockiert. 

Trenne  den Input vom Output und mache eine Statemachine (Schrittkette), dh. lege einen FB für die Bewegungen des Rolladens an. Du fragst dann nur noch eine Variable ab: 

status == 0 nichts tun
status == 1 ----> runter fahren (Timer gesteuert)
status == 2 ----> hoch fahren (Timer gesteuert)
status == 3 ----> runter blockiert
status == 4 ---> rauf blockiert


Das lässt sich dann einfach testen 

Wenn du später dann neben den Tastern auch noch Lichtsensoren hast, ändert sich an diesem FB nichts.


----------



## ez2000 (27 Februar 2012)

@ LargoD  Jein, in meinem Code ist Output_Bit2 innerhalb der IF abfrage aus, bei deinem Code ist der Ausserhalb also immer Aus, oder habe ich da ein Denkfehler.

@drfunfrock das hört sich interessant an, und wie könnte das aussehen? Vielleicht kannst Du mir ein Beispiel zeigen.

Denke und Gruß Gerhard.


----------



## drfunfrock (27 Februar 2012)

Na du machst einen FB nur für die Bewegung auf: 

```
Eingangsvariable: 
Bewegung: integer;
Stop : Bool; 

Ausgangsvariable: 

Resultat: integer;

Dann: 

CASE status OF
BEGIN
 0: (* nix tun *)
  IF Bewegung = 1 THEN (*Hoch*)
  BEGIN
     ....
    status := 1;
  END
  IF Bewegung = 2 THEN (* Runter *)
  BEGIN
     ....
    status := 2;
  END
 1: (* Hoch *)
  ....
 2: (*runter *)
 END_CASE
```

Das ganze folgt dem Motto, kannst du ein Problem nicht überschauen, zerlege es in einfache Teile. Deine Sensoren sind einfach auszuwerten. Es ist schwierig, sich ein passendes Konzept für den Rolladen zu überlegen. So lässt sich dass auch einfach testen.


----------



## ez2000 (27 Februar 2012)

@drfunfrock, Danke ich werde das später testen, muß jetzt zur Arbeit.

Danke und Gruß Gerhard.


----------



## LargoD (27 Februar 2012)

ez2000 schrieb:


> ... oder habe ich da ein Denkfehler.


Ja.

Gruß
Erich


----------



## drfunfrock (27 Februar 2012)

ez2000 schrieb:


> @drfunfrock, Danke ich werde das später testen, muß jetzt zur Arbeit.
> 
> Danke und Gruß Gerhard.



Mache dir erstmal einen einfachen FB ohne Timer und überlege dir dann, wie der da rein gehört. 

Aus meiner Sicht, musst du jedesmal wenn du eine Bewegung startest einen Timer (TON) starten. 

Beispiel: 


```
rolladentimer(IN:=status>0); (* Elegant nicht :-) *)
```

Wenn der auf True geht, sollte dann der Motor schon aus sein, weil der ansonsten blockiert ist. Hast du keinen Endsensor kannst du dir die Fehlerabfrage sparen, aber der Timer schaltet dann den Motor in jedem Fall ab. Wenn der Timer auf True geht, setzt du einfach Status:=0; 

Das Schalten der Motorspannung sollte nicht in einem IF-THEN-ELSE erfolgen, sondern direkt im Status. Daher Status=0 gibt Motor-Stop aus. Das hat den Vorteil, dass sein Kode übersichtlich bleibt und die Fehlermöglichkeiten kleiner werden.


----------

