Step 7 Positive Flanke

Zuviel Werbung?
-> Hier kostenlos registrieren
erstmal danke für die Mühe! ;) :)
ja fängt gleich mit NW1 an. Ich weiß nicht warum der die Kommentare nicht hier mit anzeigt... normalerweise ist jeder Merker, Ausgang usw beschriftet... Siehe die Bilder die ich reingestellt habe.

Ja der Titel vom NW2 ist falsch und noch nicht geändert.... das mache ich normalerweise zum schluss wenn das fertig ist bzw kurz zuvor. Das NW2 ist mein Problem... mit den Timern, wie schon geschrieben. Soll (schreibe jetzt mal ein Beispiel):

16:00 Uhr soll das Rollo runtergehen. Aber bevor das Relais vom Motor angeht soll 5s vorher die Spannung vom manuellen Schalter weg sein. Dies ist das Relais "+UV1/1K9" wie ich auch schon gezeichnet habe, die Schalter sind an dem Relais am Öffner und soll denn halt schon 5s vorher die Spannung wegnehmen...

"Rollo_Sicherheit" ist ein Merker. Auf den beiden Bilder sind die Kommentare alle drauf ;)
 
Zwischen den Bildchen und der Quelle hast Du noch ein paar Änderungen eingefügt, richtig?

Ich hab' den FC mal so umgestellt, wie ich es mit Deinen Vorgaben umsetzen würde:
Code:
FUNCTION "Rollo EG" : VOID
TITLE =
AUTHOR : Scholz
VERSION : 0.1


BEGIN
NETWORK
TITLE =Sicherheit Rollo EG
//Vor dem automatischem Hoch- oder Runterfahren, werden die Schalter für die 
//Rollos gesperrt
      U(    ; 
      U(    ; 
      O     "DB Allgemein".EG_Std_Fenster_Spaet; 
      O     "DB Allgemein".EG_Std_Fenster_Frueh; 
      )     ; 
      U     "Weihnachtszeit"; 
      O     "DB Rollo EG".EG_Schaltuhr_hoch; 
      O     "DB Rollo EG".EG_Schaltuhr_runter; 
      O     "DB Rollo EG".SZ_hoch; 
      O     "DB Rollo EG".SZ_runter; 
      )     ; 
      S     "Rollo_Sicherheit"; 
      U     "Timer7"; 
      R     "Rollo_Sicherheit"; 
      U     "Rollo_Sicherheit"; 
      =     L      0.0; 
      U     L      0.0; 
      BLD   102; 
      =     "+UV1/1K9"; 
      U     L      0.0; 
      L     S5T#50S; 
      SE    "Timer7"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Freigabe Fahrbefehle
//5s nach dem Sperren der Rolloschalter, Freigabe für automatisches Hoch- oder 
//Runterfahren
      U     "Rollo_Sicherheit"; 
      L     S5T#5S; 
      SE    "Timer6"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     "Timer6"; 
      =     "DB Rollo EG".RolloSicherheit; 
