Einsen zählen in einem EW oder ED

mufi

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
hab wieder mal ne Frage und zwar wie kann ich Einsen in einem EW oder ED zählen?
Ich hatte mir zunächst zwei möglichkeiten überlegt.

Code:
L EW0 // 0000_0000_0000_0011
L MW0 // 0000_0000_0000_0001
UW // 0000_0000_0000_0001

Jetzt sollte das Programm eine Art Zähler um eins hochzählen, danach das MW0 verdoppeln auf 0000_0000_0000_0010, damit ich die nächste Eins abfragen kann. Zu aller erst, ist das Schwachsinn oder machbar?

Meine zweite Überlegung war zunächst dieselbe, nur das mein MW0 gleichbleibt, also 0000_0000_0000_0001 und ich immer nur des EW0 um ein Bit nach rechts verschiebe und immer das letzte Bit auf eine eins überprüfe und dementsprechend dann hochzähle, bis ich 15 mal nach rechts geschoben hab.
Ist diese Überlegung auch Humbug? Oder ist es besser die eins im MW0 nach links zu schieben?
Und wie erhalte ich einen Wert, der über einen Zyklus hinaus erhalten bleibt? Eine statische Variable in einem FB? Und wenn ja, wie benutze ich diese am besten? Direkt oder über den Zugriff auf den entsprechenden DB?

Danke schonmal :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Mufi,

um die Einsen im EW/ED zu zählen würde ich eine Schleife programmieren, die
16(32) mal durchlaufen wird.
Vor der Schleife kopierst Du Dein EW/ED in ein MW/MD.
In der Schleife kannst Du mit SLW 1/SLD 1 und SPP prüfen, ob das entsprechende Bit = 1 ist.
Wenn ja den Zähler um eins erhöhen.

Wie Du diesen Zähler dann ausserhalb Deines Bausteins auswertest, ist geschmackssache.

Grüße
Gebs
 
Meine zweite Überlegung war zunächst dieselbe, nur das mein MW0 gleichbleibt, also 0000_0000_0000_0001 und ich immer nur des EW0 um ein Bit nach rechts verschiebe und immer das letzte Bit auf eine eins überprüfe und dementsprechend dann hochzähle, bis ich 15 mal nach rechts geschoben hab.
Ist diese Überlegung auch Humbug? Oder ist es besser die eins im MW0 nach links zu schieben?
Und wie erhalte ich einen Wert, der über einen Zyklus hinaus erhalten bleibt? Eine statische Variable in einem FB? Und wenn ja, wie benutze ich diese am besten? Direkt oder über den Zugriff auf den entsprechenden DB?
Also Mufi,
die zweite Lösung ist die bessere :-D
Speichern kannst Du das ganze dann in ein Merkerwort oder ein Datenwort von einem Globalen DB.
Oder natürlich auch auf den Statischen Bereich sprich DI, aber nur wenn Du es in diesem Baustein wieder benutzt.
Aus einem anderen Baustein solltest Du nicht auf die Instanzdaten eines anderen FB's zugreifen > nicht schön.
 
Vielen Dank für die schnellen Antworten:)

Habe jetzt folgendes daraus gemacht:
Code:
L     Z      1  
      L     15
      >I    
      U(    
      L     Z      0
      T     AW     4
      )     
      BEB   

      L     EW     0
      L     W#16#1
      UW    
      ZV    Z      0

      L     W#16#1
      L     W#16#1
      UW    
      ZV    Z      1

      L     EW     0
      T     MW     0

      L     MW     0
      SRW   1
      T     MW     0

      L     MW     0
      T     EW     0

Mein einziges Problem ist, dass die dummen Zähler bei eins aufhören zu zählen:-(
Ich weiß, dass man das eleganter über merker lösen sollte, aber irgendwie klappt das net ganz, ich probiers jez mal mit manuellem Zählen...
 
Tacho,

hast du dir denn mal den FC99 "BITSUM" aus der Standard-Bibliothek angeguckt.

Der macht doch genau das, was du willst, oder?

Gruß
Flinn
 
Zuviel Werbung?
-> Hier kostenlos registrieren
habs jetzt versucht so zu lösen:
NW1:
Code:
      L     EW     0
      L     W#16#1
      UW    
      U(    
      L     MW     2
      L     1
      +I    
      T     MW     2
      )     

      L     EW     0
      L     W#16#1
      UW    
      U(    
      L     MW     4
      L     1
      +I    
      T     MW     4
      )     

      L     EW     0
      T     MW     0

      L     MW     0
      SRW   1
      T     EW     0
NW2:
Code:
L     MW     4
      L     14
      >I    
      U(    
      L     MW     2
      T     AW     4
      L     0
      T     MW     4
      )     
      T     MW     2
Ich kann in der Klausur keine fertigen FC's benutzen, daher muss ich sowas selber proggen können.

Warum wird das ganze denn nur einmal bearbeitet? Was muss ich denn machen, damit es auch die gewünschte Anzahl von Durchläufen macht?
 
Hallo!

Der FC99 macht folgendes:

Code:
      L     0                           
      T     #RET_VAL                    
      L     #IN                         
      T     #wrkVal                     
A001: L     0                           
      L     #wrkVal                     
     ==D                               
      SPB   A002                        
      SRD   1                           
      T     #wrkVal                     
      SPZ   A001                        
      L     #RET_VAL                 
      L     1                           
      +I                               
      T     #RET_VAL                   
      SPA   A001                      
A002: SET                               
      SAVE

vielleicht hilfts dir!
 
Zuletzt bearbeitet:
Hallo,

ihr habt ja schon eine Lösung.
Trotzdem möchte ich zwei Bausteine hochladen, der eine zählt Bits in einem Wort (16Bit), der andere in einem Record (grösserer Bereich).

Könnt ihr euch ja mal ansehen.

mfG. klaly
 

Anhänge

  • Bit_Zaehl.zip
    23,9 KB · Aufrufe: 15
Die schnellste Art, die Zahl der Einsen zu ermitteln, ist eine Tabelle a la:
0:0
1:1
2:1
3:2
4:1
5:2
...
255:8
Für Worte/Doppelworte wird sie wohl zu lang, daher die Anzahl aus den Bytes ermitteln und addieren.
 
Zurück
Oben