Step 7 Lauflicht mal anders

Spucas Leicher

Level-1
Beiträge
24
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ich bräuchte mal eure Hilfe

Aufgabe: Solange der Taster gedrückt ist, sollen 5 Lampen nacheinander aufleuchten, bis dieser wieder losgelassen wird. Dann soll die Lampe blinken, die zuletzt aufgeleuchtet ist.
Genau diese Lampe soll dann aber beim nächsten Betätigen des Schalters nicht mehr aufleuchten. Wenn alle Lampen an waren, fängt es wieder von vorne an.

Mein Vorschlag wäre dies mit einem Zähler und Sprüngen umzusetzen:
Code:
      U     Taster 1
      U     "Clk10"
      ZV    Z      2
      L     Z      2
      L     5
      >I    
      L     C#0
      S     Z      2

      U     "U07SeqD".Seq.User.Bit21              
      SPB   M001                                            //Wenn Bit 21 gesetzt, sprich Lampe geblinkt hat dann zu M001
      L     Z      2
      L     1
      ==I   
      L     C#1
      =     "U07SeqD".Seq.User.Bit15

M001: U     "U07SeqD".Seq.User.Bit22
      SPB   M002                                              //Wenn Bit 22 gesetzt, sprich Lampe geblinkt hat dann zu M002

      L     Z      2
      L     2
      ==I   
      L     C#2
      =     "U07SeqD".Seq.User.Bit16

M002: U     "U07SeqD".Seq.User.Bit23
      SPB   M003                                        //Wenn Bit 23 gesetzt, sprich Lampe geblinkt hat dann zu M003
      L     Z      2
      L     3
      ==I   
      L     C#3
      =     "U07SeqD".Seq.User.Bit17


M003: U     "U07SeqD".Seq.User.Bit24
      SPB   M004                                                  //Wenn Bit 24 gesetzt, sprich Lampe geblinkt hat dann zu M004
      L     Z      2
      L     4
      ==I   
      L     C#4
      =     "U07SeqD".Seq.User.Bit18

M004: U     "U07SeqD".Seq.User.Bit25
      L     Z      2
      L     5
      ==I   
      L     C#5
      =     "U07SeqD".Seq.User.Bit19






      U     "U07SeqD".Seq.User.Bit15
      U     Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit15
      UN   Taster 1
      S     "U07SeqD".Seq.User.Bit21               // Bit wird gesetzt, wenn Lampe blinkt
      U     "Clk20"
      =   Lampe 1



      U     "U07SeqD".Seq.User.Bit16
      U    Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit16
      UN  Taster 1
      S     "U07SeqD".Seq.User.Bit22                   // Bit wird gesetzt, wenn Lampe blinkt
      U     "Clk20"
      =    Lampe 2


      U     "U07SeqD".Seq.User.Bit17
      U    Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit17
      UN    Taster 1
      S     "U07SeqD".Seq.User.Bit23                // Bit wird gesetzt, wenn Lampe blinkt
      U     "Clk20"
      =     Lampe 3




      U     "U07SeqD".Seq.User.Bit18
      U    Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit18
      UN    Taster 1
      S     "U07SeqD".Seq.User.Bit24                      // Bit wird gesetzt, wenn Lampe blinkt
      U     "Clk20"
      =   Lampe 4





      U     "U07SeqD".Seq.User.Bit19
      U     Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit19
      UN    Taster 1
      S     "U07SeqD".Seq.User.Bit25                          // Bit wird gesetzt, wenn Lampe blinkt
      U     "Clk20"
      =    Lampe 5


      U     "U07SeqD".Seq.User.Bit21
      U     "U07SeqD".Seq.User.Bit22
      U     "U07SeqD".Seq.User.Bit23
      U     "U07SeqD".Seq.User.Bit24
      U     "U07SeqD".Seq.User.Bit25
      =     M      8.0


      U     M      8.0
      R     "U07SeqD".Seq.User.Bit21               // Bits werden zurück gesetzt, wenn alle gesetzt wurden
      R     "U07SeqD".Seq.User.Bit22
      R     "U07SeqD".Seq.User.Bit23
      R     "U07SeqD".Seq.User.Bit24
      R     "U07SeqD".Seq.User.Bit25

