Протокол Modbus – самый распространенный промышленный протокол для M2M- взаимодействия. Является стандартом де-факто и поддерживается почти всеми производителями промышленного оборудования.


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


Существует 3 формата протокола Modbus: Modbus RTU, Modbus TCP, Modbus ASCII. Modbus ASCII в природе почти не встречается и по этой причине нам сейчас не интересен.


Modbus TCP предназначен для работы в локальных сетях. Тоже не наш случай.


Modbus RTU наиболее распространенный вариант. Работает поверх RS-485/232. То, что надо. Далее под термином Modbus будет описываться именно это формат.


Так как Modbus предназначен для работы с пром. автоматикой, то и внутренняя структура протокола в первую очередь описывает параметры пром. автоматики, такие как дискретные входы и выходы, аналоговые входы и выходы. Тем, кому этого не хватает (а таких подавляющее большинство) делают свои надстройки над протоколом.


Ниже приведена картинка с описанием и некоторыми терминами из протокола.


Все параметры делятся с одной стороны на входы и выходы. Входы можно только читать, а выходы читать и писать.


С другой стороны, бывают дискретные входы/выходы размером в один бит и 16- битные регистры (что характерно, размером 16 бит).


Для работы с этими четырьмя группами параметров существуют функции чтения и записи.


Например, для чтения дискретных входов используется функция «READ DISCRETE INPUTS» с кодом 2.


image


В настоящий момент в терминалах УМКа302 реализованы функции чтения всех стандартных типов, такие как 1, 2, 3 и 4.


Кроме того, на протокол Modbus предполагает, что есть устройства с двумя разными ролями:
Master – ведущее устройство, которое опрашивает все остальные устройства. Мастер на шине может быть только один.


Slave – ведомое устройство. Его опрашивает мастер. У каждого ведомого есть адрес в диапазоне от 1 до 247. Ведомых устройств на шине может быть несколько. Адреса ведомых в одной шине должны быть уникальными.


1. Реализация Modbus в терминале УМКа302


Поддержка протокола Modbus для УМКа302 реализована с версии 2.11.0


Терминалы УМКа302 берут на себя роль Master в шине Modbus и опрашивают Slave устройства.
Терминалы УМКа302 поддерживают чтение до 32 параметров. Возможно чтение 32 параметров с одного подключенного Slave устройства, чтение одного параметра с 32 подключенных Slave устройств и все промежуточные комбинации.


Перед началом работы с Modbus необходимо настроить интерфейс. Настройка интерфейса RS-485 производится командой «RS485 8,19200», где 8 – режим Modbus, а 19200 – скорость работы интерфейса.


Далее (хотя это можно сделать и в последнюю очередь), определяем список параметров, которые будут передаваться на сервер. Допустим, у нас 2 устройства, с каждого из которых мы будем снимать по 9 параметров. Кроме того, мы хотим, чтобы между первым и вторым устройством была дырка в 7 параметров на дальнейшее расширение. В этом случаю мы должны включить передачу параметров Modbus и настроить маску передаваемых параметров. Воспользуемся командой «SetMdb 1,0x1FF01FF», где 1 – включить передачу параметров на сервер, а 0x1FF01FF маска передаваемых параметров, полученная с помощью калькулятора.


image


После перезагрузки на вкладке истории мы должны получить следующее:


image


На сервер в протоколах Wialon IPS 1.1 и 2.0 параметры передаются с такими же именами, как и на вкладке истории. Т.е. Mdb0- Mdb8, Mdb16- Mdb24.


В протоколе Wialon Combine параметры передаются с типом «Custom Parameters» начиная с параметра 256 по 287. Т.е. Mdb0 передается как param256, Mdb1 передается как param257 и т.д.


image


2. Пример подключения устройства


После предварительной настройки необходимо выполнить настройку отдельных параметров для работы с конкретным устройством. Для этого необходима так называемая


карта регистров устройства. В ней описываются адреса и типы параметров конкретного устройства.


