Step 7 Ampelsteurung

L

lrsschtt

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Ampelsteuerung

Nabend!

Für euch wahrscheinlich ein eher einfaches Problem. Ich habe in einem Modul zur Zeit die Aufgabe eine Ampelsterung in S7 zu programmieren. Eigentlich ist das ganze auch eindeutig beschrieben, dennoch habe ich probleme.


Hier ein Auszug aus der Aufgabenstellung

Es soll zunächst bei Betätigung des Tasters 1 ein Timer T1 als Verlängerter Impuls von 2 Sekunden gesetzt werden.

– Timer T1 soll Ampelphase 1 schalten bzw. FB1 aufrufen. FB1 soll dabei einen Merker z.B. M0.1 setzen.

– Timer T2 soll gestartet werden, wenn Timer T1 nicht läuft und M0.1 gesetzt ist. Somit ist sichergestellt, dass der Timer T2 erst dann gestartet wird, wenn Ampelphase 1 abgeschlossen ist. Wird M0.1 vergessen, würde Timer T2 immer gesetzt werden, wenn T1 nicht läuft also auch z.B. am Anfang, wenn Taster 1 noch nicht gedrückt ist.

– Timer T2 soll Ampelphase 2 schalten bzw. FB2 aufrufen. FB2 soll dabei einen anderen z.B. Merker M0.2 setzen. Das Problem ist nur, das durch das zyklische Hauptprogramm T2 auch sofort wieder gestartet werden würden, da die Bedingungen für den Start von T2 immer noch erfüllt sind. Deshalb ist es notwendig die Startbedingung von T2 zu erweitern bzw. eindeutiger zu formulieren: Der Timer soll nur starten, wenn M0.2 noch nicht gesetzt wurde.


– Timer T3 soll gestartet werden, wenn Timer T2 nicht läuft und M0.2 gesetzt ist bzw. M0.3 noch nicht gesetzt ist. Somit ist sichergestellt, dass der Timer T3 erst dann gestartet wird, wenn Ampelphase 2 abgeschlossen ist. Wird M0.2 vergessen, würde Timer T3 immer gesetzt werden, wenn T2 nicht läuft also auch z.B. am Anfang, wenn Taster 1 noch nicht gedrückt ist oder wenn T1 läuft.

– Timer T3 soll Ampelphase 3 schalten bzw. FB3 aufrufen. FB3 soll dabei einen anderen z.B. Merker M0.3 setzen.


U "Taster 2"
R M 0.1
R M 0.2
R M 0.3
UN M 0.1
UN M 0.2
UN M 0.3
L S5T#2S
SV T 1
U T 1
UC FB 1
S M 0.1




UN T 1
U M 0.1
UN M 0.2
UN M 0.3
SV T 2
U T 2
UC FB 2
S M 0.2






UN T 2
UN T 1
U M 0.2
UN M 0.3
SV T 3
UC FB 3
S M 0.3

Nun habe ich folgende Probleme. Bis zum Einfügen des letzten Partes ging es einigermaßen. Nun leuchten allerdings keinerlei Ausgänge mehr auf, und der T1 wird auch nur ca. 2x ausgeführt (beim simulieren). Wenn ich nun den Taster 1 erneut betätige bleibt der Code dort hängen weil der T1 nicht ausgeführt wird.

Eventuell könnt ihr mir da ein wenig weiterhelfen
 
Zuletzt bearbeitet:
lrsschtt schrieb:
U "Taster 2"
R M 0.1
R M 0.2
R M 0.3
UN M 0.1
UN M 0.2
UN M 0.3
L S5T#2S
SV T 1
U T 1
UC FB 1
S M 0.1

Ich denke dein Fehler beginnt schon an dem ersten Netzwerk.
Hast du dir das Konstrukt schon einmal genauer angeschaut?
Da wäre vermutlich ein Flanke sinnvoller.
Und eine FB mit UC aufrufen ist schlechter Stil.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich habe das ganze nunmal ein wenig bearbeitet. Wo genau liegt der Fehler?
Ich habe anstatt der Set Methode jetzt deine FP Methode verwendet. Nun läuft der T1 zwar immer wieder an, allerdings scheinen die Bedingungen des weiteren Codes !aus mir unverständlichen Gründen! nicht zu stimmen.

