Записная книжка разработчика

Мои проекты

Протокол Modbus в устройствах на базе микроконтроллеров. Часть 1.4

| Comments

Продолжение. Начало здесь: http://32bit.me/?p=355 - введение; http://32bit.me/?p=373 - часть 1.0; http://32bit.me/?p=377 - часть 1.1; http://32bit.me/?p=395 - часть 1.2; http://32bit.me/?p=406 - часть 1.3.

Перед тем, как перейти к программной реализации поддержки протокола Modbus, необходимо прояснить ещё один вопрос.

Регистры протокола (3х и 4х) имеют разрядность 16 бит, а значения переменных, которые требуется передавать, часто имеют разрядность 32 бита. Каким образом 32-битные переменные передаются в 16-битных регистрах?

Существует два способа решения этой проблемы. Первый из них заключается в замене значения переменной, передаваемой по Modbus, её 16-битным представлением путем линейной интерполяции.

При этом исходное значение называется "инженерным" (engineering, используется также термин engineering unit, или EU, для обозначения единиц исходного значения переменной), а передаваемые по сети данные называются "сырыми" (raw).

В SCADA - системе или в программе конфигурирования контроллера можно задать диапазон инженерных единиц, отображаемый на 16-ибитный диапазон (0-65535). При этом минимальное значение диапазона будет соответствовать 0, а максимальное - 65535.

Рис. 1. Настройка масштабирования в инженерные единицы в программе Easy Builder 8000 (конфигуратор панелей Weintek)

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

Разместим в проекте панели переменную типа Float (т.е. вещественную 32-битную переменную) по адресу 1, а в конроллере - переменную вещественного типа с записанным в неё константным значением, например 123,456. Запрос выглядит так:

01 03 00 00 00 02 C4 0B

То есть ведущий запрашивает 2 регистра, начиная с регистра 0 (с адреса 1).

Ответ контроллера:

01 03 04 E9 79 42 F6 AF 50

Непосредственно блок данных выглядит так: E9 79 42 F6. Что означают эти данные? Это и есть передаваемое вещественное число, при этом в регистре с адресом 0 находятся младшие два байта, а в регистре с адресом 1 находятся старшие 2 байта, т.е. число в обычной форме записи выглядит как 42 F6 E9 79.

Обратимся к стандарту IEEE754. В двоичной форме число выглядит как 0100 0010 1111 0110 1110 1001 0111 1001.

Бит знака S = 0, экспонента E = 10000101, мантисса M = 11101101110100101111001.

F = (-1)S*2(E-127)(1 + M/223) = 26*(1 + 7793017/223) = 64 * 1,929 = 123,456

Поскольку 32-битное число занимает 2 регистра Modbus, то переменные нужно размещать через один адрес, т.е., например, только по нечётным адресам.

Продолжение следует

Владимир Татарчевский