Step 7 Positive Flanke

Hetzer

Level-1
Beiträge
67
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

erstmal am rande, steuere mit meiner S7 das ganze Haus und in diesen Fall auch die Rollos. Bis gestern hat alles funktioniert wie es sollte, aber irgendwie hat heute irgendwas im Programm quergeschossen.
(siehe Bild) So habe ich die Ansteuerung zur Sicherheit, dass wenn das Rollo automatisch fährt keiner manuell am schalter eine falsche Richtung einstellt. Und zwar habe ich ein Problem mit der Positiven Flanke gehabt... Wie geschrieben lief Monate so bis auf heut. (dazu muss man sagen das ich statt M102.2 intern eine temporäre Variable (#POS) gegeben habe). Aber seit heute gibt er die Positive Flanke weder mit dem Merker durch noch mit der Variablen...

Jetzt habe ich einfach zwischen dem Positiven Flanken Baustein und der Einschaltverzögerung noch ein SR-Glied reingemacht und nun geht es wieder...
Meine Frage also. Warum ging es die ganze Zeit so, ohne was zuverändern und dann auf einmal nicht?

Vielen Dank im Vorraus

Tommy
 

Anhänge

  • step7 pos.jpg
    step7 pos.jpg
    66,9 KB · Aufrufe: 159
Mit der temporären Variable hat das Ganze funktioniert, weil diese Variable sich nichts gezielt von Zyklus zu Zyklus merken kann und somit in jedem Zyklus eine neue Flanke generiert wurde.
Ein klassischer Denkfehler, der hier zur Funktion geführt hat.

Eine Frage dazu:
Eine Flanke soll ein Signal bilden, dass nur einen Zyklus dauert, ok? Und ein Zyklus soll max. ein paar Millisekunden dauern, oder?
Wie soll dann bei einer korrekt funktionierenden Flanke eine Einschaltverzögerung von 5s jemals ausgelöst werden?

Das ging vorher also nur aufgrund eines Zufalls. Dieser Zufall war, dass die temporäre Variable tatsächlich immer neu initialisiert wurde.
Jetzt nach den Änderungen/Rücknahmen (was auch immer) wird wahrscheinlich der Baustein zufällig wieder seinen vorherigen temporären Speicher bekommen und sich damit zufällig was merken,
so wie er es mit dem globalen Merker immer macht. Mit einer Speicherung des vorigen Zustands kann aber nicht in jedem Zyklus eine neue Flanke gebildet werden.

Es hat also überhaupt keinen Sinn danach zu suchen, warum es jetzt nicht mehr funktioniert, weil das dem Programm nach korrekt ist.
Die vorige Funktion war der eigentliche Fehler/Zufall.



PS: Mit dem SR-Glied geht es jetzt, weil damit das EIN-Signal nicht nur einen Zyklus sondern dauerhaft ansteht und die 5s auch ablaufen können.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Frage dazu:
Eine Flanke soll ein Signal bilden, dass nur einen Zyklus dauert, ok?
Wie soll dann bei einer korrekt funktionierenden Flanke eine Einschaltverzögerung von 5s jemals ausgelöst werden?

Die Flanke soll nur kurz das 1 Signal an das Zeitglied weiter geben.

Das ganze läuft so ab:
1.Die Schaltuhr sagt, das das Rollo runterfahren soll.
2.Ein Relais schaltet von dem Schalter am Fester die Spannung weg
3. 5s später dann fährt dann das Rollo runter...

Die 5s sind dafür, dass wenn der Schalter am Fenster für das Rollo noch eingeschalten sein sollte, das der Motor denn nicht gleichzeitig Spannug für hoch und runter bekommt.
 
Eine Flanke wird gebildet, in dem der Zustand in diesem Zyklus mit dem Zustand des vorigen Zyklus verglichen wird.
Ist er im jetzigen 1 und im vorigen 0 wird ein Signal ausgegeben. Der Zustand des jetzigem Zyklus wird anschließend im Flankenmerker für den nächsten Zyklus gespeichert.
Im nächsten Zyklus ist aber der Zustand vom vorigen (der im Flankenmerker) auch 1 und die Vorraussetzung für die Signalausgabe ist nicht mehr gegeben.

Bei Dir hat die erste (funktionierende) Zeit keine Speicherung des vorigen Zustands stattgefunden, deswegen hattest Du in jedem Zyklus ein Signal und die Einschaltverzögerung konnte nach 5s auslösen.
Mit einem echten Speicher, wie globalen Merkern, funktioniert sowas nie.
Manchmal erhält der temporäre Speicher seinen Bereich aus dem Vorzyklus wieder und hat damit auch eine speichernde Wirkung. Manchmal bekommt er einen neuen Bereich und hat damit keine speichernde Wirkung. Das kann man aber nicht bewusst beeinflussen. Das ist Zufall.


Es funktionierte bei Dir nur aufgrund einer fehlerhaften Programmierung kombiniert mit Zufall, dass die Flanke keine war. Im Prinzip hättest Du die Flanke auch weglassen können und hättest die gleiche Funktion gehabt.

Es macht nie Sinn, eine Flanke mit einer Einschaltverzögerung zu kombinieren, weil Letztere von Ersterem normalerweise nicht ausgelöst werden kann.
 
Zuletzt bearbeitet:
Im Prinzip hättest Du die Flanke auch weglassen können und hättest die gleiche Funktion gehabt.

Da kommen wir aber zu einem anderen Problemm... Da die Timer denn solange wie das 1 Signal anliegt immer wieder durchlaufen...:confused: Also so ist es bei mir... steh mit den Timer irgendwie auf Kriegsfuß:D mal geht es so, mal fangen die wieder von vorn anzuzählen, solange der Eingang 1 ist:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Normalerweise hängt man an jeden Motorausgang eine Ausschaltverzögerung (5s) hinten dran.
Solange die noch läuft, kann die Gegenrichtung noch nicht starten.

Diese Zeit wirkt nur auf die Gegenrichtung, nicht auf den eigenen Ausgang.
 
Normalerweise hängt man an jeden Motorausgang eine Ausschaltverzögerung (5s) hinten dran

naja dadurch das die Schalter direkt auf den Rolladenmotor gehen, bingt das nix :(

Haben Sie ne Idee wie ich das ohne Flanke hinbekomme?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne jetzt die genauen Umstände zu kennen:
Die Flanke vor dem Timer weg und ein UND dafür einfügen.
Mit dem Timer ein dahinter befindliches SR-Glied setzen.
Den 2. Eingang des UNDs vor dem Timer mit dem negierten Bit des SR-Glieds belegen.

Das SR-Glied nach Ablauf der Fahrzeit zurück setzen.
 
Hab' grad noch das Bild gesehen.
Danach ist die Lösung mit dem SR-Glied vor dem Timer wahrscheinlich die bessere Lösung.

Das gesetzte SR öffnet gleichzeitig das Relais und startet die Einschaltverzögerung. Nach Ablauf der 5s Einschaltverzögerung kann dann der Ausgang der SPS für das Rollo gesetzt werden.


Ist halt blöd, mit nur Halbwissen irgendwelche Tipps zu geben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist halt blöd, mit nur Halbwissen irgendwelche Tipps zu geben.

ich werds erstmal so probieren ;)

Und ich dachte immer das der Baustein "Positive Flanke" immer nur den Signal wechsel von 0 auf 1 auswertet und dann durchschaltet... Das der denn den Wert speichert und dann wieder vergleicht, ist meines erachtens irgendwie falsch...

In der Schule früher haben die immer gesagt, das ist vergleichbar mit so einem Totmannschalter... immer wenn er die Taste drückt, denn gehts weiter.... wäre aber die in diesen Fall nicht so:confused:
 
Ist halt blöd, mit nur Halbwissen irgendwelche Tipps zu geben.
Vlt. postest Du mal noch den Rest des Bausteins/Rollos, damit man besser helfen kann.
;)


Am besten den Baustein als Quelle exportieren oder wenigstens die Ansicht auf AWL umschalten und den Text dann hier als Code posten.
Dann ist es einfacher in den eigenen Editor einfügbar.
 
Alles klar, würde ich denn aber erst morgen bzw nachher machen... der Programmier PC ist schon aus:icon_lol:

P.S. mit AWL kann ich gar nicht anfangen:ROFLMAO: Programmiere ausschließlich in FUB
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und ich dachte immer das der Baustein "Positive Flanke" immer nur den Signal wechsel von 0 auf 1 auswertet und dann durchschaltet... Das der denn den Wert speichert und dann wieder vergleicht, ist meines erachtens irgendwie falsch...
Ja, der Wechsel von 0 auf 1.

Der liegt vor, wenn im vorigen Zyklus 0 und im jetzigen 1. Deswegen muss der "Zustand des jetzigen Zyklus" für den nächsten Zyklus als dann "Zustand voriger Zyklus" gespeichert werden.
Und deshalb ist die Flanke auch immer nur einen Zyklus auf 1.

Im nächsten Zyklus ist "voriger Zyklus" = 1 und nicht mehr 0, deshalb ist die Flanke dann wieder 0.


Alle Flanken sind beim jeweils zu detektierenden Signalwechsel immer nur einen Zyklus lang 1!



Die Einschaltverzögerung braucht aber für ihre ganze Verzögerungszeit (und darüber hinaus) ein 1-Signal, um an zu gehen.





In der Schule früher haben die immer gesagt, das ist vergleichbar mit so einem Totmannschalter... immer wenn er die Taste drückt, denn gehts weiter.... wäre aber die in diesen Fall nicht so:confused:
Nein, nur ein einziger Schritt (Zyklus) würde dann gemacht. Man müsste immer wieder loslassen und neu drücken.
PS: Ein Totmannschalter ist ein einfacher Taster ohne irgendwelche Selbsthaltekontakt, die ihn dauerhaft überbrücken können.
 
Zuletzt bearbeitet:
P.S. mit AWL kann ich gar nicht anfangen:ROFLMAO:
Musst Du ja auch nicht unbedingt. Nur die Ansicht für's Posten umschalten.
Und Copy & Paste geht mit Text nun mal wesentlich einfacher als mit Bildchen.
Damit kannst Du wahrscheinlich mehr Helfer erreichen, als wenn man alles entweder nachprogrammieren oder aus dem Kopf machen muss.
;)
 