NETWORK
TITLE =Rollo Schlafzimmer hoch

      U(    ; 
      U(    ; 
      O     "DB Rollo EG".EG_Schaltuhr_hoch; 
      O     "DB Rollo EG".SZ_hoch; 
      )     ; 
      S     "DB Rollo EG".SZ_H; 
      U(    ; 
      O     "Timer4"; 
      O     "DB Rollo EG".SZ_R; 
      )     ; 
      R     "DB Rollo EG".SZ_H; 
      U     "DB Rollo EG".SZ_H; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      =     L      0.0; 
      U     L      0.0; 
      BLD   102; 
      =     "+UV1/1K1"; 
      U     L      0.0; 
      L     S5T#40S; 
      SE    "Timer4"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Schlafzimmer runter

      U(    ; 
      U(    ; 
      O     "DB Rollo EG".SZ_runter; 
      O     "DB Rollo EG".EG_Schaltuhr_runter; 
      )     ; 
      S     "DB Rollo EG".SZ_R; 
      U(    ; 
      O     "Timer5"; 
      O     "DB Rollo EG".SZ_H; 
      )     ; 
      R     "DB Rollo EG".SZ_R; 
      U     "DB Rollo EG".SZ_R; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      =     L      0.0; 
      U     L      0.0; 
      BLD   102; 
      =     "+UV1/1K2"; 
      U     L      0.0; 
      L     S5T#40S; 
      SE    "Timer5"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer hoch

      U(    ; 
      UN    "DB Rollo EG".WZ_R; 
      U     "DB Rollo EG".EG_Schaltuhr_hoch; 
      U     "DB Rollo EG".RolloSicherheit; 
      S     "DB Rollo EG".WZ_H; 
      U(    ; 
      O     "Timer1"; 
      O     "DB Rollo EG".WZ_R; 
      )     ; 
      R     "DB Rollo EG".WZ_H; 
      U     "DB Rollo EG".WZ_H; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#40S; 
      SE    "Timer1"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer runter
//
//
      U(    ; 
      U     "DB Rollo EG".EG_Schaltuhr_runter; 
      UN    "DB Rollo EG".WZ_H; 
      U     "DB Rollo EG".RolloSicherheit; 
      S     "DB Rollo EG".WZ_R; 
      U(    ; 
      O     "Timer2"; 
      O     "DB Rollo EG".WZ_H; 
      )     ; 
      R     "DB Rollo EG".WZ_R; 
      U     "DB Rollo EG".WZ_R; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#40S; 
      SE    "Timer2"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer Weihnachten hoch

      U(    ; 
      U     "Weihnachtszeit"; 
      U     "DB Allgemein".EG_Std_Fenster_Frueh; 
      UN    "DB Rollo EG".WZ_Z_R; 
      U     "DB Rollo EG".RolloSicherheit; 
      S     "DB Rollo EG".WZ_Z_H; 
      U(    ; 
      O     "Timer3"; 
      O     "DB Rollo EG".WZ_Z_R; 
      )     ; 
      R     "DB Rollo EG".WZ_Z_H; 
      U     "DB Rollo EG".WZ_Z_H; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#14S; 
      SE    "Timer3"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer Weihnachten runter

      U(    ; 
      U     "Weihnachtszeit"; 
      U     "DB Allgemein".EG_Std_Fenster_Spaet; 
      UN    "DB Rollo EG".WZ_Z_H; 
      U     "DB Rollo EG".RolloSicherheit; 
      S     "DB Rollo EG".WZ_Z_R; 
      U(    ; 
      O     "Timer8"; 
      O     "DB Rollo EG".WZ_Z_H; 
      )     ; 
      R     "DB Rollo EG".WZ_Z_R; 
      U     "DB Rollo EG".WZ_Z_R; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#15S; 
      SE    "Timer8"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer EG Relais hoch

      O     "Timer1"; 
      O     "Timer3"; 
      =     "+UV1/1K3"; 
NETWORK
TITLE =Rollo Wohnzimmer EG Relais runter

      O     "Timer2"; 
      O     "Timer8"; 
      =     "+UV1/1K4"; 
END_FUNCTION

Am Besten speicherst Du Deinen jetzigen Baustein zuerst noch einmal in der von Dir erstellten Quelle, um Deinen Code zu sichern.
Dann fügst Du eine neue leere AWL-Quelle ein und kopierst meinen Code dort rein.
Wenn Du dann auf Übersetzen (Strg+B) gehst, wird der vorhandene Baustein mit dem Code überschrieben.
Je nachdem, welche Quelle Du zuletzt übersetzt, kannst Du so auch einfach zwischen den beiden Varianten hin- und her wechseln.


PS: Getestet hab' ich das nicht. Demzufolge hoffe ich jetzt einfach mal, dass ich dort keinen Denkfehler drin habe. :)

PPS: Den Merker "Rollo_Sicherheit" solltest Du noch durch ein weiteres Bit im "DB Rollo EG" ersetzen.
 
Zuletzt bearbeitet:
Habe heute den Code mal eingefügt und habe ihn mal angeschaut, aber noch nicht getest...

Habe den verdacht, das wenn von der Schaltuhr ein ständiges 1 Signal kommt das die Timer wieder und immer wieder durchlaufen oder?:confused:
Mit der Schaltuhr kann ich zwar das 1 Signal begrenzen, wollte aber wenn alles klappt noch eine andere Funktion einfügen.... wo denn die ganze Nacht über ein 1 Signal da wäre....
 
Habe heute den Code mal eingefügt und habe ihn mal angeschaut, aber noch nicht getest...

Habe den verdacht, das wenn von der Schaltuhr ein ständiges 1 Signal kommt das die Timer wieder und immer wieder durchlaufen oder?:confused:
Mit der Schaltuhr kann ich zwar das 1 Signal begrenzen, wollte aber wenn alles klappt noch eine andere Funktion einfügen.... wo denn die ganze Nacht über ein 1 Signal da wäre....
Ja.
Ich bin von Impulsen ausgegangen, weil sonst ja die anderen Befehle nicht mehr verarbeitet werden können.
(Das war in Deinem ersten Bild so rüber gekommen, weil dort Flanke/SR erst nach dem ODER kam.)

Wenn auch dauerhafte Signale darunter sind, muss vor das SR-Glied noch eine Flanke. Wenn ein Dauersignal die weiteren Startsignale nicht behindern soll, braucht es eine eigene Flankenauswertung (vor dem ODER).


Wäre also gut, wenn Du die Startsignale nochmal klar definierst.
 
Wo hast Du denn überall ein Dauersignal?
Und die Flanken dafür müssen vermutlich vor das ODER bzw. zentral angelegt sein.
 
wie gesagt, die Schaltuhren wären kein Problem, aber wollte so machen, wenn es draußen 0°C sind und vom Dämmerungsschalter ein 1 Siganl kommt denn soll es runter gehen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie gesagt, die Schaltuhren wären kein Problem, aber wollte so machen, wenn es draußen 0°C sind und vom Dämmerungsschalter ein 1 Siganl kommt denn soll es runter gehen...
Nur runtergehen (Impuls am Eingang) oder auch gegenteilige Befehle blockieren (Dauersignal am Reset der Gegenrichtung)?
 
Hier ein Beispiel mit jeweils gemeinsamer Flanke für die Fahrbefehle:
Code:
FUNCTION "Rollo EG" : VOID
TITLE =
AUTHOR : Scholz
VERSION : 0.1


BEGIN
NETWORK
TITLE =Sicherheit Rollo EG
//Vor dem automatischem Hoch- oder Runterfahren, werden die Schalter für die 
//Rollos gesperrt
      U(    ; 
      O     "DB Rollo EG".SZ_H; 
      O     "DB Rollo EG".SZ_R; 
      O     "DB Rollo EG".WZ_H; 
      O     "DB Rollo EG".WZ_R; 
      O     "DB Rollo EG".WZ_Z_H; 
      O     "DB Rollo EG".WZ_Z_R; 
      )     ; 
      L     S5T#2S; 
      SA    "Timer7"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     "Timer7"; 
      =     "+UV1/1K9"; 
NETWORK
TITLE =Freigabe Fahrbefehle
//5s nach dem Sperren der Rolloschalter, Freigabe für automatisches Hoch- oder 
//Runterfahren
      U     "Timer7"; 
      L     S5T#5S; 
      SE    "Timer6"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     "Timer6"; 
      =     "DB Rollo EG".RolloSicherheit; 
NETWORK
TITLE =Rollo Schlafzimmer hoch
//
//
      U(    ; 
      U(    ; 
      O     "DB Rollo EG".EG_Schaltuhr_hoch; 
      O     "DB Rollo EG".SZ_hoch; 
      )     ; 
      FP    "DB Rollo EG".FM[1]; 
      S     "DB Rollo EG".SZ_H; 
      U(    ; 
      O     "Timer4"; 
      O     "DB Rollo EG".SZ_R; 
      )     ; 
      R     "DB Rollo EG".SZ_H; 
      U     "DB Rollo EG".SZ_H; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      =     L      0.0; 
      U     L      0.0; 
      BLD   102; 
      =     "+UV1/1K1"; 
      U     L      0.0; 
      L     S5T#40S; 
      SE    "Timer4"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Schlafzimmer runter
//
//
      U(    ; 
      U(    ; 
      O     "DB Rollo EG".SZ_runter; 
      O     "DB Rollo EG".EG_Schaltuhr_runter; 
      )     ; 
      FP    "DB Rollo EG".FM[2]; 
      S     "DB Rollo EG".SZ_R; 
      U(    ; 
      O     "Timer5"; 
      O     "DB Rollo EG".SZ_H; 
      )     ; 
      R     "DB Rollo EG".SZ_R; 
      U     "DB Rollo EG".SZ_R; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      =     L      0.0; 
      U     L      0.0; 
      BLD   102; 
      =     "+UV1/1K2"; 
      U     L      0.0; 
      L     S5T#40S; 
      SE    "Timer5"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer hoch
//
//
      U(    ; 
      U     "DB Rollo EG".EG_Schaltuhr_hoch; 
      FP    "DB Rollo EG".FM[3]; 
      S     "DB Rollo EG".WZ_H; 
      U(    ; 
      O     "Timer1"; 
      O     "DB Rollo EG".WZ_R; 
      )     ; 
      R     "DB Rollo EG".WZ_H; 
      U     "DB Rollo EG".WZ_H; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#40S; 
      SE    "Timer1"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer runter
//
//
      U(    ; 
      U     "DB Rollo EG".EG_Schaltuhr_runter; 
      FP    "DB Rollo EG".FM[4]; 
      S     "DB Rollo EG".WZ_R; 
      U(    ; 
      O     "Timer2"; 
      O     "DB Rollo EG".WZ_H; 
      )     ; 
      R     "DB Rollo EG".WZ_R; 
      U     "DB Rollo EG".WZ_R; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#40S; 
      SE    "Timer2"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer Weihnachten hoch
//
//
      U(    ; 
      U     "Weihnachtszeit"; 
      U     "DB Allgemein".EG_Std_Fenster_Frueh; 
      FP    "DB Rollo EG".FM[5]; 
      S     "DB Rollo EG".WZ_Z_H; 
      U(    ; 
      O     "Timer3"; 
      O     "DB Rollo EG".WZ_Z_R; 
      )     ; 
      R     "DB Rollo EG".WZ_Z_H; 
      U     "DB Rollo EG".WZ_Z_H; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#14S; 
      SE    "Timer3"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer Weihnachten runter
//
//
      U(    ; 
      U     "Weihnachtszeit"; 
      U     "DB Allgemein".EG_Std_Fenster_Spaet; 
      FP    "DB Rollo EG".FM[6]; 
      S     "DB Rollo EG".WZ_Z_R; 
      U(    ; 
      O     "Timer8"; 
      O     "DB Rollo EG".WZ_Z_H; 
      )     ; 
      R     "DB Rollo EG".WZ_Z_R; 
      U     "DB Rollo EG".WZ_Z_R; 
      )     ; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#15S; 
      SE    "Timer8"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
NETWORK
TITLE =Rollo Wohnzimmer EG Relais hoch
//
//
      O     "Timer1"; 
      O     "Timer3"; 
      =     "+UV1/1K3"; 
NETWORK
TITLE =Rollo Wohnzimmer EG Relais runter
//
//
      O     "Timer2"; 
      O     "Timer8"; 
      =     "+UV1/1K4"; 
END_FUNCTION
Für die Flankenmerker hab' ich im "DB Rollo EG" zusätzlich ein Array [1..6] of Bool für die 6 benötigten Flankenmerker FM[x] angelegt.


Die Ansteuerung des Sicherheitsrelais hab' ich auch mal zu einer Alternative geändert.
Es wird immer aktiviert, wenn irgendein Fahrauftrag anliegt und läuft noch etwas nach, wenn alles Fahren erledigt ist.
Das ist sicherer als die eigene Zeitsteuerung fürs Rückstellen.
Außerdem kann das Sicherheitsrelais einfacher zusätzlich aktiviert werden.
 
Zuletzt bearbeitet:
In den Code hatte sich die Sicherheit teilweise wieder in die Anforderungen der Fahrbefehle geschlichen, wo sie nicht hingehört. :oops:
K.A. wieso. Bestimmt beim Kopieren was falsch gemacht.

Hab' den Code gerade berichtigt.


PS: Das ist auch im Post#22 schon so. Da hab' ich wohl nicht so auf die Einschaltbedingungen beim WZ geachtet und nur die Sicherheit hinten angehangen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast ja sicher mehr als zwei Rollläden und vermutlich auch mehr als eine Etage.
Mit Deiner jetzigen Methode musst Du für jeden Rollladen den Code immer wieder einzeln anlegen, was mehr als umständlich ist.


Daher hab' ich Dir mal ein Beispiel erstellt, wie ich sowas normalerweise bei Deinen Voraussetzungen umsetzen würde:
Code:
FUNCTION_BLOCK "Sicherheit"
TITLE =Sicherheit
//Sicherheitsrelais schalten und Meldung "Sicherheit" ausgeben
VERSION : 0.1

VAR_INPUT
  Anforderung : BOOL ;    //Anforderung Sicherheitsrelais
  T_Ein : TIME  := T#5S;    //Verzögerung Meldung "Sicherheit"
  T_Aus : TIME  := T#2S;    //Nachlauf Sicherheitsrelais
END_VAR
VAR_OUTPUT
  Relais : BOOL ;    
  Sichherheit : BOOL ;    
END_VAR
VAR
  TOF_Aus : "TOF";    //Nachlauf Sicherheitsrelais
  TON_Sicher : "TON";    //Verzögerung Ausgabe "Sicherheit"
END_VAR

BEGIN
NETWORK
TITLE =Relais
//Relais "Abschaltung Vorort-Taster" einschalten
//Nachlauf bei Abschaltung der Anforderung
      U     #Anforderung; 
      =     L      0.0; 
      BLD   103; 
      CALL #TOF_Aus (
           IN                       := L      0.0,
           PT                       := #T_Aus,
           Q                        := #Relais);

      NOP   0; 
NETWORK
TITLE =Sicherheit
//Meldung "Sicherheit" mit Verzögerung ausgeben
      U     #Anforderung; 
      =     L      0.0; 
      BLD   103; 
      CALL #TON_Sicher (
           IN                       := L      0.0,
           PT                       := #T_Ein,
           Q                        := #Sichherheit);

      NOP   0; 
END_FUNCTION_BLOCK



FUNCTION_BLOCK "Rollo"
TITLE =Rollo
//Zentrale Ansteuerung für Rollo 
VERSION : 0.1

VAR_INPUT
  OK : BOOL ;    //Sicherheit hergestellt
  Auf1 : BOOL ;    //Rollladen auffahren (1. Fahrzeit)
  Ab1 : BOOL ;    //Rollladen abfahren (1. Fahrzeit)
  Aktiv2 : BOOL ;    //Fahrbefehle mit Laufzeiten 2 aktivieren
  Auf2 : BOOL ;    //Rollladen auffahren (2. Fahrzeit)
  Ab2 : BOOL ;    //Rollladen abfahren (2. Fahrzeit)
  Reset : BOOL ;    //Fahrbefehl löschen
  T1_Auf : TIME  := T#40S;    //Laufzeit 1 Auffahren
  T1_Ab : TIME  := T#40S;    //Laufzeit 1 Abfahren
  T2_Auf : TIME  := T#14S;    //Laufzeit 2 Auffahren
  T2_Ab : TIME  := T#15S;    //Laufzeit 2 Abfahren
END_VAR
VAR_OUTPUT
  Sicherheit : BOOL ;    //Sicherheit anfordern
  F_Auf : BOOL ;    //Fahrbefehl aufwärts
  F_Ab : BOOL ;    //Fahrbefehl abwärts
END_VAR
VAR
  FM : ARRAY  [1 .. 4 ] OF //Flankenmerker Eingänge
  BOOL ;    
  Richtung : ARRAY  [1 .. 4 ] OF //Flankenmerker Eingänge
  BOOL ;    
  Fahrbefehl : BOOL ;    
  LZ : TIME ;    
  TON_FZ : "TON";    //maximale Fahrzeit
END_VAR
VAR_TEMP
  Fahren : BOOL ;    
END_VAR

BEGIN
NETWORK
TITLE =Eingang Auf 1
//Fahrtrichtung 1 speichern
      U     #Auf1; 
      FP    #FM[1]; 
      =     L      1.0; 
      U     L      1.0; 
      BLD   102; 
      S     #Richtung[1]; 
      U     L      1.0; 
      SPBNB _001; 
      L     #T1_Auf; 
      T     #LZ; 
_001: NOP   0; 
NETWORK
TITLE =Eingang Ab 1
//Fahrtrichtung 2 speichern
      U     #Ab1; 
      FP    #FM[2]; 
      =     L      1.0; 
      U     L      1.0; 
      BLD   102; 
      S     #Richtung[2]; 
      U     L      1.0; 
      SPBNB _002; 
      L     #T1_Ab; 
      T     #LZ; 
_002: NOP   0; 
NETWORK
TITLE =Eingang Auf 2
//Fahrtrichtung 3 speichern
      U     #Auf2; 
      U     #Aktiv2; 
      FP    #FM[3]; 
      =     L      1.0; 
      U     L      1.0; 
      BLD   102; 
      S     #Richtung[3]; 
      U     L      1.0; 
      SPBNB _003; 
      L     #T2_Auf; 
      T     #LZ; 
_003: NOP   0; 
NETWORK
TITLE =Eingang Ab 2
//Fahrtrichtung 4 speichern
      U     #Ab2; 
      U     #Aktiv2; 
      FP    #FM[4]; 
      =     L      1.0; 
      U     L      1.0; 
      BLD   102; 
      S     #Richtung[4]; 
      U     L      1.0; 
      SPBNB _004; 
      L     #T2_Ab; 
      T     #LZ; 
_004: NOP   0; 
NETWORK
TITLE =Fahrbefehl setzen
//
      O     #Richtung[1]; 
      O     #Richtung[2]; 
      O     #Richtung[3]; 
      O     #Richtung[4]; 
      S     #Fahrbefehl; 
NETWORK
TITLE =Aufhebung Fahrbefehl und Richtung
//gegensätzliche Fahrtrichtungen
//Ablauf Zeit oder Reset
      U     #Richtung[1]; 
      U     #Richtung[2]; 
      O     ; 
      U     #Richtung[1]; 
      U     #Richtung[4]; 
      O     ; 
      U     #Richtung[3]; 
      U     #Richtung[2]; 
      O     ; 
      U     #Richtung[3]; 
      U     #Richtung[4]; 
      O     #Reset; 
      O     #TON_FZ.Q; 
      R     #Fahrbefehl; 
      R     #Richtung[1]; 
      R     #Richtung[2]; 
      R     #Richtung[3]; 
      R     #Richtung[4]; 
NETWORK
TITLE =Sicherheit anfordern
//Sicherheitsrelais anfordern
      U     #Fahrbefehl; 
      =     #Sicherheit; 
NETWORK
TITLE =Fahrbeginn
//Fahrbefehl + Sicherheit OK
      U     #Fahrbefehl; 
      U     #OK; 
      =     #Fahren; 
NETWORK
TITLE =Auffahren
//Fahrtrichtung 1 + 3
      U(    ; 
      O     #Richtung[1]; 
      O     #Richtung[3]; 
      )     ; 
      U     #Fahren; 
      =     #F_Auf; 
NETWORK
TITLE =Abfahren
//Fahrtrichtung 2 + 4
      U(    ; 
      O     #Richtung[2]; 
      O     #Richtung[4]; 
      )     ; 
      U     #Fahren; 
      =     #F_Ab; 
NETWORK
TITLE =Fahrzeit
//
      U     #Fahren; 
      =     L      1.0; 
      BLD   103; 
      CALL #TON_FZ (
           IN                       := L      1.0,
           PT                       := #LZ);

      NOP   0; 
END_FUNCTION_BLOCK



FUNCTION_BLOCK "Rollos_EG"
TITLE =
VERSION : 0.1

VAR
  Sicherheit : ARRAY  [1 .. 2 ] OF //Anforderungen Sicherheit
  BOOL ;    
  Sicherheit_OK : BOOL ;    
  FB_Rollo_WZ : "Rollo";    
  FB_Rollo_SZ : "Rollo";    
  FB_Sicherheit : "Sicherheit";    
END_VAR

BEGIN
NETWORK
TITLE =Sicherheit
//
      U(    ; 
      O     #Sicherheit[1]; 
      O     #Sicherheit[2]; 
      )     ; 
      =     L      0.0; 
      BLD   103; 
      CALL #FB_Sicherheit (
           Anforderung              := L      0.0,
           T_Ein                    := T#5S,
           T_Aus                    := T#2S,
           Relais                   := "+UV1/1K9",
           Sichherheit              := #Sicherheit_OK);
      NOP   0; 
NETWORK
TITLE =Rollo SZ
//
      U     #Sicherheit_OK; 
      =     L      0.0; 
      BLD   103; 
      U(    ; 
      O     "DB Rollo EG".EG_Schaltuhr_hoch; 
      O     "DB Rollo EG".SZ_hoch; 
      )     ; 
      =     L      0.1; 
      BLD   103; 
      U(    ; 
      O     "DB Rollo EG".SZ_runter; 
      O     "DB Rollo EG".EG_Schaltuhr_runter; 
      )     ; 
      =     L      0.2; 
      BLD   103; 
      CALL #FB_Rollo_SZ (
           OK                       := L      0.0,
           Auf1                     := L      0.1,
           Ab1                      := L      0.2,
           T1_Auf                   := T#30S,
           T1_Ab                    := T#30S,
           Sicherheit               := #Sicherheit[1],
           F_Auf                    := "+UV1/1K1",
           F_Ab                     := "+UV1/1K2");
      NOP   0; 
NETWORK
TITLE =Rollo WZ
//
      U     #Sicherheit_OK; 
      =     L      0.0; 
      BLD   103; 
      U     "DB Rollo EG".EG_Schaltuhr_hoch; 
      =     L      0.1; 
      BLD   103; 
      U     "DB Rollo EG".EG_Schaltuhr_runter; 
      =     L      0.2; 
      BLD   103; 
      U     "Weihnachtszeit"; 
      =     L      0.3; 
      BLD   103; 
      U     "DB Allgemein".EG_Std_Fenster_Frueh; 
      =     L      0.4; 
      BLD   103; 
      U     "DB Allgemein".EG_Std_Fenster_Spaet; 
      =     L      0.5; 
      BLD   103; 
      CALL #FB_Rollo_WZ (
           OK                       := L      0.0,
           Auf1                     := L      0.1,
           Ab1                      := L      0.2,
           Aktiv2                   := L      0.3,
           Auf2                     := L      0.4,
           Ab2                      := L      0.5,
           T1_Auf                   := T#40S,
           T1_Ab                    := T#40S,
           T2_Auf                   := T#14S,
           T2_Ab                    := T#15S,
           Sicherheit               := #Sicherheit[2],
           F_Auf                    := "+UV1/1K3",
           F_Ab                     := "+UV1/1K4");
      NOP   0; 
END_FUNCTION_BLOCK



DATA_BLOCK "IDB_Rollos_EG"
TITLE =
VERSION : 0.0

"Rollos_EG"
BEGIN
   Sicherheit[1] := FALSE; 
   Sicherheit[2] := FALSE; 
   Sicherheit_OK := FALSE; 
   FB_Rollo_WZ.OK := FALSE; 
   FB_Rollo_WZ.Auf1 := FALSE; 
   FB_Rollo_WZ.Ab1 := FALSE; 
   FB_Rollo_WZ.Aktiv2 := FALSE; 
   FB_Rollo_WZ.Auf2 := FALSE; 
   FB_Rollo_WZ.Ab2 := FALSE; 
   FB_Rollo_WZ.Reset := FALSE; 
   FB_Rollo_WZ.T1_Auf := T#40S; 
   FB_Rollo_WZ.T1_Ab := T#40S; 
   FB_Rollo_WZ.T2_Auf := T#14S; 
   FB_Rollo_WZ.T2_Ab := T#15S; 
   FB_Rollo_WZ.Sicherheit := FALSE; 
   FB_Rollo_WZ.F_Auf := FALSE; 
   FB_Rollo_WZ.F_Ab := FALSE; 
   FB_Rollo_WZ.FM[1] := FALSE; 
   FB_Rollo_WZ.FM[2] := FALSE; 
   FB_Rollo_WZ.FM[3] := FALSE; 
   FB_Rollo_WZ.FM[4] := FALSE; 
   FB_Rollo_WZ.Richtung[1] := FALSE; 
   FB_Rollo_WZ.Richtung[2] := FALSE; 
   FB_Rollo_WZ.Richtung[3] := FALSE; 
   FB_Rollo_WZ.Richtung[4] := FALSE; 
   FB_Rollo_WZ.Fahrbefehl := FALSE; 
   FB_Rollo_WZ.LZ := T#0MS; 
   FB_Rollo_WZ.TON_FZ.IN := FALSE; 
   FB_Rollo_WZ.TON_FZ.PT := T#0MS; 
   FB_Rollo_WZ.TON_FZ.Q := FALSE; 
   FB_Rollo_WZ.TON_FZ.ET := T#0MS; 
   FB_Rollo_WZ.TON_FZ.STATE := B#16#0; 
   FB_Rollo_WZ.TON_FZ.STIME := T#0MS; 
   FB_Rollo_WZ.TON_FZ.ATIME := T#0MS; 
   FB_Rollo_SZ.OK := FALSE; 
   FB_Rollo_SZ.Auf1 := FALSE; 
   FB_Rollo_SZ.Ab1 := FALSE; 
   FB_Rollo_SZ.Aktiv2 := FALSE; 
   FB_Rollo_SZ.Auf2 := FALSE; 
   FB_Rollo_SZ.Ab2 := FALSE; 
   FB_Rollo_SZ.Reset := FALSE; 
   FB_Rollo_SZ.T1_Auf := T#40S; 
   FB_Rollo_SZ.T1_Ab := T#40S; 
   FB_Rollo_SZ.T2_Auf := T#14S; 
   FB_Rollo_SZ.T2_Ab := T#15S; 
   FB_Rollo_SZ.Sicherheit := FALSE; 
   FB_Rollo_SZ.F_Auf := FALSE; 
   FB_Rollo_SZ.F_Ab := FALSE; 
   FB_Rollo_SZ.FM[1] := FALSE; 
   FB_Rollo_SZ.FM[2] := FALSE; 
   FB_Rollo_SZ.FM[3] := FALSE; 
   FB_Rollo_SZ.FM[4] := FALSE; 
   FB_Rollo_SZ.Richtung[1] := FALSE; 
   FB_Rollo_SZ.Richtung[2] := FALSE; 
   FB_Rollo_SZ.Richtung[3] := FALSE; 
   FB_Rollo_SZ.Richtung[4] := FALSE; 
   FB_Rollo_SZ.Fahrbefehl := FALSE; 
   FB_Rollo_SZ.LZ := T#0MS; 
   FB_Rollo_SZ.TON_FZ.IN := FALSE; 
   FB_Rollo_SZ.TON_FZ.PT := T#0MS; 
   FB_Rollo_SZ.TON_FZ.Q := FALSE; 
   FB_Rollo_SZ.TON_FZ.ET := T#0MS; 
   FB_Rollo_SZ.TON_FZ.STATE := B#16#0; 
   FB_Rollo_SZ.TON_FZ.STIME := T#0MS; 
   FB_Rollo_SZ.TON_FZ.ATIME := T#0MS; 
   FB_Sicherheit.Anforderung := FALSE; 
   FB_Sicherheit.T_Ein := T#5S; 
   FB_Sicherheit.T_Aus := T#2S; 
   FB_Sicherheit.Relais := FALSE; 
   FB_Sicherheit.Sichherheit := FALSE; 
   FB_Sicherheit.TOF_Aus.IN := FALSE; 
   FB_Sicherheit.TOF_Aus.PT := T#0MS; 
   FB_Sicherheit.TOF_Aus.Q := FALSE; 
   FB_Sicherheit.TOF_Aus.ET := T#0MS; 
   FB_Sicherheit.TOF_Aus.STATE := B#16#0; 
   FB_Sicherheit.TOF_Aus.STIME := T#0MS; 
   FB_Sicherheit.TOF_Aus.ATIME := T#0MS; 
   FB_Sicherheit.TON_Sicher.IN := FALSE; 
   FB_Sicherheit.TON_Sicher.PT := T#0MS; 
   FB_Sicherheit.TON_Sicher.Q := FALSE; 
   FB_Sicherheit.TON_Sicher.ET := T#0MS; 
   FB_Sicherheit.TON_Sicher.STATE := B#16#0; 
   FB_Sicherheit.TON_Sicher.STIME := T#0MS; 
   FB_Sicherheit.TON_Sicher.ATIME := T#0MS; 
END_DATA_BLOCK
Es gibt einen FB, der ein Relais zum Freischalten steuert und an die Rollos die entsprechende Rückmeldung rausgibt.
Der wird je Freischaltrelais einmal verwendet.

Dann gibt es einen FB, der ein Rollo steuert. Es gibt zwei verschieden Auf/Ab-Eingänge, um z.B. die unterschiedlichen Fahrzeiten in der Weihnachtszeit zu verwirklichen.
Er beinhaltet auch die Sicherheitsabfrage. Und löscht gegenwirkende Fahrbefehle während der Laufzeit (= Stop).
Dieser FB wird je Rollo einmal aufgerufen. An jedem Aufruf kann man individuelle Fahrbefehle und -zeiten angeben. Die Zeiten haben eine Voreinstellung. Somit müssten dazu gleiche Fahrzeiten nicht jedes Mal angegeben werden, wie ich es hier zur Sichtbarmachung der Individualität gemacht habe.


Um den Quellcode bei Dir übersetzen zu können, musst Du vorher in der Symboltabelle drei neue FBs ("Sicherheit", "Rollo" und "Rollos_EG") sowie einen neuen DB ("IDB_Rollos_EG") anlegen.
Nach dem Übersetzen im OB1 den FB "Rollos_EG" mit seinem zugehörigen DB "IDB_Rollos_EG" aufrufen.
Vlt. erstellst Du Dir ein neues Projekt, um Dir dieses Vorgehen bei der Programmierung in Ruhe anzuschauen.
Bei einem neuen Projekt musst Du auch Deine beiden DBs ("DB Allgemein" und "DB Rollo EG") und den Merker "Weihnachtszeit" (sollte in den Allgemein-DB) übertragen.

Wenn später mal Änderungen gemacht werden müssen, braucht man das nur einmal und nicht bei jedem Rollladen zu machen.
 
Zuletzt bearbeitet:
Du hast ja sicher mehr als zwei Rollläden und vermutlich auch mehr als eine Etage.

Das ist richtig, habe das Haus letztes Jahr gekauft und nun Renoviere ich alles Stück für Stück.
Bis jetzt sind es nur die beiden Rollos, da kommen aber bei der Etage noch 2 dazu und irgendwann sollen in den oberen Etagen die Rollos auch elektrisch Angesteuert werden... sind dann wenn es irgendwann fertig ist, um die 12 Rollos:ROFLMAO:

Vlt. erstellst Du Dir ein neues Projekt, um Dir dieses Vorgehen bei der Programmierung in Ruhe anzuschauen.

Wird wohl glaube ich besser sein, aber wie du bemerkt hast, habe ich nicht immer die Zeit das gleich umzusetzen...:rolleyes: Da ich immer nun nach der Arbeit bzw im Frei weiterbaue und wenn mal Zeit ist Programmiere.
Ich werds die nächsten Tage mal testen;)
 
Zurück
Oben