Problem ist jetzt aber, dass alle Lampen die ganze Zeit blinken. Wo ist mein Fehler?
 
Hallo,
du hast es auf jeden Fall viel zu kompliziert gemacht :D und auch noch in AWL *würg*. Verzeih mir daher, dass ich deinen Code nicht durchgehe und nach nem Fehler suche
ich würde es so machen das du bei gedrückter taste den Zähler hoch zählst wie du es auch schon gemacht hast.

Dann würde ich es pro Lampe wie folgt machen:
Wenn Zähler = 1 und entweder der Blinktakt oder der Taster gedrückt wird leuchtet die Lampe 1

Ich hab schon ewig kein AWL mehr programmiert aber so müsste es doch gehen

Code:
L Z 2
L 1 
==I
U(
O Blinktakt
O Taster
)
= Lampe 1

Damit blinkt immer die Lampe wo der Zähler gerade steht und der Button nicht gedrückt ist


grüße

Balu
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
//Timer Zustand sichern
U T1
= #Zaehlimpuls

//Timer fürs Hochzählen
U E 0.0
UN T1
L s5t#1s
SE T1

//Wenn MAX noch nicht erreicht, und Timer abgelaufen, dann hochzählen
U(
L MW 0
L #MAX
< I
)
U #Zaehlimpuls
spbn nxt
L MW 0
+ 1
T MW 0
nxt:NOP 0

//In Abhängigkeit von Zählstand die Lampen einschalten
U(
L MW 0
L 1
>=
)
= #Lampe_1

U(
L MW 0
L 2
>=
)
= #Lampe_2

//und so weiter

U(
L MW 0
L #MAX
>=
)
U #Taktmerker
= #Lampe_MAX

Probiers mal aus
 
Zuletzt bearbeitet:
@RoMe87,
aus dem Code des TE (sowie den vorigen Thread) geht hervor, das nur die nächste Lampe aufleuchten soll. Ohne die vorherigen.
Und nicht die letzte Lampe soll blinken, sondern jeweils diejenige, die beim Loslassen des Tasters zuletzt an war. Daher macht ein Rücksetzen des Zählers beim Loslassen des Tasters auch nicht soviel Sinn.

Das ist aber eh' nicht das primäre Problem des TE:

@Balu_der_Bär, @RoMe87,
habt Ihr da eventuell was übersehen?
Solange der Taster gedrückt ist, sollen 5 Lampen nacheinander aufleuchten, bis dieser wieder losgelassen wird. Dann soll die Lampe blinken, die zuletzt aufgeleuchtet ist.
Genau diese Lampe soll dann aber beim nächsten Betätigen des Schalters nicht mehr aufleuchten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@RoMe87,
aus dem Code des TE (sowie den vorigen Thread) geht hervor, das nur die nächste Lampe aufleuchten soll. Ohne die vorherigen.
Und nicht die letzte Lampe soll blinken, sondern jeweils diejenige, die beim Loslassen des Tasters zuletzt an war. Daher macht ein Rücksetzen des Zählers beim Loslassen des Tasters auch nicht soviel Sinn.

Das ist aber eh' nicht das primäre Problem des TE:

@Balu_der_Bär, @RoMe87,
habt Ihr da eventuell was übersehen?

das ist mir in AWL zuviel arbeit :D ich bin raus
 
Code:
...
      U     "U07SeqD".Seq.User.Bit19
      U     Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit19
      UN    Taster 1
      [B][COLOR=#ff8c00]S     "U07SeqD".Seq.User.Bit25[/COLOR][/B]                          // Bit wird gesetzt, wenn Lampe blinkt
      U     "Clk20"
      =    Lampe 5
...

Problem ist jetzt aber, dass alle Lampen die ganze Zeit blinken. Wo ist mein Fehler?
Für jede Lampe hast Du eine vergleichbare Verknüpfung programmiert.
Ich zitiere mal Harald zu der darin hervorgehobenen Stelle:
S(et) löscht das Erstabfrage-Bit /ER im CPU-Status. Danach wird eine neue Verknüpfung begonnen ...
Erkennst Du, welche Verknüpfung bei der Zuweisung des Lampenausgangs übrig bleibt bzw. was ihr fehlt?
;)
 