So hier der Quellcode in AWL, hoffe man kann es erkennen... Den Code so rauskopieren konnte ich irgendwie nicht... zumindesten wären dann nicht die Kommentare dabei...
 

Anhänge

  • Rollo 1.jpg
    Rollo 1.jpg
    314,7 KB · Aufrufe: 40
  • Rollo 2.jpg
    Rollo 2.jpg
    228,9 KB · Aufrufe: 34
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt sind's wieder Bildchen, da hätten wir auch bei FUP bleiben können.
;)


Wenn Du den Baustein im Editor geöffnet hast, dann im Menü "Datei" auf "Quelle generieren" (Ctrl+T) gehen. Dann wird im Ordner Quellen eine komplette Text-Datei mit Bausteinschnittstelle und Kommentaren angelegt. Diese im Editor öffnen, mit STRG-A alles markieren, mit Strg+C kopieren und im Forum zunächst auf den Button Code (#) (2. Icon-Reihe, letzter Button) drücken und dann zwischen den Code-Tags die kopierte Quelle mit Strg+V einfügen.
 
so jetzt hier der code, soweit geht das jetzt mit den Rollos hoch und runter, nur was nicht geht, das wenn das Relais für die Spannung der Schalter angesteuert wird, dass die Motoren erst 5s danach laufen.... das funktioniert leider nicht :(
Code:
FUNCTION "Rollo EG" : VOID
TITLE =
AUTHOR : Scholz
VERSION : 0.1

BEGIN
NETWORK
TITLE =Sicherheit Rollo EG
//5s vor automatischem hoch oder runter fahren, werden die Schalter für die 
//Rollos 
//gesperrt
//
      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; 
      =     "Rollo_Sicherheit"; 
NETWORK
TITLE =EG WZ Rollo runter Weihnachten

      U(    ; 
      O(    ; 
      U(    ; 
      U     "Rollo_Sicherheit"; 
      L     S5T#2S; 
      SA    T      9; 
      U     "Timer6"; 
      UN    "Rollo_Sicherheit"; 
      R     T      9; 
      NOP   0; 
      NOP   0; 
      U     T      9; 
      )     ; 
      L     S5T#5S; 
      SE    "Timer6"; 
      U(    ; 
      O     "Timer8"; 
      O     "Timer5"; 
      O     "Timer4"; 
      O     "Timer3"; 
      O     "Timer2"; 
      O     "Timer1"; 
      )     ; 
      U     "Timer6"; 
      R     "Timer6"; 
      NOP   0; 
      NOP   0; 
      U     "Timer6"; 
      )     ; 
      O     M      1.0; 
      )     ; 
      R     "DB Rollo EG".RolloSicherheit; 
      U     "Rollo_Sicherheit"; 
      U     "Timer6"; 
      S     "DB Rollo EG".RolloSicherheit; 
      U     "DB Rollo EG".RolloSicherheit; 
      =     "DB Rollo EG".RolloSicherheit; 
NETWORK
TITLE =Relais für Schalter manuell

      U(    ; 
      U(    ; 
      O     "Timer8"; 
      O     "Timer3"; 
      O     "Timer1"; 
      O     "Timer2"; 
      O     "DB Rollo EG".RolloSicherheit; 
      O     "Timer4"; 
      O     "Timer5"; 
      O     "Timer6"; 
      )     ; 
      S     "DB Rollo EG".SR_Rollo_Relais; 
      U     "Timer7"; 
      R     "DB Rollo EG".SR_Rollo_Relais; 
      U     "DB Rollo EG".SR_Rollo_Relais; 
      )     ; 
      L     S5T#50S; 
      SA    "Timer7"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     "Timer7"; 
      =     "+UV1/1K9"; 
NETWORK
TITLE =Rollo Schlafzimmer hoch

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

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

      U(    ; 
      UN    "DB Rollo EG".WZ_R; 
      U     "DB Rollo EG".EG_Schaltuhr_hoch; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#40S; 
      SA    "Timer1"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     "Timer1"; 
      )     ; 
      UN    "DB Rollo EG".WZ_R; 
      =     "DB Rollo EG".WZ_H; 
NETWORK
TITLE =Rollo Wohnzimmer runter
//
//
      U(    ; 
      U     "DB Rollo EG".EG_Schaltuhr_runter; 
      UN    "DB Rollo EG".WZ_H; 
      U     "DB Rollo EG".RolloSicherheit; 
      L     S5T#40S; 
      SA    "Timer2"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     "Timer2"; 
      )     ; 
      UN    "DB Rollo EG".WZ_H; 
      =     "DB Rollo EG".WZ_R; 
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; 
      L     S5T#14S; 
      SA    "Timer3"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     "Timer3"; 
      )     ; 
      UN    "DB Rollo EG".WZ_Z_R; 
      =     "DB Rollo EG".WZ_Z_H; 
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; 
      L     S5T#15S; 
      SA    "Timer8"; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     "Timer8"; 
      )     ; 
      UN    "DB Rollo EG".WZ_Z_H; 
      =     "DB Rollo EG".WZ_Z_R; 
