PDA

Просмотр полной версии : Битовая маска



Lisithea
04.02.2020, 14:59
Есть переменная AlarmFlags. Тип данных uint16.
Требуется создать событие по выставлению битов в переменной AlarmFlags. Например,
бит 0 равен 1 -> Событие: "авария №1"
бит 1 равен 1 -> Событие: "авария №2"
бит 2 равен 1 -> Событие: "авария №3"

Как я понял, при написании выражений для создания нового события есть только логические операторы, побитовых нет.
Какое требуется написать вырождение при создании событий?

С помощью битовой маски можно создать 16 отдельных переменных с булевыми значениями. Но городить столько лишних переменных крайне не хочется.

Sulfur
04.02.2020, 18:30
AlarmFlags.0=1 >> Событие: "авария №1"
AlarmFlags.1=1 >> Событие: "авария №2"
AlarmFlags.2=1 >> Событие: "авария №3"

Так пробовали?

Lisithea
05.02.2020, 09:01
Попробовал, результат:
Bad Request (#400): Выражение содержит ошибки.

melky
05.02.2020, 09:13
Если правильно понял из предыдущих тем, логические операторы не умеют работать с битами в Овен клауд. Сделали только создание переменных выдергивая биты и только.

Sulfur
05.02.2020, 09:18
Bad Request (#400)
Полный текст хотя бы одной строчки можете привести? Интересует синтаксис.

Lisithea
05.02.2020, 09:45
Полный текст хотя бы одной строчки можете привести? Интересует синтаксис.

Скрин
47079

capzap
05.02.2020, 10:03
Скрин
47079

можно попробовать так, умножение это удаление не нужных старших разрядов, деление это удаление младших ненужных разрядов потом сравнение с состоянием требуемого разряда. Авария пришла на скрине видно, хотя я в это и не верил )

Sulfur
05.02.2020, 10:04
Lisithea
В КДС правильный синтаксис будет
IF AlarmFlags.0=true THEN *действие 1*; END_IF;
Но если уважаемый capzap говорит, что в облаке синтаксис через точку не работает, то значит так оно и есть.
Ему в этом вопросе я доверяю больше чем себе.

melky
05.02.2020, 10:15
capzap непонятна логика. Например пришло число 9 (1001), 3 бит выдерните ?

capzap
05.02.2020, 10:27
capzap непонятна логика. Например пришло число 9 (1001), 3 бит выдерните ?

не проще прочитать как устроены SHR/SHL?
смещение на один разряд это умножение/деление на 2, поэтому из 15 -3 = 12, два в двенадцатой степени это то число на которое надо умножить, 32766 это с 15 разряда переместить в нулевой. Но скорее всего рабоать не будет потому что в элементах для наборки выражений отсутствует деление по модулю, значит возможно отсутствует ограничение на работу только с 16битными числами и при смещении вправо все единицы находящиеся слева вернуться обратно, это можно проверить в моем варианте если сменить знак больше на равно
В любом случае создание 16 переменных по битовой маске пока единственный работоспособный вариант

melky
05.02.2020, 10:53
capzap так я про то же, что создание переменных по маске в облаке пока единственный вариант, хотя вроде присутствуют логические операторы в системе и во многих других это делается при помощи них.

А так получается, что для каждого бита, надо рассчитывать на что умножать и на что делить :)

capzap
05.02.2020, 12:00
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 код и адрес сетевой переменной совпадают, только в разных форматах. Вот я и думал что в облаке нужно все точно прописывать как в контролере. В результате выползала ошибка что переменная с таким именем уже существует, которая меня и смущала. Но как выяснилось код устанавливается другой, а адрес регистра тот же что и в контролере. В общем все заработало.
Отличный сервис.