Zuletzt bearbeitet:
Erstmal vielen Dank

Also habe den Code jetzt geändert, aber ich schaffe es nicht, dass nur die letzte Lampe blinkt -.- Zur Zeit blinken immer die, die nicht mehr aufleuchten während des Lauflichts.
Code:
 U    Taster 1
      U     "Clk10"
      ZV    Z      2
      L     Z      2
      L     5
      >I    
      L     C#0
      S     Z      2

      U     "U07SeqD".Seq.User.Bit20
      SPB   M001
      L     Z      2
      L     1
      ==I   
      L     C#1
      =     "U07SeqD".Seq.User.Bit15

M001: U     "U07SeqD".Seq.User.Bit21
      SPB   M002
      L     Z      2
      L     2
      ==I   
      L     C#2
      =     "U07SeqD".Seq.User.Bit16


M002: U     "U07SeqD".Seq.User.Bit22
      SPB   M003
      L     Z      2
      L     3
      ==I   
      L     C#3
      =     "U07SeqD".Seq.User.Bit17


M003: U     "U07SeqD".Seq.User.Bit23
      SPB   M004
      L     Z      2
      L     4
      ==I   
      L     C#4
      =     "U07SeqD".Seq.User.Bit18

M004: U     "U07SeqD".Seq.User.Bit24
      SPB   M005
      L     Z      2
      L     5
      ==I   
      L     C#5
      =     "U07SeqD".Seq.User.Bit19




M005: U     "U07SeqD".Seq.User.Bit15
      UN    "U07SeqD".Seq.User.Bit20
      U     Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit15
      UN    "U07SpID".SchulA7T12.Sig
      U     "Clk20"
      =    Lampe 1

      U     "U07SeqD".Seq.User.Bit15
      UN    Taster 1
      S     "U07SeqD".Seq.User.Bit20



      U     "U07SeqD".Seq.User.Bit16
      UN    "U07SeqD".Seq.User.Bit21
      U     Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit16
      UN   Taster 1
      U     "Clk20"
      =    Lampe 2


      U     "U07SeqD".Seq.User.Bit16
      UN   Taster 1
      S     "U07SeqD".Seq.User.Bit21




      U     "U07SeqD".Seq.User.Bit17
      UN    "U07SeqD".Seq.User.Bit22
      U     Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit17
      UN      Taster 1
      U     "Clk20"
      =    Lampe 3

      U     "U07SeqD".Seq.User.Bit17
      UN      Taster 1
      S     "U07SeqD".Seq.User.Bit22



      U     "U07SeqD".Seq.User.Bit18
      UN    "U07SeqD".Seq.User.Bit23
      U      Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit18
      UN      Taster 1
      U     "Clk20"
      =     Lampe 4

      U     "U07SeqD".Seq.User.Bit18
      UN     Taster 1
      S     "U07SeqD".Seq.User.Bit23


      U     "U07SeqD".Seq.User.Bit19
      UN    "U07SeqD".Seq.User.Bit24
      U       Taster 1
      O     
      U     "U07SeqD".Seq.User.Bit19
      UN      Taster 1
      U     "Clk20"
      =    Lampe 5

      U     "U07SeqD".Seq.User.Bit19
      UN      Taster 1
      S     "U07SeqD".Seq.User.Bit24


      U     "U07SeqD".Seq.User.Bit20
      U     "U07SeqD".Seq.User.Bit21
      U     "U07SeqD".Seq.User.Bit22
      U     "U07SeqD".Seq.User.Bit23
      U     "U07SeqD".Seq.User.Bit24
      R     "U07SeqD".Seq.User.Bit20
      R     "U07SeqD".Seq.User.Bit21
      R     "U07SeqD".Seq.User.Bit22
      R     "U07SeqD".Seq.User.Bit23
      R     "U07SeqD".Seq.User.Bit24


Wäre sehr schön, wenn das jetzt noch irgendwie funktionieren würde :)

Wenn ich die Lampe nicht mehr blinken lasse, sobald ich das Bit setze, blinkt sie ja gar nicht mehr :-(
 
Zuletzt bearbeitet:
Das ist jetzt der neue, wesentlich unkompliziertere Code: Vielen Dank an Skg :)
Code:
//---------Taktung wenn Taster gedrückt------------- 
      U     "U07SpID".SchulA7T12.Sig
      U     "Clk10"
      FP    M     50.1
      =     M     50.0

//--------- Erste Lampe Einschalten------------------
      U(    
      L     MW    51
      L     0
      ==I   
      )     
      U     "U07SpID".SchulA7T12.Sig
      O     M     51.5
      =     M     51.0
//-------- Taktung des Lauflichts--------------------
      U     M     50.0
      SPBN  M001
      L     MW    51
      SLW   1
      T     MW    51

M001: NOP   0
//---------Blinken bei nicht betätigten Taster--------
      U     "U07SpID".SchulA7T12.Sig
      SPB   M003
      U     "Clk10"
      SPB   M002
      L     MW    51
      L     -1
      UW    
      T     MW    11

      SPA   M003
M002: L     MW    52
      L     0
      UW    
      T     MW    11

      SPA   end
M003: L     MW    51
      T     MW    11
end:  NOP   0

//--------Zuweisung Lampen ------------------------
      U     M     11.0
      =     "U07ActD".SchulA7L11.ACo    //Lampe 1

      U     M     11.1
      =     "U07ActD".SchulA7L12.ACo    //Lampe 2

      U     M     11.2
      =     "U07ActD".SchulA7L13.ACo    //Lampe 3

      U     M     11.3
      =     "U07ActD".SchulA7L14.ACo    //Lampe 4

      U     M     11.4
      =     "U07ActD".SchulA7L15.ACo    //Lampe 5

Wobei ich immer noch nicht weiß, wie ich es umsetze, dass die Lampe die schon geblinkt hat, nicht mehr aufleuchtet und wenn das bei allen 5 Lampen der Fall ist, es wieder von Neuem beginnt.

Kennt sich irgendjemand aus oder hat eine Idee?
 
Manchmal ist es einfacher als man denkt.

Hallo Spucas Leicher,
dein Ansatz sieht jetzt schon viel besser aus.
Vll versucht du es mal beim loslassen des Tasters dir die akt. geleuchtete Lampe zu merken und bei erneutem drücken kannst du diese ja mit dem Ausgang verriegeln.;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wobei ich immer noch nicht weiß, wie ich es umsetze, dass die Lampe die schon geblinkt hat, nicht mehr aufleuchtet und wenn das bei allen 5 Lampen der Fall ist, es wieder von Neuem beginnt.

Kennt sich irgendjemand aus oder hat eine Idee?

Hier eine vorslag ( nicht getest)
Ich habe die MW's geandert nach MB's , Sie muste sich anlerhnen die MW's mit ein gerade nr zu nemen und ein MD mit ein nr was ein vielfach von 4 ist. ( oder 0 oder 4) Da mit vorkommen Sie auch das MW's oder DW's sich uberschneiden, wie in Deine code mit MW51 und MW52.

Code:
//---------Taktung wenn Taster gedrückt-------------       U     "U07SpID".SchulA7T12.Sig
      U     "Clk10"
      FP    M     50.1
      =     M     50.0


//--------- Erste Lampe Einschalten------------------
      U(    
      L     MB    51
      L     0
      ==I   
      )     
      U     "U07SpID".SchulA7T12.Sig
      O     M     51.5
      =     M     51.0
//-------- Taktung des Lauflichts--------------------
      U     M     50.0
      SPBN  M001	 
