Просмотр полной версии : Битовая маска
Lisithea
04.02.2020, 14:59
Есть переменная AlarmFlags. Тип данных uint16.
Требуется создать событие по выставлению битов в переменной AlarmFlags. Например,
бит 0 равен 1 -> Событие: "авария №1"
бит 1 равен 1 -> Событие: "авария №2"
бит 2 равен 1 -> Событие: "авария №3"
Как я понял, при написании выражений для создания нового события есть только логические операторы, побитовых нет.
Какое требуется написать вырождение при создании событий?
С помощью битовой маски можно создать 16 отдельных переменных с булевыми значениями. Но городить столько лишних переменных крайне не хочется.
AlarmFlags.0=1 >> Событие: "авария №1"
AlarmFlags.1=1 >> Событие: "авария №2"
AlarmFlags.2=1 >> Событие: "авария №3"
Так пробовали?
Lisithea
05.02.2020, 09:01
Попробовал, результат:
Bad Request (#400): Выражение содержит ошибки.
Если правильно понял из предыдущих тем, логические операторы не умеют работать с битами в Овен клауд. Сделали только создание переменных выдергивая биты и только.
Bad Request (#400)
Полный текст хотя бы одной строчки можете привести? Интересует синтаксис.
Lisithea
05.02.2020, 09:45
Полный текст хотя бы одной строчки можете привести? Интересует синтаксис.
Скрин
47079
Скрин
47079
можно попробовать так, умножение это удаление не нужных старших разрядов, деление это удаление младших ненужных разрядов потом сравнение с состоянием требуемого разряда. Авария пришла на скрине видно, хотя я в это и не верил )
Lisithea
В КДС правильный синтаксис будет
IF AlarmFlags.0=true THEN *действие 1*; END_IF;
Но если уважаемый capzap говорит, что в облаке синтаксис через точку не работает, то значит так оно и есть.
Ему в этом вопросе я доверяю больше чем себе.
capzap непонятна логика. Например пришло число 9 (1001), 3 бит выдерните ?
capzap непонятна логика. Например пришло число 9 (1001), 3 бит выдерните ?
не проще прочитать как устроены SHR/SHL?
смещение на один разряд это умножение/деление на 2, поэтому из 15 -3 = 12, два в двенадцатой степени это то число на которое надо умножить, 32766 это с 15 разряда переместить в нулевой. Но скорее всего рабоать не будет потому что в элементах для наборки выражений отсутствует деление по модулю, значит возможно отсутствует ограничение на работу только с 16битными числами и при смещении вправо все единицы находящиеся слева вернуться обратно, это можно проверить в моем варианте если сменить знак больше на равно
В любом случае создание 16 переменных по битовой маске пока единственный работоспособный вариант
capzap так я про то же, что создание переменных по маске в облаке пока единственный вариант, хотя вроде присутствуют логические операторы в системе и во многих других это делается при помощи них.
А так получается, что для каждого бита, надо рассчитывать на что умножать и на что делить :)
https://owen.ru/forum/showthread.php?t=25821&p=262676&viewfull=1#post262676 пока таки осталось с тех времен
Lisithea
05.02.2020, 12:27
Грустно (((
dimon_ag
22.03.2020, 08:47
Не пинайте сильно. Подскажите кто нибудь, где можно почитать подробную инструкцию по работе с битовыми масками.
Есть объект. Все работает чудесно, но возникло желание расширить функционал управления из облака. В результате возникла проблема с недостаточностью сетевых переменных. Понятно что использовать переменную для чтения и записи одного бита это расточительно. Как в лоджике записывать читать бит в-из одной переменной разобрался быстро, но вот как с этим работать в облаке извлекать и записывать в эту переменную биты нигде подробно не описано. Метод научного тыка не проканал.
Помогите разобраться.
manjey73
22.03.2020, 09:44
Читать вроде создавать разные переменные и накладывать битовую маску.
А писать, смотрите в документации на ПР как рассчитать регистр для записи одного бита. petera еще выкладывал для работы с панелями и ПР, поищите в темах. Правда не знаю, с облаком прокатит или нет, не использую...
dimon_ag
23.03.2020, 08:24
Читать вроде создавать разные переменные и накладывать битовую маску.
А писать, смотрите в документации на ПР как рассчитать регистр для записи одного бита. petera еще выкладывал для работы с панелями и ПР, поищите в темах. Правда не знаю, с облаком прокатит или нет, не использую...
Нет не то. В ПР я сделал переменную с чтением и записью в эту переменную необходимых мне бит. Далее в облаке делаю следующие настройки...
48034 ставлю нулевой бит в 1 я так думал будет читаться и записываться только 0 бит. Но нет.
Далее у меня в этой переменной еще 15 бит которые нужно читать и записывать....
Нажимаю создать еще один параметр и выбираю уже 1 бит 48037
Выходит такое окно 48038
Т.е. суть, переменную я читаю без проблем. Но как в облаке вытащить из нее нужные биты? Либо для чего вообще нужна битовая маска в облаке? Как с ней работать?
Николай Суриков
23.03.2020, 08:46
Нет не то. В ПР я сделал переменную с чтением и записью в эту переменную необходимых мне бит. Далее в облаке делаю следующие настройки...
48034 ставлю нулевой бит в 1 я так думал будет читаться и записываться только 0 бит. Но нет.
Далее у меня в этой переменной еще 15 бит которые нужно читать и записывать....
Нажимаю создать еще один параметр и выбираю уже 1 бит 48037
Выходит такое окно 48038
Т.е. суть, переменную я читаю без проблем. Но как в облаке вытащить из нее нужные биты? Либо для чего вообще нужна битовая маска в облаке? Как с ней работать?
Окно появляется и говорит что в этой переменной вы уже используете другой бит, нажимаете применить и все, не обращайте внимание. Просто предупреждение и не более.
Что бы писать из облака в бит, в настройках укажите функцию записи
48039
dimon_ag
25.03.2020, 09:56
Разобрался. Проблема все таки в слабой инструкции.
Суть в том что в ПР200 код и адрес сетевой переменной совпадают, только в разных форматах. Вот я и думал что в облаке нужно все точно прописывать как в контролере. В результате выползала ошибка что переменная с таким именем уже существует, которая меня и смущала. Но как выяснилось код устанавливается другой, а адрес регистра тот же что и в контролере. В общем все заработало.
Отличный сервис.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot