Step 7 Ausgänge binär hochzählen

Lazarus

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

Ich versuche gerade ein banales Programm in AWL zu schreiben, irgendwie geh ich es aber scheinbar verkehrt und viel zu kompliziert an.
Es sollen jedes mal wenn E0 aktiviert wird die Ausgänge A0-A3 binär hochzählen und wenn E1 aktiviert wird die Ausgänge rückwärts zählen

Vielleicht kann mir hier jemand zumindest in die richtige Richtung weisen...
 
Kannst du mit einem Vor/Rückwärtszähler machen und den Zählwert dann den Werten dann zuweisen.
Ziemlich viel Schreibarbeit?Hm - geht vielleicht einfacher.

Du müsstest dann quasi immer die Summe der Bits zusammenzählen und dann mit einem move-Befehl bei entsprechedem Zählerstand zuweisen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
a0
a1
a1+a0
a2
a2+a0
a2+a1
a2+a1+a0
1
2
3
4
5
6
7

Das wäre dann aber ein ganz normales hochzählen.
Dafür kannst du alles mögliche nehmen.
Entweder irgendeinen Zähler, oder einfach direkt selber zählen...
Code:
      U E0.0          //raufzählen
      FP M100.0
      SPBN Ma01

      L MB10
      + 1
      T MB10

Ma01: U E0.1          //runterzählen
      FP M100.1
      SPBN Ma02

      L MB10
      + -1
      T MB10

Ma02: L MB10          //Nach unten hin begrenzen
      L 0
      <I
      SPBN Ma03

      L 0
      T MB10

Ma03: L MB10          //Nach oben hin begrenzen
      L 15
      >I
      SPBN Ma04

      L 15
      T MB10

Ma04: L AB0          //Ergebnis auf AB0 geben ohne A0.4 bist A0.7 zu stören
      L B#16#F0
      UW
      L MB10
      OW
      T AB0
 
Zuletzt bearbeitet:
viele Dank Ronin, das nenn ich mal eine elegante Programmierart!

ich grübe allerdings noch warum der obere Überlauf bzw. die Rücksetzung von >15 nach 0 nicht funktioniert...
 
viele Dank Ronin, das nenn ich mal eine elegante Programmierart!
ich grübe allerdings noch warum der obere Überlauf bzw. die Rücksetzung von >15 nach 0 nicht funktioniert...
Weil das Programmbeispiel so programmiert wurde das der Zähler bei 15 stoppt und man dann wieder runter zählen muss. :ROFLMAO:

Siehe den Teil hier:
Code:
Ma03: L MB10          //Nach oben hin begrenzen
      L 15
      >I
      SPBN Ma04

      L 15
      T MB10
Wenn die Zahl (MB10) bereits 15 ist, und (beim Bereich "raufzählen") auf 16 erhöht wird, dann wird durch den obigen Teil aus der 16 wieder eine 15 gemacht.
Damit geht's nach oben hin nicht mehr weiter. Du müsstest also in dem Schnipsel hier nur eine Zahl ändern damit aus der 16 keine 15, sondern eine 0 wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du müsstest also in dem Schnipsel hier nur eine Zahl ändern damit aus der 16 keine 15, sondern eine 0 wird.

Ok jetzt glaub ich blick ich durch, danke. Warum wird aber beim anderen "Schnipsel" aus <0 eine 15? D.H. wenn ich von 0 noch einen Step herunterzähle bekomme ich eine 15
 
Warum wird aber beim anderen "Schnipsel" aus <0 eine 15? D.H. wenn ich von 0 noch einen Step herunterzähle bekomme ich eine 15
Ah, da hab ich nicht mitgedacht. Da ich nur mit MB10 nur ein Byte verwendet habe, wird wahrscheinlich bei MB10=0 nach dem -1 die Zahl 255 draus da eine Byte-Zahl nicht mit Vorzeichen interpretiert wird, spricht der <0 - Vergleich nicht an. Bei 255 (1111 1111) sind die unteren 4Bits gesetzt was wenn man nur diese betrachtet 15 ergibt.

Was soll den passieren wenn du bei 0 nochmal runterzählst?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn dem so sein soll, dann vielleicht mit "MOD"?

Das würde dann ungefähr so aussehen:
Code:
//*** raufzählen
      U     E      0.0
      FP    M    100.0
      SPBN  Ma01
      L     MB    10
      +     1
      T     MB    10
Ma01: NOP   0

//*** runterzählen
      U     E      0.1
      FP    M    100.1
      SPBN  Ma02
      L     MB    10
      +     -1
      T     MB    10
Ma02: NOP   0

//*** Begrenzung mit Überlauf
      L     MB    10
      L     16
      MOD   
      T     MB    10

//*** Ergebnis auf AB0 geben ohne A0.4 bist A0.7 zu stören
      L     AB     0
      L     B#16#F0
      UW    
      L     MB    10
      OW    
      T     AB     0

Das Rauf- und Runterzählen würde ich noch in eine Funktion bzw. in einen Funktionsbaustein (FB) verpacken, dann aber wegen der Flexibilität mit einem DINT als Zählwert. Dann hat man nicht diese unschönen Sprungmarken im Haupprogramm. Die Merker könnte man durch statische Variablen ersetzen.


Gruß, Onkel
 
Zurück
Oben