Показано с 1 по 10 из 4292

Тема: Фичи и баги OWEN Logic

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,930

    По умолчанию

    Цитата Сообщение от 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
    Последний раз редактировалось Dimensy; 03.02.2025 в 16:41.

  2. #2

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    У вас проблема здесь: 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
    Точно, упустил момент.
    Спасибо. Добавил переменную для смещенных битов и все работает.

    Спасибо за консультацию. Хорошего дня

Похожие темы

  1. OWEN Logic v1.7
    от Евгений Сергеевич в разделе Среда программирования OWEN Logic
    Ответов: 404
    Последнее сообщение: 25.08.2020, 15:17
  2. OWEN Logic v1.7
    от Евгений Сергеевич в разделе Программируемые реле
    Ответов: 401
    Последнее сообщение: 28.07.2016, 19:46
  3. OWEN Logic 1.2.0.14b
    от Ельцов Андрей в разделе Программируемые реле
    Ответов: 40
    Последнее сообщение: 21.02.2011, 14:16
  4. OWEN Logic 1.1.0.11b
    от Ельцов Андрей в разделе Программируемые реле
    Ответов: 58
    Последнее сообщение: 12.10.2010, 20:55

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •