Универсальный датчик: Битовая маска
Параметр "Битовая маска" в универсальном датчике упрощает работу с CAN-параметрами. Параметр позволяет «выдернуть» из приходящего значения конкретный бит или секцию битов.
В данной статье мы не будет углубляться в фундаментальные принципы работы такого понятия как "битовая маска", а лишь рассмотрим ее работу в рамках Fort Monitor.
Ресурсов, описывающих принципы работы битовой маски, на просторах сети интернет можно найти большое количество. К примеру, ознакомиться с кратким описанием можно на Wikipedia.
Описание параметра
Параметр "Битовая маска" находится в поле "Параметры" настроек универсального датчика и задается в формате HEX (Представление десятеричного числа в шестнадцатеричной системе счисления).
Введённое значение будет наложено на значение, полученное от источника, и в результате универсальный датчик выведет значение выбранного маской бита или секции битов в числовом формате (Десятеричное представление).
Важно: для того, чтобы маска была применена к данным, которые уже были получены, необходимо выполнить пересчет данных по датчику за нужный период.
Примеры работы битовой маски
ПРИМЕР №1
Рассмотрим применение битовой маски для получения состояния 1-го БИТА на примере.
Предположим, терминал на сервер передает CAN-параметр, из которого нам необходимо получить значение только 5-го бита.
В первую очередь в универсальном датчике необходимо задать соответствующий источник, в поле "Входы", по которому на сервер приходит наш CAN-параметр.
Так как нам необходимо получать значение только 5-го бита, нужно задать соответствующую ему битовую маску в HEX формате. Маска для получения 5-го бита в бинарном формате будет выглядеть следующим образом:
0010 0000
Преобразуем в формат HEX. Данное преобразование можно выполнить при помощи стандартного калькулятора Windows, в режиме "Программист". Введем маску в режиме BIN:
И увидим, что в HEX формате маска равна значению 20. Его и указываем в параметре.
После внесения значения для параметра необходимо выполнить пересчет данных за необходимый период, чтобы маска применилась к уже полученным от источника данным.
Теперь на каждое получаемое значение от CAN-параметра будет накладываться маска.
Допустим, в CAN-параметре на сервер пришло значение 40:
В бинарном формате значение выглядит так:
0010 1000
На него наложится маска:
0010 1000 AND 0010 0000 = 0010 0000
При наложении битовой маски происходит смещение вправо на количество нулевых битов заданной маски, т.е. выглядит это так:
0010 0000 >> 5 001
В результате значение нашего универсального датчика с битовой маской будет равно 1. Что можно увидеть в журнале принятых данных:
ПРИМЕР №2
Рассмотрим применение битовой маски для получения значения БАЙТА на примере.
Предположим, терминал на сервер передает CAN-параметр, из которого нам необходимо получить значение 1-го байта.
Как и в примере №1, нам в универсальном датчике необходимо задать соответствующий источник, в поле "Входы", по которому на сервер приходит CAN-параметр.
Так как нам необходимо получать значение 1-го байта, нужно задать соответствующую ему битовую маску в HEX формате. Маска для 1-го байта в бинарном формате будет выглядеть следующим образом:
1111 1111 0000 0000
Преобразуем в формат HEX. Как и в первом примере, при помощи стандартного калькулятора Windows, в режиме "Программист". Введем маску в режиме BIN:
Видим, что в HEX формате маска равна значению FF00. Его и указываем в параметре. После внесения значения для параметра, необходимо выполнить пересчет данных за необходимый период, чтобы маска применилась к уже полученным от источника данным.
Теперь на каждое получаемое значение от CAN-параметра будет накладываться маска.
Допустим, в CAN-параметре на сервер пришло значение 20 023 500:
В бинарном формате значение выглядит так:
1 0011 0001 1000 1000 1100 1100
На него наложится маска:
1 0011 0001 1000 1000 1100 1100 AND 0 0000 0000 1111 1111 0000 0000 = 0 0000 0000 1000 1000 0000 0000
При наложении битовой маски происходит смещение вправо на количество нулевых битов заданной нами маски:
1000 1000 0000 0000 >> 8 1000 1000
В результате наложения маски выделили байт 1000 1000, но универсальный датчик может выводить только десятичное представление чисел, поэтому наш результат будет равен 136. Что мы и видим в журнале принятых данных: