Относительно недавно компания Болид выпустила продукт под названием Преобразователь протокола «С2000-ПП», который, в частности, предназначен для преобразования Болидовского протокола Орион в протокол ModBus RTU. Я купил себе такую коробочку и решил попробовать подключить Болид к Ардуино. Зачем? Не знаю. Возможно разработаю SCADA-систему на базе ардуинки.
Я не буду копировать ТТХ и принцип работы преобразователя протокола — это все вы сможете прочитать сами в мануале. Перейдем сразу к практике.
В этой части мы подключим С2000-ПП к компьютеру используя две разных программы, а так же кратко разберемся как формируются пакеты для запросов от ардуинки к С2000-ПП и что мы получаем в ответ. Преобразователь я проверял как в режиме Орион-Slave, так и в режиме Орион-Master.
Подключаться мы будем через преобразователь интерфейса RS485 — RS232 C2000-USB двумя способами: через программу предоставляемую Болидом, а так же с помощью программы для работы с com-портом «AccessPort». Вообще для работы с com-портом, как и для работы напрямую по протоколу Modbus RTU, существует великое множество программ, однако нам нужно максимально приблизится к ардуино. Данная программа предоставляет возможность без заморочек передавать и принимать в ответ данные в двоичном виде в HEX формате, что очень удобно. Скачать программу вы можете внизу страницы.
Итак, приступим. Для начала, на сайте Болида нужно скачать и установить последнюю версию программы Uprog, а так же программу Панель управления «С2000-ПП». Соберем схему для первичной настройки С2000-ПП.
Здесь и далее, в качестве источника питания не обязательно использовать РИП-12, подойдет любой источник напряжением 12В и током 0,3А.
Далее запускаем Uprog и находим наш преобразователь протокола по адресу 127, если он был из коробки.
Считываем конфигурацию.
На вкладке «Прибор» мы устанавливаем параметры соединения по интерфейсу RS485. Скорость я оставил 9600 бод, без контроля четности, 1 стоповый бит (8-N-1). Тип интерфейса — Modbus RS-485. В поле адрес мы указываем адрес слейва Modbus (т.е. адрес устройства на шине Modbus), в примере — 3. Максимальное значение адреса устройства С2000-ПП на шине — 247. Возможно ли такое количество устройств на шине одновременно — Болид не уточняет).
Далее — изменим адрес по-умолчанию на интерфейсе Орион, сделаем его так-же 3.
Остальные вкладки конфигурации мы пока рассматривать не будем. Отложим все это на потом. Настройка для наших нужд закончена, заливаем конфигурацию.
После этого отключаем С2000-USB от С2000-ПП и собираем схему для работы по протоколу Modbus RTU.
После этого запускаем программу Панель управления «С2000-ПП» и осуществляем настройку подключения.
Нажимаем кнопку COM — порт, указываем параметры соединения согласно тем, что мы настроили через Uprog и выбираем из списка com-порт к которому подключен C2000-USB. Нажимаем кнопку «подключиться».
Обратите внимание на тип прибора — 36 и версию 131 (1.31) это нам понадобится в дальнейшем. Теперь для контроля обмена информацией на шине нажимаем на кнопку с изображением осциллограммы.
Здесь мы видим что обмен ведется. Программа посылает запросы, а преобразователь ей отвечает. Т.к. мы в будущем хотим подключиться к С2000-ПП с помощью ардуино и выполнять какие-то действия нам нужно для начала реализовать данный обмен с помощью программы AccessPort, а для этого нам нужно понять как строится запрос и что мы должны получить в ответ от С2000-ПП.
Давайте разбираться. Болид любезно сообщает нам что пакет Modbus имеет следующую структуру:
Давайте посмотрим из чего состоит пакет:
- 1й байт — адрес устройства на шине Modbus, к которому мы будем обращаться. В нашем примере это 3 или 0x03 в HEX формате;
- 2й байт — функция с которой мы обращаемся к устройству. Согласно описанию С2000-ПП поддерживает следующие функции протокола Modbus RTU:
- 1 (0x01) Чтение значений из нескольких регистров флагов (Read Coil Status)
- 3 (0x03) Чтение значений из нескольких регистров хранения (Read Holding Registers)
- 5 (0x05) Запись значения одного флага (Force Single Coil)
- 6 (0x06) Запись значения в один регистр хранения (Preset Single Register)
- 15 (0x0F) Запись значений в несколько регистров флагов (Force Multiple Coils)
- 16 (0x10) Запись значений в несколько регистров хранения (Preset Multiple Registers)
- с 3го по 254 байт (максимум) идет тело запроса или ответа;
- Последние 2 байта это контрольная сумма всего сообщения в формате CRC16 Modbus.
Обратите внимание что сначала записывается младший байт контрольной суммы, а затем старший!
Теперь, обладая данной информацией, давайте составим свой запрос для определения типа и версии прибора С2000-ПП.
Для этого воспользуемся шаблоном который мы найдем в описании к устройству:
Из запроса нам видно что данная информация хранится в 2х регистрах, адрес первого из которых — 46152. Нам нужно перевести данное число из десятеричной системы счисления в шестнадцатиричную. Это можно сделать любым известным вам способом или с помощью калькулятора в винде, выбрав вид калькулятора — «программист» 🙂
Итак, наш заброс без контрольной суммы будет выглядеть так:
0x03 (адрес прибора на шине), 0x03 (функция), 0xB4 0x48 (адрес регистра), 0x00 0x02 (количество регистров для чтения). Теперь нам осталось посчитать контрольную сумму. Алгоритм и функцию для расчета CRC16 Modbus мы рассмотрим в следующей части, а пока воспользуемся онлайн-калькулятором
В поле вставим наш запрос 03 03 B4 48 00 02, input type и output type установим в положение HEX и нажмем кнопку «Calc CRC-16». Пролистав список алгоритмов вниз, найдем наш CRC-16/Modbus
Получив контрольную сумму запишем запрос полностью (помня о том как записывается контрольная сумма!):
03 03 B4 48 00 02 62 0F
Следующим шагом запустим AccessPort, отправим запрос и проанализируем полученный результат.
Итак, запускаем и открываем настройки Tools->Configuration.
В настройках com-порта выбираем порт к которому подключен C2000-USB, настройки выставляем те же 9600 8N1. Send display и Receive display устанавливаем в HEX. Нажимаем OK. Кнопкой включаем com-порт, в нижнее поле записываем побайтно в HEX формате наш запрос и нажимаем кнопку SEND.
В случае, если все сделано правильно, мы должны получить ответ в HEX формате от С2000-ПП в верхнем поле.
Мы получили ответ 03 03 04 00 24 00 83 D8 59 . Последние 2 байта — контрольная сумма, которую вы можете сами проверить.
Что-же нам прислали? Давайте еще раз посмотрим на структуру запроса версии прибора С2000-ПП:
- 1й байт 0x03 — адрес ответившего прибора;
- 2й байт 0x03 — код функции, которая была выполнена. Если бы запрос выполнился с ошибкой / не выполнился, то код функции вернулся бы с установленным с старшим битом 0x83;
- 3й байт 0x04 — говорит нам о том что ответ состоит из последующих 4х байт;
- 4й и 5й байты 0x00 0x24 — тип прибора в HEX формате;
- 6й и 7й байты 0x00 0x83 — версия прибора в HEX формате;
- 8й и 9й байты 0xD8 0x59 — контрольная сумма.
Теперь если мы переведем 00 24 и 00 83 из шестнадцатиричной системы в десятеричную, мы получим соответственно: тип прибора 36, версия прибора — 131.
Вот мы и закончили подготовительный этап для работы С2000-ПП компании Болид с ардуино. В следующей части мы подключим С2000-ПП к ардуино через конвертирующий модуль на базе чипа MAX485 , рассмотрим алгоритм расчета контрольной суммы CRC16 и выполним тот же запрос с помощью ардуино.
Перейти ко второй части>>С2000-ПП и Arduino. Соединяем Болид и ардуино по протоколу Modbus RTU. Часть 2. Программа для работы с с com-портом, позволяет легко отправлять и получать данные по интерфейсу RS232 в двоичном виде.
Скачать и протестировать мои программы для подключения С2000-ПП к Raspberry Pi вы можете по ссылке : Приложения и утилиты для подключения С2000-ПП к Raspberry, Orange и т.д. с архитектурой ARM 32-bit с операционными системами семейства Unix (Linux).
Спасибо за работу. Интересная тема, а вот пожарные извещатели Болида работают по modbus-rtu ? их можно присоединить к Ардуино, булет легче чем 4хпроводные аналоговые извещатели.
Присматриваюсь пока. Дома реализую на Node-Red хаб из Modbus-RTU в MQTT и обратно.
Пожалуйста! В ближайшее время выйдет вторая часть. Про пожарные извещатели Болида, работающие по Modbus ничего не слышал. Логика работы такая: извещатель->прибор->C2000-ПП в режиме мастер->Ардуино.
Благодарю. Как раз заинтересовался темой С2000ПП. Эта статья очень помогла!
Владимир, рад помочь. Благодарю за внимание.
мы старались сделать программу Панель управления ПП понятной и доступной)
да, С2000-ПП выпускается около 10-и лет , и родилась она только год назад.
для малых систем опрос по шлейфам достаточно быстр, но для бОльших систем быстрее опрашивать получая события, протокол внутри Болида больше событийный.
Добрый день, интересная тема, меня интересует подключение пожарных датчиков болид к ардуино.