Универсальный датчик: Битовая маска

Параметр "Битовая маска" в универсальном датчике упрощает работу с 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. Что мы и видим в журнале принятых данных: