PDA

Просмотр полной версии : Количество бит в состоянии TRUE в слове



Sergey666
10.06.2021, 11:35
Всем привет, Товарищи.

Вкратце вводная:
В проекте формируются флаги аварий и упаковываются в слова (word) для передачи в HMI. Озадачился подсчетом количества активных аварий, на сименсе это легко, структура дата-блока позволяет, да сам формат word в Step7 по факту массив бит. Т.е просто в цикле проверяем состояние бита в слове и если TRUE, инкрементируем счетчик.
Попробовал по образу сделать то-же в КДС и... дошел только до побитного присвоения массиву бит и уже анализировать массив, т.к динамическая адресация бит в слове не поддерживается, это понятно, в принципе вопрос в чем:- как "закинуть", задвинуть, запихнуть WORD в ARRAY[0..15]OF BOOL, вариант ARRAY[0]:=WORD.0 и сам знаю.

Евгений Кислов
10.06.2021, 11:38
В библиотеке OSCAT есть функция BIT_COUNT.



FUNCTION BIT_COUNT : INT
VAR_INPUT
IN : DWORD;
END_VAR
(*
version 1.1 10 sep 2007
programmer hugo
tested by tobias

BIT_COUNT counts the amount True of bits in a dword.
for exabple: bit_count(3) returns 2 because two bits (bits 0 and 1) are true and all others are false.
*)



WHILE in > 0 DO
IF in.0 THEN Bit_Count := Bit_Count + 1; END_IF;
in := SHR(in,1);
END_WHILE;

Sergey666
10.06.2021, 11:52
Ага, такая конструевина годится, спасибо!