//    Alte wert MB 51 veroderen mit MB12 	  
      L     MB    51
	  OW
	  T     MB    12
	  L     2#11111
	  UW
	  L     2#11111
	  <>1
	  SPB NEXT        //Wenn alle 5 bits noch nicht hogh sind sprung 
//      MB 12   rucksetzen
	  L     0     
	  T     MB    12
	  
NEXT: L     MB    51
      SLW   1
      T     MB    51
// Wenn lampe welche geblinkt habe ubersprungen muste wurde diese code einfuggen.
	  L     MB    12     //Wenn diese 5 regel actif ist UN M12.x bij die lampe nicht benotig
	  UW
	  L    0
	  ><I
	  SPB  NEXT
	  


M001: NOP   0
//---------Blinken bei nicht betätigten Taster--------
      U     "U07SpID".SchulA7T12.Sig
      SPB   M003


      U     "Clk10"
      SPB   M002
     
      SPA   M003
M002: L     0
      T     MB    11


      SPA   end
M003: L     MB    51
      T     MB    11
end:  NOP   0


//--------Zuweisung Lampen ------------------------
      U     M     11.0
	  UN    M     12.0
      =     "U07ActD".SchulA7L11.ACo    //Lampe 1


      U     M     11.1
	  UN    M     12.1
      =     "U07ActD".SchulA7L12.ACo    //Lampe 2


      U     M     11.2
	  UN    M     12.2
      =     "U07ActD".SchulA7L13.ACo    //Lampe 3


      U     M     11.3
      UN    M     12.3
      =     "U07ActD".SchulA7L14.ACo    //Lampe 4


      U     M     11.4
      UN    M     12.4
      =     "U07ActD".SchulA7L15.ACo    //Lampe 5
 
Hallo Spucas Leicher,


geh doch am besten schritt für Schritt vor.




Ich würde nicht mit dem Taster Impuls zählen sondern nur mit dem Takt Impuls.
So kannst du diesen auch zum blinken der Lampe beim loslassen des Tasters verwenden.
Frage doch den Taster einfach im Programm als Verriegelung so mit ab, der muss kein Impuls sein.




U "U07SpID".SchulA7T12.Sig
// geändert: U "Clk10"
FP M 50.1
= M 50.0 // wenn es vorher noch kein Takt-Impus war, sonst wird nicht sauber getaktet!!!




Und zur Sauberkeit würde ich den M 51.0 setzen und den M 51.5 rücksetzen sonst wird das MW 51 nie Null.


U(
L MB 51
L 0
==I
)
U "U07SpID".SchulA7T12.Sig
U "Clk10" // <= den Taster einfach so mit verriegeln
O M 51.5
= M 51.0 => S M 51.0 Zur Sauberkeit:
R M 51.5 sonst wird dein MW 51 nie 0


Zum Problem "abspeichern des Zustands und Blinken des Zuletzt angezeiten Ausgangs"
=> um den Zustand der Ausgänge beim loslassen des Tasters zu speichern würde ich vll
mit einer Flanke Negativ vom Taster und einem Impuls den Zustand des MW11 in das MW 12 übertragen.


So kannst du jetzt mit der Situation "Taster nicht betätigt" und im MW 12 steht was drin den Ausgang blinken lassen (Blinktakt = Zähltakt M50.0).


Danach kannst du dir überlegen wie du den abgespeicherten Merker beim erneutem Durchlauf verriegelst.
Und das rücksetzen nicht vergessen, sonst wird dieser beim zweiten Durchlauf wieder ausgeblendet.
 
=> um den Zustand der Ausgänge beim loslassen des Tasters zu speichern würde ich vll
mit einer Flanke Negativ vom Taster und einem Impuls den Zustand des MW11 in das MW 12 übertragen.
Ich würde normalerweise nichts vom MW11 ins MW12 übertragen, da die beiden Bereiche sich überschneiden. Das ist in den seltensten Fällen gesund. Denn das MB12 gehört sowohl zum MW12 als auch zum MW11.
Darauf hat JoopB doch schon hingewiesen.
;)
 
Zurück
Oben