U "Taster 2" UN M 0.1
UN M 0.2
UN M 0.3
L S5T#2S
SV T 1
U T 1
UC FB 1
S M 0.1




UN T 1
FP M 0.1
UN M 0.2
UN M 0.3
SV T 2
U T 2
UC FB 2
S M 0.2






UN T 2
UN T 1
FP M 0.2
UN M 0.3
SV T 3
UC FB 3
S M 0.3
R M 0.1
R M 0.2
R M 0.3
 
Zuletzt bearbeitet:
So ist das gut. Mache um gotteswillen ja keine Kommentare an dein Programm. Sonst könnte man es ja auf den ersten Blick verstehen.
Und was passiert im FB 1, 2 und 3 ??

peter(R)
 
Die Online-Ansicht hilft in solchen Fällen eigentlich immer weiter.
Sieh' Dir in der step 7 Hilfe an wie man eine
Flanke erzeugt. Bei M0.1 und M0.2 handelt es sich nicht um die Flanke, sondern den Flankenmerker, den Du unten wieder platt machst.
Für T3 und T2 wir kein Zeitwert geladen.


Sent from my iPad using Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die Hilfe!

Habe mein Programm nun soweit hinbekommen, dass alle FB's angesteuert werden


R M 0.1
R M 0.2
R M 0.3

U "Taster 2"


UN M 0.1
UN M 0.2
UN M 0.3
L S5T#2S
SV T 1
U T 1
UC FB 1
S M 0.1




UN T 1
U M 0.1
SV T 2
U T 2
UC FB 2
S M 0.2


UN T 2
U M 0.2
SV T 3
U T 3
UC FB 3
S M 0.3




R M 0.1
R M 0.2
R M 0.3

FB1 steht nur für
= A 0.1
= A 0.3

Und FB2 für

= A 0.1
= A 0.4


Nun habe ich noch ein letztes Problem. Wenn in aufeinander folgenden FB's zweimal die selben Ausgänge angesteuert werden, wird der Ausgang bei FB1 nicht angezeigt.
Das heißt bei FB1 leuchten dann anstatt 2 LEDS dann nur eine.

Liegt das am UC ?
 
OK, Du hast Dir bisher eigene Mühe gegeben, deshalb hier mal eine komplett-Lösung.

Ich weiß nicht, was sich der Aufgabensteller gedacht hat, doch die Aufgabenstellung ist wie üblich nur eine akademische Programmierübung - weit weg von der Realität, weit weg von perfekt und weit weg von korrekt.
Auch was sich der Aufgabensteller mit der Forderung der FB-Aufrufe gedacht hat kann ich nicht nachvollziehen - ich finde darin nichts sinnvolles, außer das Programm künstlich zu verkomplizieren und vom Schüler unsaubere Programmierung zu verlangen.
In dem zitierten Teil der Aufgabenstellung steht nichts davon, daß die Lampenausgänge in den FB geschaltet werden sollen. Falls doch, dann beachte, daß die FB nur BEDINGT aufgerufen werden! Jeder FB müsste dann alle Lampenausgänge schalten (unsauber!). Und es müßte noch zusätzlich ein Ausschalten aller Ausgänge am Ende der Sequenz programmiert werden.

Ich sehe nicht, daß die Lösung in AWL gefordert wäre --> also wenn man AWL noch nicht richtig beherrscht, dann sollte man KOP oder FUP wählen. Man kann ja danach die Ansicht in AWL umstellen um zu sehen, wie man es in AWL programmieren könnte.

Hier mal meine 1:1-Übersetzung der Aufgabenstellung:

Damit man die Ampelsequenz mehrmals starten kann muß man die Hilfsmerker löschen. (dazu steht nichts in der Aufgabenstellung. Mein Code hier funktioniert zwar halbwegs, muß aber noch verbessert werden.)
Code:
// Netzwerk 1: Reset Hilfsmerker für Neustart Ampelsequenz
      U     "Taster_1"
      R     M0.1
      R     M0.2
      R     M0.3