Возьмем для примера станцию катодной защиты «СИГНАЛ» СКЗ-ИП-Б1. У меня есть для нее эмулятор. Сама станция показана на картинке.


image


Пример куска карты регистров приведен на рисунке ниже.


image


В карте как раз 9 параметров, адреса которых идут подряд. Особенностью протокола Modbus является то, что такие параметры могут быть запрошены как 9 отдельными запросами, так и одним общим.


УМКа302 умеет автоматически строить план опроса Modbus устройств таким образом, чтобы уменьшить количество запросов. Это позволяет значительно сократить время опроса устройства.
Для имитации станции воспользуемся программой-имитатором.
Внешний вид программы приведен на рисунке ниже.


Для настройки параметров служит команда вида «MDBPARAMn [X[,Y[,Z[,A[,B]]]]]», где n – номер параметра от 0 до 31.
X – адрес устройства на шине от 1 до 247 или 0, если опрос отключен.
Y – тип запрос. Про типы запросов ниже.
Z – начальный адрес регистра или входа для выбранного запроса.
A – формула пересчета. Как в CAN-фильтрах.
B – имя параметра. Как в CAN-фильтрах.


image


Тип запроса Y выбирается из следующих соображений:


Y=0 – функция 1. Чтение 1 бита типа Coils;
Y=1 – функция 2. Чтение 1 бита типа Input Discrete;
Y=2 – функция 3. Чтение 1 регистра типа Holding Registers. Беззнаковое. 0…65535. Y=3 – функция 3. Чтение 1 регистра типа Holding Registers. Знаковое -32768…32767 Y=4 – функция 4. Чтение 1 регистра типа Input Register. Беззнаковое. 0…65535.
Y=5 – функция 4. Чтение 1 регистра типа Input Register. Знаковое -32768…32767
Y=6 – функция 3. Чтение 2 регистров типа Holding Registers. Регистры обрабатываются как float. Младшая половина в младшем регистре (Порядок байт 1023).
Y=7 – функция 4. Чтение 2 регистров типа Input Register. Регистры обрабатываются как float. Младшая половина в младшем регистре (Порядок байт 1023).
Y=8 – функция 3. Чтение 2 регистров типа Holding Registers. Регистры обрабатываются как знаковое целое. Младшая половина в младшем регистре (Порядок байт 1023).
Y=9 – функция 4. Чтение 2 регистров типа Input Register. Регистры обрабатываются как знаковое целое. Младшая половина в младшем регистре (Порядок байт 1023).


Данный список не является полным и будет расширятся по необходимости. В нем приведены только наиболее часто встречающиеся в практике форматы представления данных. Значительно большее их количество встречается от случая к случаю или не встречается в принципе.


Настроем имитатор на работу по 1 адресу. Смотрим карту. Видим следующее:


image


Настраиваем первые 5 параметров командами:
MdbParam0 1,7,0,,I
MdbParam1 1,7,2,,U
MdbParam2 1,7,4,,PP
MdbParam3 1,7,6,,E
MdbParam4 1,7,8,,Uin


Настраиваем температуру:
MdbParam5 1,5,12,,T


Настраиваем время работы:
MdbParam6 1,9,13,,Twork
MdbParam7 1,9,15,,Tstab


Настраиваем последний параметр
MdbParam8 1,7,18,,SP


Перезагружаем. Смотрим командой «Mdb»


image


Видим следующее: параметры с 0, 1, 2, 4, 5 отображаются корректно.


Параметр 3 отображается с коэффициентом 3200. Это стандартный коэффициент для счетчика. Введем в настройки терминала формулу пересчета.
MdbParam3 1,7,6,x/3200,E


Параметры 6 и 7 отображаются в секундах. Переведем в часы через формулу пересчета:
MdbParam6 1,9,13,x/3600,Twork
MdbParam7 1,9,15,x/3600,Tstab
Параметр 8 не отображается. Имитатор не поддерживает этот параметр. Видимо параметр появился в карте позже.


Перезагружаем. Смотрим историю.


image


Опрос настроен. Смотрим результат в системе мониторинга транспорта.


image