NETWORK
TITLE =Rollo Wohnzimmer EG Relais hoch

      O     "DB Rollo EG".WZ_H; 
      O     "DB Rollo EG".WZ_Z_H; 
      =     "+UV1/1K3"; 
NETWORK
TITLE =Rollo Wohnzimmer EG Relais runter

      O     "DB Rollo EG".WZ_Z_R; 
      O     "DB Rollo EG".WZ_R; 
      =     "+UV1/1K4"; 
END_FUNCTION
 
Ich hab' das mal bei mir in S7 eingefügt und mir auch die Mühe gemacht, noch die beiden benutzten DBs und die globale Symbolik zu erstellen.

Obiger Auszug ist gleich aus dem NW1, oder?
Wirklich verwirren tut mich im Augenblick das NW2. Bezeichnet ist es mit "EG WZ Rollo runter Weihnachten" aber es beinhaltet nur Timer und "Sicherheit".
Da passt wohl der Titel nicht zum Inhalt?

Ich denke in diesem NW muss man den Versatz zwischen Tasterabschaltung und Rollo fahren bewirken.

Ich hab' aber noch etwas Mühe, mich in Deine Programmierweise hinein zu versetzen.
Du könntest mir da noch etwas behilflich sein, wenn Du noch beschreibst, welcher Timer wofür sein soll. Insbesondere in dem NW2.


Ich sortier außerdem noch den Rest für mich (Relais usw.). Ich muss Dich also noch etwas vertrösten.

PS: Ist "Rollo_Sicherheit" auch ein Ausgang/Relais oder ist das ein Merker?
Was bewirkt das Relais "+UV1/1K9"? Ist das das Relais, das die Schalter tot legt, wenn über die SPS angesteuert wird?
 
Zuletzt bearbeitet:
Zurück
Oben