Step 7 Bits im DB nach Flanken prüfen und zählen

Kuuchen

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

wie die Überschrift schon sagt, möchte ich die Bits in einem DB nach positiven Flanken abfragen. Bei einer positiven Flanke soll in einem anderen DB gezählt werden.
Ein Bit soll dabei einem Byte zugewiesen werden:

DB1.DBX 0.0 -> DB2.DBB 0
DB1.DBX 0.1 -> DB2.DBB 1
DB1.DBX 0.2 -> DB2.DBB 2 usw.

Bei keiner Flanke oder negativen Flanke sollen alle anderen Bits überprüft werden und das Gleiche wieder von vorne.

Ich habe bereits etwas geschrieben, aber ich habe wohl etwas übersehen oder vielleicht ist es auch ganz falsch:

Code:
      L     #start_address      
      T     #adr
      L     #DB_Nr1                     // DB1 load
      T     #DB_1
      L     #DB_Nr2                     // DB2 load
      T     #DB_2
      L     #Number_DBX


M001: T     #Loop
      AUF   DB [#DB_1]
      FP    DBX [#adr]
      SPB   M002
      L     #adr
      L     1
      +D    
      T     #adr
      CLR   
      L     #Loop
      LOOP  M001
      BEA   
M002: AUF   DB [#DB_2]
      L     DBB [#adr]
      +     1
      T     DBB [#adr]

Orientiert habe ich mich hieran, da AWL für mich Neuland ist.
Kann mir da jemand weiterhelfen?

Die Aufgabe ist, eine Statistik zu den Störmeldungen zu erstellen. Die Störmeldungen liegen alle in einem Baustein. Da es sehr viele Meldungen sind und ich nicht an jeder Meldung einen Zähler dran hängen will, ist die Idee oben entstanden. Ist meine Idee oben vielleicht komplett falsch und jemand hat eine bessere Idee?

Vielen Dank im Voraus!
 
Hallo,

wie die Überschrift schon sagt, möchte ich die Bits in einem DB nach positiven Flanken abfragen. Bei einer positiven Flanke soll in einem anderen DB gezählt werden.
Ein Bit soll dabei einem Byte zugewiesen werden:

DB1.DBX 0.0 -> DB2.DBB 0
DB1.DBX 0.1 -> DB2.DBB 1
DB1.DBX 0.2 -> DB2.DBB 2 usw.

Bei keiner Flanke oder negativen Flanke sollen alle anderen Bits überprüft werden und das Gleiche wieder von vorne.

Ich habe bereits etwas geschrieben, aber ich habe wohl etwas übersehen oder vielleicht ist es auch ganz falsch:

Code:
      L     #start_address      
      T     #adr
      L     #DB_Nr1                     // DB1 load
      T     #DB_1
      L     #DB_Nr2                     // DB2 load
      T     #DB_2
      L     #Number_DBX


M001: T     #Loop
      AUF   DB [#DB_1]
      FP    DBX [#adr]
      SPB   M002
      L     #adr
      L     1
      +D    
      T     #adr
      CLR   
      L     #Loop
      LOOP  M001
      BEA   
M002: AUF   DB [#DB_2]
      L     DBB [#adr]
      +     1
      T     DBB [#adr]

Orientiert habe ich mich hieran, da AWL für mich Neuland ist.
Kann mir da jemand weiterhelfen?

Die Aufgabe ist, eine Statistik zu den Störmeldungen zu erstellen. Die Störmeldungen liegen alle in einem Baustein. Da es sehr viele Meldungen sind und ich nicht an jeder Meldung einen Zähler dran hängen will, ist die Idee oben entstanden. Ist meine Idee oben vielleicht komplett falsch und jemand hat eine bessere Idee?

Vielen Dank im Voraus!

Hi, der Ansatz ist nicht schlecht, allerdings sind ein paar Bugs drinnen.1
1. #adr muss im Pointerformat, ich glaub nicht das es reicht einfach das SLD3 wegzulassen.
Ich denke das geht am besten übers Adressregister
2. Der Operand nach FP ist der Flankenmerker, nicht die Variable die abgefragt werden soll. Du brauchst also gleich viel Flankenmerker wie Störmeldungen. (Am besten einen eigenen DB)
3. Beendest du den Baustein mit BEA wenn das erste Bit keine Flanke hat. Das wär irgendwie nicht hilfreich.
 
Hi, der Ansatz ist nicht schlecht, allerdings sind ein paar Bugs drinnen.1
1. #adr muss im Pointerformat, ich glaub nicht das es reicht einfach das SLD3 wegzulassen.
Ich denke das geht am besten übers Adressregister
2. Der Operand nach FP ist der Flankenmerker, nicht die Variable die abgefragt werden soll. Du brauchst also gleich viel Flankenmerker wie Störmeldungen. (Am besten einen eigenen DB)
3. Beendest du den Baustein mit BEA wenn das erste Bit keine Flanke hat. Das wär irgendwie nicht hilfreich.

Vielen Dank für deine Hilfe!
1. Wie geht das denn übers Adressregister?
2. Das habe ich verstanden. DB ist erstellt.
3. Hab ich rausgenommen.

Mein Code sieht testweise so aus:

Code:
     L     #start_address      
     T     #adr
     L     #DB_Nr1                     // DB1 load
     T     #DB_1
     L     #DB_Nr2                     // DB2 load
     T     #DB_2
     L     #DB_Nr3
     T     #DB_3
     L     #Number_DBX


M001: T     #Loop
      AUF   DB [#DB_1]
      U     DBX    0.0
      AUF   DB [#DB_2]
      FP    DBX [#adr]
      SPB   M002
//  L     #adr
//  L     1
//  +D    
//  T     #adr
//  CLR   
//  L     #Loop
//  LOOP  M001
M002: AUF   DB [#DB_3]
      L     DBB [#adr]
      +     1
      T     DBB [#adr]

Ich wollte zunächst nur den Flankenmerker testen und hab die Schleife rausgenommen. Leider ist mein Zähler anscheinend auch falsch, weil der zählt einfach ohne Ende und ohne dass eine Flanke gekommen ist?
 
Hi, ich hab mal ein Beispiel ausprogrammiert und die Quelle angehängt. Hier nur mal der Code. Ich bin der Einfachheit halber davon ausgegangen das die Meldungen bei DBX0.0 beginnen und hab Ints als Zähler genommen. Durch den Befehl +AR1 ist das Ganze aber in der Länge begrenzt das +AR1 nur 16 Bit kann.

Code:
  L     P#0.0; //Zeiger auf Adresse 0.0
      LAR1  ; //Ins AR1 schieben    


      L     0; //Zähler init
      T     #msg_count; 



M001: NOP   0; //Rücksprungmarke


      AUF   #MSG_DB; //Meldungs DB aufschlagen
      SET   ; //VKE mit Logisch 1 vorbelegen
      U     DBX [AR1,P#0.0]; //Aktuelle Meldung verknüpfen
      AUF   #FP_DB; //Flankenmerker DB aufschlagen
      FP    DBX [AR1,P#0.0]; //Meldung auf Flanke überprüfen


      SPBN  M002; //Wenn keine Flanke dann überspringe die nächsten Anweisungen


      AUF   #CNT_DB; //Zählwert DB aufschlagen
      L     #msg_count; //Aktuelle Meldungsnummer
      SLD   3; //Zeiger auf aktuelle Meldung bilden 
      T     #db_zeiger; //Dieser Zeiger ist jetzt im Pointerformat
      L     DBW [#db_zeiger]; //Aktuellen Zählwert laden
      +     1; //Zählwert erhöhen
      T     DBW [#db_zeiger]; 
M002: NOP   0; 


      +AR1  P#0.1; //Adressregister 1 um 1 Bit erhöhen für nächste Meldung
      L     #msg_count; 
      +     2; //Meldungszähler erhöhen (2 weil es Wörter sind)
      T     #msg_count; 



      L     #msg_count; 
      L     2; 
      /I    ; 
      L     #NO_OF_MSG; 
      <I    ; //Zähler prüfen
      SPB   M001; //Rücksprung nach oben
      BEA   ;
 

Anhänge

  • FC_MSG_CNT.TXT
    1,5 KB · Aufrufe: 19
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann man die Werte im #CNT_DB auch direkt sortieren oder muss man das in einem anderen DB machen?
Falls die Sortierung in einem anderen DB stattfinden muss, kann denn gleichzeitig der #CNT_DB zählen und der Sortier-DB die aktuellen Werte übernehmen und sortieren?
 
Zurück
Oben