TIA Anzahl von True Bits in einem (mehreren) Word zählen

Zombie

Level-2
Beiträge
735
Reaktionspunkte
120
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen,

Ich stehe gerade ziemich auf dem Schlauch.
Ich habe mir für den aktuellen Auftrag einen FB erstellt aus dem ich aktuell erstmal 14 Bits als Fehler bekomme. Die sind alle in einem Word enthalten. Später könnten es bei komplexeren Kisten auch 2 Word werden.
Nun wäre es für die Visu Schnittstelle des Bausteins gut, wenn ich die Anzahl der aktuell in diesem Baustein anliegenden Fehlermeldungen aus diesem Baustein an einem IO Eingang ausgeben könnte.

Sprich, aus Baustein 1 kommen 12 Fehlermeldungen, aus Baustein 2 kommen 4 dazu. Und am Ende des FC100 wenn alle Bausteine abgelaufen sind steht in dieser einen Variable die Gesamtzahl aller Fehlermeldungen drin. Diese dann auf der Visu anzeigen, bzw. in das Datenlogging eingeben.

Ich frag mich nur ob es eine Möglichkeit gibt, wie ich die Anzahl der True Bits auslesen kann, ohne die Ochsentour mit 16 If..Then Abfragen mittels SLICE.

Ich hatte auch versucht den SLICE Befehl mit einer Laufvariable auszuführen
Code:
IF #twStörwort.%X[tiLaufvar] THEN
            #ioiAnzStör := #ioiAnzStör + 1;
        END_IF;
Den meckert er mir aber immer an. Hab ich das verkehrt gemacht, oder geht das nicht so wie gedacht?

Der Vollständigkeithalber sage ich noch, ich nutze eine 1212C und V13.

Gruß
 
SLICE geht nicht mit variabler Bitnummer, die Bitnummer muß eine Konstante sein. Um die Bits variabel indiziert adressieren zu können müßte man das Word auf ein BOOL-Array legen (AT) oder kopieren.

Man kann in einer Schleife eine Bitmaske mit genau ein 1-Bit über das Word schieben und Ver-UND-en oder die Bits des Words zum Bit .0 schieben und testen (Ver-UND-en).

Für die S7-300/400 gibt es den Baustein BITSUM, gibt es den auch für die S7-1200 oder kann man den zur S7-1200 migrieren? In OSCAT gibt es einen Baustein BIT_COUNT in SCL, weitere Beispielcodes siehe z.B. Bitsum für S7-1214 TIA 10.5

Harald
 
Also, anscheinend doch nicht so einfach mit BITSUM, denn in der Hilfe steht der Befehl nur für die 1500er drin und auch in SCL wird er mir angestrichen. Die Fehlermeldung lautet : "Der Baustein BITSUM wird von der verwendeten CPU nicht unterstützt".

Der AT Befehl fällt wegen Optimierter Bausteine flach. Das mit dem Wordweise Ver- und- en hab ich versucht, aber am Ende war der Code komplizierter und verrückter wie einfach 16 If..Then Abfragen mit Slice.
Also nehme ich die Variante mit 16 If..Then und Slice, denn je einfacher desto besser.
Trotzdem Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Function BITSUM in SCL

Hier eine Function BITSUM, die im Prinzip auf jeder SPS funktionieren sollte, welche mit SCL oder ST programmiert werden kann (Programm ist nicht getestet):
Code:
FUNCTION "BITSUM" : Int
//zählt die Anzahl von 1-Bits in einem DWord

VAR_INPUT 
    IN : DWord;
END_VAR

VAR_TEMP 
    Temp_DW : DWord;
    Bit_Count : Int;
END_VAR

BEGIN
    #Bit_Count := 0;
    #Temp_DW := #IN;

    WHILE #Temp_DW <> 0 DO
        IF (#Temp_DW AND 1) <> 0 THEN
            #Bit_Count := #Bit_Count + 1;
        END_IF;
        #Temp_DW := SHR(IN := #Temp_DW, N := 1);
    END_WHILE;

    #BITSUM := #Bit_Count;
END_FUNCTION

Harald
 
... und was ist wenn du das mit dem "optimierten Baustein" abschaltest ? Dann ginge auch wieder AT ...

Hi Larry,
ja natürlich könnte ich das machen. Ich wollte dieses Projekt mal benutzen um mich mit den Optimierten Bausteinen anzufreunden. Außerdem hab ich die Beiträge von HellBarde gelesen. Mich würde zwar eine höhere Zykluszeit auch nicht umbringen, aber ich wollte einfach mal für später üben wenn es so weit kommen könnte und ich auf die Zykluszeit achten muss. Man weiß ja nie wann das mal kommt und wenn es soweit ist muss ich nicht erst wieder Jugend forscht betreiben.

Hier eine Function BITSUM, die im Prinzip auf jeder SPS funktionieren sollte, welche mit SCL oder ST programmiert werden kann (Programm ist nicht getestet):
Code:
......

Harald

Danke, das werde ich nachher mal ausprobieren.
Code:
IF (#Temp_DW AND 1) <> 0 THEN
Wusste gar nicht dass das geht so ein Wort und ein Bit zu verunden.
Und SHR kannte ich auch nur aus AWL, mochte ich aber nie wirklich ;)
 
Ich wollte dieses Projekt mal benutzen um mich mit den Optimierten Bausteinen anzufreunden. Außerdem hab ich die Beiträge von HellBarde gelesen. Mich würde zwar eine höhere Zykluszeit auch nicht umbringen, aber ich wollte einfach mal für später üben wenn es so weit kommen könnte und ich auf die Zykluszeit achten muss.
Ich glaube noch nichtmal daß so ein FC tatsächlich eine signifikant unterschiedliche Laufzeit hat, wenn er "als optimiert" gekennzeichnet ist oder wenn er per AT auf nicht-"optimierten" TEMP zugreift. Das ist bestimmt eine Fehlinterpretation des Siemens-Buzzwords.

Code:
IF (#Temp_DW AND 1) <> 0 THEN
Wusste gar nicht dass das geht so ein Wort und ein Bit zu verunden.
Da wird auch nicht ein Word mit einem Bit verundet, sondern ein DWord mit der Bitmaske DW#16#00000001, das geht eigentlich in so ziemlich jeder Programmiersprache.

Harald
 
Zurück
Oben