Es soll zunächst bei Betätigung des Tasters 1 ein Timer T1 als Verlängerter Impuls von 2 Sekunden gesetzt werden.

– Timer T1 soll Ampelphase 1 schalten bzw. FB1 aufrufen. FB1 soll dabei einen Merker z.B. M0.1 setzen.
Code:
// Netzwerk 2: Timer Ampelphase 1

                 T1
            +----------+
"Taster_1"  |  S_VIMP  |        "Ampelphase_1"
---| |------|S        Q|------+------( )
            |          |      |
    S5T#2S -|TW    DUAL|-     |
            |          |      |         DB1
           -|R      DEZ|-     |     +---------+
            +----------+      |     |   FB1   |
                              +-----|EN    ENO|-
                                    +---------+
Code:
// Code im FB1

   M0.1     M0.1
---|/|------(S)


– Timer T2 soll gestartet werden, wenn Timer T1 nicht läuft und M0.1 gesetzt ist. Somit ist sichergestellt, dass der Timer T2 erst dann gestartet wird, wenn Ampelphase 1 abgeschlossen ist. Wird M0.1 vergessen, würde Timer T2 immer gesetzt werden, wenn T1 nicht läuft also auch z.B. am Anfang, wenn Taster 1 noch nicht gedrückt ist.

– Timer T2 soll Ampelphase 2 schalten bzw. FB2 aufrufen. FB2 soll dabei einen anderen z.B. Merker M0.2 setzen. Das Problem ist nur, das durch das zyklische Hauptprogramm T2 auch sofort wieder gestartet werden würden, da die Bedingungen für den Start von T2 immer noch erfüllt sind. Deshalb ist es notwendig die Startbedingung von T2 zu erweitern bzw. eindeutiger zu formulieren: Der Timer soll nur starten, wenn M0.2 noch nicht gesetzt wurde.
(Wie lang soll die Timerzeit sein?)
Code:
// Netzwerk 3: Timer Ampelphase 2

                                   T2
                              +----------+
    T1      M0.1     M0.2     |  S_VIMP  |        "Ampelphase_2"
---|/|------| |------|/|------|S        Q|------+------( )
                              |          |      |
                      S5T#2S -|TW    DUAL|-     |
                              |          |      |         DB2
                             -|R      DEZ|-     |     +---------+
                              +----------+      |     |   FB2   |
                                                +-----|EN    ENO|-
                                                      +---------+
Code:
// Code im FB2

   M0.2     M0.2
---|/|------(S)


– Timer T3 soll gestartet werden, wenn Timer T2 nicht läuft und M0.2 gesetzt ist bzw. M0.3 noch nicht gesetzt ist. Somit ist sichergestellt, dass der Timer T3 erst dann gestartet wird, wenn Ampelphase 2 abgeschlossen ist. Wird M0.2 vergessen, würde Timer T3 immer gesetzt werden, wenn T2 nicht läuft also auch z.B. am Anfang, wenn Taster 1 noch nicht gedrückt ist oder wenn T1 läuft.

– Timer T3 soll Ampelphase 3 schalten bzw. FB3 aufrufen. FB3 soll dabei einen anderen z.B. Merker M0.3 setzen.
(Wie lang soll die Timerzeit sein?)
Code:
// Netzwerk 4: Timer Ampelphase 3

                                   T3
                              +----------+
    T2      M0.2     M0.3     |  S_VIMP  |        "Ampelphase_3"
---|/|------| |------|/|------|S        Q|------+------( )
                              |          |      |
                      S5T#2S -|TW    DUAL|-     |
                              |          |      |         DB3
                             -|R      DEZ|-     |     +---------+
                              +----------+      |     |   FB3   |
                                                +-----|EN    ENO|-
                                                      +---------+
Code:
// Code im FB3

   M0.3     M0.3
---|/|------(S)


Im Aufgabenstellungs-Zitat steht nichts darüber, wie die Lampenausgänge geschaltet werden sollen. Vielleicht einfach so:
Code:
// Netzwerk 5: Lampe 1
      U     "Ampelphase_1"
      =     A0.1

// Netzwerk 6: Lampe 2
      U     "Ampelphase_2"
      =     A0.2

// Netzwerk 7: Lampe 3
      U     "Ampelphase_3"
      =     A0.3

