Bit's mit Zustand 1 im DB Zählen

norman

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

ich möchte alle Bits in einem Bekannten Baustein die den Zustand 1 haben zählen. Die DB-Länge ist mir nicht bekannt. Alle Daten haben das Format Int. Ich hab das jetzt so gelöst. Meine Funktion funktioniert, nur wird das Vorzeichenbit nicht erkannt. Hat jemand eine Idee?


TAR1 #AR1_Temp
TAR2 #AR2_Temp

AUF DB 50
L DBLG
T #Laenge
L 0
T #zaehler
T #i_16
T #i_gesamt
LAR1
m001: L DBW [#i_gesamt]
T #wert
L 0
T #i_16
m002: U L [#i_16]
SPBN m010
L #zaehler
+ 1
T #zaehler
m010: L #i_16
L L#1
+D
T #i_16
L 15
>=I
SPBN m002
L #i_gesamt
L P#2.0
+D
T #i_gesamt
L 2
+D
L #Laenge
SLW 3
>=I
SPBN m001

LAR1 #AR1_Temp
LAR2 #AR2_Temp
 
Zuletzt bearbeitet:
Hallo Norman,

Du vergleichst mit >=15. D.h. das 15. Bit (Vorzeichenbit) wird nicht mehr bearbeitet.
Versuchs mit >I, dann funktionierts auch.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bit`s mit Zustand 1 im DB Zählen

Programm als AWL-Quelle

FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1

VAR_INPUT
DBNR : INT ;
END_VAR
VAR_OUTPUT
Anzahl_Bits : DINT ;
END_VAR
VAR_TEMP
DBNR_t : INT ;
Pointer_daten_bit_t : DWORD ;
SchleifenZaehler_T : DINT ;
Bitzaehler_t : DINT ;
END_VAR
BEGIN
NETWORK
TITLE =Zählung aller Bit=1 innerhalb eines beliebig grossen Datenbaus
//Zahlenformate spielen Keine Rolle
L #DBNR; //Indirektes Öffenen des Datenbausteines über In Parameter
T #DBNR_t;
AUF DB [#DBNR_t];
//*******************************************************************************************
LAR1 P#0.0; //Initialisierung des Datenbitpointers
//*******************************************************************************************
L L#0; //Initialisierung des Bitzaehlers
T #Bitzaehler_t;
//*******************************************************************************************
L DBLG; //auslesen der Datenbausteinlänge in Byte
L L#8; //multiplikationfaktor Byte nach Bit
*D ;
next: T #SchleifenZaehler_T; //Vorspannen des Schleifenzaehlers in DINT,da die Schleife grösser als 32767 sein Könnte
CLR ; //Erzwingen VKE=0
U DBX [AR1,P#0.0];
SPBN m001; //wenn Bit=0 Springe
L L#1; //Zaehlen wenn ein Bit=1
L #Bitzaehler_t;
+D ;
T #Bitzaehler_t;
m001: +AR1 P#0.1; //Pointererhöhung für nächsten Schleifendurchlau
L #SchleifenZaehler_T; //dekrementierung SchleifenZaehler_T um 1
L L#1;
-D ;
L L#1;
>=D ;
SPB nex2; // Rücksprung in Schleife wenn noch nicht alle Bits des DB auf 1 Geprüft
SPA m002;
nex2: TAK ;
SPA next;
m002: NOP 0;
//*******************************************************************************************
L #Bitzaehler_t; // Übergabe der Temporär gezaehlten 1=Bit an Output
T #Anzahl_Bits;
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Zurück
Oben