DB auslesen - Zählen der True/False Einträge & Wert über

D

dexhex

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

möchte einen DB im Bereich von 0.0 bis 2.3 auslesen und die Anzahl der
True bzw. False Werte als Zahl ausgeben.

Wie kann ich hier am bestem vorgehen?
Muss ich einen Zähler verwenden?

Danke für Eure Unterstützung!

Gruß, Dirk
 
Eine Zaehler braucht man nicht, da man auch in MWs,MDs zählen kann. Finde ich einfacher, weil man sich nicht um die Granze von 999 oder die BCD-Codierung kümmern muß.
Ansonsten hast du 2 Möglichkeiten:
1. Jedes Bit testen und einen INC Befehl überspringen, wenn er nicht gesetzt ist:
Code:
AUF deinDB
L 0
UN DBX0.0
spb M001
INC 1
M001:UN DBX0.0
spb M001
INC 1
....u.s.w....
T MW4  //hat jetzt Zahl der "TRUEs"
Das geht auch, wenn die Eingänge nicht hinteeinader stehen.
2. Alle Bits als DBD laden ( nicht benötigte ausmaskieren), das 1. testen und links schieben.
Der einzige Vorteil ist, daß es leichter als Schleife zu programmieren ist.

Code:
L DBD 0
L #L#2#1111111 1111111 11110000 0000000
UD
T MD0

L 0
TMW4

L 20  // Zahl bits 

M002:T MW6
U NM0.0
spb M002
L MW4
INC 1
T MW4
L MD0
SLD 1
T MD0
L MW6
M001:LOOP M002
Oder so ähnlich...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Lösung mit SCL

Hallo "Zottel",

vielen Dank für deinen Tipp.

Hab jetzt mal mit SCL ein Programm geschrieben, dass den DB10 ausliest.

Klappt auch fast, jedoch zählt er nicht richtig. Die Gesamtsumme von belegeten Feldern (True) und freien Feldern (false) sollte 20 sein.
Ista ber 40. Auch ist die anzahl der Freien und belegten Felder falsch.

Hier mal der Code zum Zählen der belegten Felder im SCL:


FUNCTION_BLOCK fb99

VAR_INPUT
zustand : ARRAY [1..20] OF BOOL;
END_VAR

VAR_TEMP
i :INT;
sum : INT;
// anzbelegt : INT;
END_VAR

VAR_OUTPUT
anzbelegt : INT ;
END_VAR

VAR
END_VAR

BEGIN;

FOR i:= 1 TO 20 BY 1 DO
IF zustand = false THEN
anzbelegt := anzbelegt;

ELSif zustand= true THEN
anzbelegt := anzbelegt +1;
sum := sum + anzbelegt;
END_IF;

END_FOR;

END_FUNCTION_BLOCK;


Kannst du mir sagen, wieso er falsch zählt?

Gruß, Dirk
 
Hab das Problem gelöst,

muss den Wert anzbelegt am Programmanfang auf Null setzen, dann gehts auch!
 
Re: Lösung mit SCL

dexhex schrieb:
Hab jetzt mal mit SCL ein Programm geschrieben, dass den DB10 ausliest.

Klappt auch fast, jedoch zählt er nicht richtig. Die Gesamtsumme von belegeten Feldern (True) und freien Feldern (false) sollte 20 sein.
Ista ber 40. Auch ist die anzahl der Freien und belegten Felder falsch.



FUNCTION_BLOCK fb99

VAR_INPUT
zustand : ARRAY [1..20] OF BOOL;
END_VAR

VAR_TEMP
i :INT;
sum : INT;
// anzbelegt : INT;
END_VAR

VAR_OUTPUT
anzbelegt : INT ;
END_VAR

VAR
END_VAR

BEGIN;
//
// erstmal sum und anzgelegt auf 0 setzen!
//

FOR i:= 1 TO 20 BY 1 DO // nehmen wir mal an, alle sind TRUE
// dann solten anzbelegt und sum die Werte haben, die ich so :
// n:x, n=Durchlauf, x=Wert

sum := sum + anzbelegt; // n mehr: 1:1
IF zustand = false THEN
anzbelegt := anzbelegt; // das ist ein wirkungsloser Befehl, was soll das?

ELSif zustand= true THEN // hier reicht else, da zustand nur TRUE sein kann, wenn
// er nicht FALSE ist
anzbelegt := anzbelegt +1; // eins mehr: Durchlauf 1:1,2:2, 3:3... n:n
sum := sum + anzbelegt; // n mehr: 1:1, 2:3, 3: 6, ... (n*n+n)/2
// Wen du das wirklich berechnen willst, kannst du das mittels der Formel
// (n*n+n)/2 hinter der Schleife tun. Spart Rechenzeit!
END_IF;

END_FOR;

END_FUNCTION_BLOCK;
 
Zurück
Oben