Ich weiß nicht, ob der Aufgabensteller mit dieser ungenauen Lösung zufrieden ist, doch sie entspricht genau der zitierten Aufgabenstellung. Verbessern kannst Du die Lösung nun selber. Vor allem entscheide, wie lange der Taster gedrückt werden darf und ob die Ampelsequenz beim Drücken oder beim Loslassen des Tasters starten soll. Ggf. brauchst Du dann zusätzlich Flankenerkennung.


Liebe Kinder! Bitte nicht nachmachen und gewöhnt Euch solche stümperhafte Programmierung garnicht erst an. :ROFLMAO:

Harald
 
Vielen Dank für diese ausführliche Antwort. Ich habe die Aufgabenstellung nur zum Teil zitiert, dort ist natürlich noch eine Zeit von 2s angegeben und auch welcher Ausgang dann später (im Labor) welche LED ansteuern soll.

Mein Code lässt sich mittlerweile auch immer wieder starten ohne dass es dort zu Problemen kommt. Mein einziges Problem besteht zur Zeit darin, dass beim ansteuern von FB1 keine LED leuchtet. Beim ansteuern von FB2 und FB3 gehen die LED'S tadellos an.

FB1
= A 0.1
= A 0.3

FB2
= A 0.1
= A 0.4


und FB3
= A 0.0
= A 0.3


Ich gehe mal davon aus, dass die Ausgänge 0.1 und 0.3 nicht aufleuchten, das sie jeweils erst bei FB2 und FB3 angeschaltet werden.
Nun bleibt die Frage wie das zu beheben ist. Wie im Code zusehen, steuere ich diese jeweils mit UC an.

Da diese Aufgabe ein Teil meine 1. Laborversuches ist, gehe ich davon aus, dass die "sauberkeit" des Programmierens im Laufe der Veranstaltung ansteigen wird .:p

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ihr solltet vor der Zuweisung das VKE auf 1 setzen
(SET)
Ausgänge, die nicht angesteuert werden sollen solltet ihr auch zuweisen. Vorher das VKE auf 0 setzen
(CLR)


Sent from my iPad using Tapatalk
 
1.) Bei Deinem zuletzt gezeigten Code in #6 werden die FB1, FB2 und FB3 IMMER aufgerufen (UC FBx). Jeder FB macht ein paar Ausgangs-Zuweisungen, jedoch die letzte Zuweisung gewinnt! Z.B. die Zuweisung =A0.1 in FB1 ist total überflüssig und wirkungslos, weil danach nochmal im FB2 eine Zuweisung =A0.1 erfolgt, welche die Zuweisung vom FB1 überschreibt. Außerdem sind Mehrfach-Zuweisungen zu Ausgängen in verschiedenen Bausteinen höchst unsauber.

2.) Der Aufruf eines FB mit UC oder CC ohne einen Instanz-DB einzustellen ist sowas von unsauber, das braucht niemand wirklich! Das läßt sich garantiert auch anders sauber lösen. Wenn der FB gar keinen Instanz-DB braucht (wenn er keine Übergabeparameter und keine STAT-Variablen hat), dann kann man die Sauerei auch mit einem FC lösen und kommt dann innerhalb des Bausteins garnicht erst auf die Idee, daß der Baustein in einer für FB normalen Ablaufumgebung laufen würde ...

3.) Das VKE als impliziter Übergabeparameter IN und OUT ist sowas von unsauber, das kann von Deinem Aufgabensteller nicht gewollt sein! Zumindest nicht, wenn er sich "seriöses Bildungsunternehmen" nennt.

Also vergiß Deinen Code mit dem UC und der VKE-Übergabe.
Lies nochmal genauestens die Aufgabenstellung oder zeige sie uns, wo dieses Vorgehen möglicherweise verlangt wird.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Harald hat recht.
Er hat auch sehr gut aufgezeigt, wie es funktionieren kann.
Wenn er auch selbst das Ergebnis etwas einschränkt. ;)

Ich habe bereits in meinem ersten Beitrag die Aufrufe bemängelt.
Doch man muss ja keine Tipps annehmen.


bike
 
Zurück
Oben