Rolladen steuern mit CodeSys ST

ez2000

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[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
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
Output_Bit2 ist doch in Deinem Code auch immer aus.
Ich habe das, was Du programmiert hast kürzer hingeschrieben.

Gruß
Erich
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :cool:

Wenn du später dann neben den Tastern auch noch Lichtsensoren hast, ändert sich an diesem FB nichts.
 
@ 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.
 
Na du machst einen FB nur für die Bewegung auf:
Code:
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.
 
Zuletzt bearbeitet:
@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:

Code:
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.
 
Zuletzt bearbeitet:
Zurück
Oben