
Сообщение от
Vadik39
Добрый день,
Писал в поддержку, решил продублировать сюда.
Использую битовые маски. Для комфортной работы с битами состояния извлекаю их из целочисленной маски и присваиваю ячейкам булевого массива.
Чтобы не делать жесткое присвоение (arrayB[0]:= udintVar.0) решил прогнать целочисленное значение циклом FOR смещая бит в право и записывая его в каждую ячейку массива.
Выглядит следующим образом:
var_input
udintVar: udint;// битовая маска
end_var
var
udintArray: array [0..15] of bool; // булевый массив для записи каждого из битов состояния
selectIn: udint; // итератор цикла
end_var
for selectIn := 0 to 15 do
udintVar:= shr(udintVar,selectIn);
udintArray[selectIn]:= udintVar.0;
end_for
В итоге провожу тест:
целочисленное 1 = bit0 true
целочисленное 2 = bit1 true
целочисленное 3 = bit0 true и bit1 true
целочисленное 4 = все биты 0, вместо того, чтобы bit2 был true.
Соответственно все, что больше 4 в десятичном виде, уже откровенно не совпадает с действительность.
Сделал подобное при помощи FBD SHR и EXTRACT и все работает корректно, а в рамках ST не работает.
Либо я делаю что-то неверно, либо это баг.
У вас проблема здесь: udintVar:= shr(udintVar,selectIn);
Вы сдвигаете на бит и запоминаете число, потом в этом новом числе вы сдвигаете на два бита и т.д.
В общем,
Код:
var //объявление локальных переменных
bitArray : array [0..15] of bool;
flag : udint;
i : udint;
end_var
for i := 0 to 15 do
flag := shr(bitMask, i);
bitArray[i] := flag.0;
end_for