Что такое модбас для чайников
Что такое Modbus и RS-485 — максимально просто
Изучая оборудование систем Умный Дом мы постоянно сталкиваемся с упоминанием протокола Modbus и порта RS-485.
Например, у контроллера EasyHomePLC есть два порта RS-485 и два порта RS-232, у контроллера Wiren Board есть два порта RS-485, у контроллера Beckhoff CX-8080 есть порт RS-485 и порт RS-232. У различного оборудования есть возможность управления по протоколу Modbus: кондиционеры, вентустановки, модули ввода-вывода. А ещё программное обеспечение EasyHome связывается с контроллером по протоколу Modbus TCP. Что всё это означает? Значит ли это, что если у контроллера есть интерфейс Modbus, и у устройства есть такой интерфейс, они сразу заработают вместе? Многие так считают, но это неверно. Объясню максимально просто и понятно.
Что такое RS-485
RS-485 — это стандарт физического уровня. Что это означает? Он определяет следующие параметры общения устройств:
То есть, стандарт подразумевает, что на 2-проводную шину (одну витую пару) можно подключить множество устройств. Он не описывает никакой язык общения оборудования.
Что такое RS-232
Другой стандарт, тоже по кабелю «витая пара». Не буду перечислять все параметры стандарта, он используется достаточно мало сейчас. В частности, все помнят мышки, которые подключались к компьютеру через широкий COM-порт, вот это как раз была связь по RS-232. К контроллерам EasyHomePLC и Beckhoff подключается GSM модем для приёма и отправки смс как раз через порт RS-232. Длина кабеля совсем небольшая.
Существуют переходники с RS-232 на RS-485 и обратно. Мы получаем возможность подключить на порт RS-232 что-то, что подключается по RS-485 или сделать длинную линию связи для устройств RS-232, поставив в начале линии переходник на 485, а в конце обратно.
Что такое Modbus
Переходим к более интересной вещи. Modbus — это уже протокол. Он определяет правила общения устройств. Например, он говорит, что одно устройство должно быть ведущим (master), а остальные ведомыми (slave). Ведущее посылает в шину связи сообщение определённого формата, в котором либо указан адрес нужного slave устройства, либо сообщение предназначено для всех устройств. Устройство slave, на которое отправлено сообщение, может ответить мастеру. Протокол регламентирует формат сообщения, его длину, возможные значения элементов сообщения. Есть также контрольная сумма, которая нужна для проверки того, что сообщение дошло неискажённым.
Но протокол Modbus не регламентирует, какими могут быть сами команды и какая среда передачи данных используется. Есть Modbus serial — это работа по RS-485 или RS-232, то есть, по одной перевитой паре кабелей. Есть Modbus TCP — это работа в компьютерной сети TCP/IP, где у каждого устройства есть IP адрес и порт.
Можно привести аналогию с человеческим общением. Среда передачи данных — это обычно звук. Стандарт подразумевает, что есть минимальная громкость и максимальная громкость, и громкость речи находится в этом диапазоне. Можно говорить по очереди, а можно одновременно. Есть некий диапазон скоростей передачи звуков, который может использоваться. Есть также диапазон частот звуков. Есть максимальное расстояние, на которое можно передавать звук. А можно общаться не звуком, а световыми вспышками, текстом, хлопками в ладоши или жестами. На каждый способ общения есть некий набор правил. Вот что определяет стандарт.
Протокол общения — это ещё не язык, нет. Протокол даёт нам такие понятия как то, что сообщение состоит из слов, разделяемых тишиной. Слова состоят из слогов. А ещё то, что в начале общения надо здороваться, а в конце прощаться. Говорить может только один в один момент времени. Как-то так.
И вот мы подошли к главному вопросу. У нас контроллер имеет порт (он же разъём, он же шлюз) RS-485 и в него программно заложена возможность общения по Modbus. Также у нас есть кондиционер, у которого также есть физический разъём RS-485 и в паспорте указана возможность работы по Modbus. Что это для нас значит? Это значит, что устройства теоретически могут работать совместно.
Как люди, имеющие возможность говорить, теоретически могут общаться. Для нас такая возможность подразумевает полноценное управление и контроль обратной связи. Но заставить их работать вместе не так просто. Нужно в контроллере написать драйвер для работы именно с этим устройством. Для этого в инструкции к устройству надо найти карту регистров, то есть, описание возможных команд устройства. Вот пример некоторых регистров для вентмашины:
[Request0]
Direction=read
Type=bit
Baudrate=115200
Address=1
Period=100
var0=3800#bool#SCo_Зима/
Мест
var2=3802#bool#SCo_Таймер
var3=3803#bool#SCo_Блокировка
var4=3804#bool#SCo_Пуск/
Пуск/Стоп var6=3806#bool#SCoРежимR2 var7=3807#bool#SCoРежимR3 var8=3808#bool#SCoРежимR4 var9=3809#bool#SCoРежимR5 var10=380a#bool#SCoРежим_R6
Чем сложнее устройство, тем вариантов команд больше. В вентмашине или кондиционере их может быть до сотни. Также по протоколу RS-485 мы можем общаться с инфракрасными приёмопередатчиками, генераторами, конвекторами, электрокарнизами, кондиционерами, термостатами, датчиками и различными элементами расширения контроллера на DIN рейку: модулями входов и выходов, диммерами.
Написать драйвер связи теоретически несложно, но это большая работа. Нужно предусмотреть нюансы работы техники, придумать удобный интерфейс управления и получения обратной связи, прописать в драйвере возможные коды ошибок. После подключения реального устройства может потребоваться доналадка, если не всё было учтено в инструкции или в драйвере. Стоимость этой работы может быть достаточно высокой, поэтому стоит обращать внимание на то, какие драйверы уже присутствуют в программном обеспечении, прилагаемом к контроллеру.
Например, в программном обеспечении EasyHome есть поддержка ИК-передатчиков ICPDas и Insyte, модулей связи с кондиционерами Mitsubishi и Daikin, конвекторов Varmann, счётчиков электричества Delta, блоков расширения Овен, Razumdom, Bolid, вентмашин Komfovent и ещё много чего. Нужно смотреть конкретные поддерживаемые модели, у разных моделей разные спецификации команд.
Есть устройства с поддержкой Modbus TCP, там нужно, чтобы оно было включено в локальную сеть, отдельный порт RS-485 контроллера не нужен.
К системам на Z-Wave напрямую ничего по Modbus не подключить, там нет такой возможности. Только используя промежуточный контроллер, который поддерживает и Modbus, и Z-Wave, например, Wiren Board.
Есть важная особенность работы устройств по Modbus. У Modbus есть устройство-мастер (это контроллер) и устройство-слейв (то, что к нему подключается). Слейв не может сам инициировать передачу данных, поэтому мастер постоянно опрашивает все подключенные к нему слейвы на предмет их состояния. Если у нас датчик подключен к дискретному входу устройства Овен МВ, то при изменении состояния датчика меняется состояние входа, но модуль не может сразу же сообщить об этом контроллеру, так как не может сам инициировать связь. Нужно дождаться, пока контроллер опросит этот модуль, тогда модуль отправит ему в ответ своё состояние и контроллер поймёт, что датчик изменил состояние и что-то сделает.
Что произойдёт, если на вход Овен МВ пришёл сигнал о сработке датчика, а потом датчик изменил состояние на первоначальное, а контроллер не успел его опросить? В программе модуля МВ есть счётчики количества сработок каждого входа, вот их-то контроллер и считывает, и видит, что было изменение.
Скорость опроса модулей контроллером ограничена, поэтому контроллер не мгновенно узнаёт о событии, это зависит от того, какая скорость опроса, насколько она оптимизирована, и сколько модулей расширения подключено к контроллеру. Если у нас очень много модулей, которых контроллер по очереди опрашивает, то весь цикл опроса занимает некоторое время, пока очередь нужного нам модуля не подойдёт, об изменении состояния мы не узнаем. А потом контроллер должен будет отправить нужную команду соответствующему модулю реле для изменения его состояния. У EasyHomePLC при количестве модулей расширения не более 5 максимальная задержка отрабатывания события не превышает 1.5 секунды, что достаточно быстро. Зависит от того, что опрашивалось в момент изменения состояния входа. У контроллеров Beckhoff связь между модулями расширения происходит по собственному протоколу связи, там независимо от количества модулей всё отрабатывает мгновенно.
Версии Modbus — TCP и RTU
Ещё раз обозначим разницу между версиями связи по ModBus.
Modbus RTU, он же Modbus Serial — работа по RS-485 или RS-232. Подключение устройств по витой паре, где контроллер мастер, а остальные устройства — слейвы, которые не могут сами инициировать связь. Самый распространённый вариант связи.
Modbus TCP или Modbus TCP/IP — общение устройств происходит по обычной компьютерной сети TCP/IP, включающей работу через интернет и через Wi-Fi. То есть, возможна связь между устройствами на любом расстоянии, когда оба подключены к интернет.
Есть ещё несколько разновидностей: Modbus RTU/IP (отличается от TCP наличием контрольной суммы), Modbus over UDP, Modbus Plus (собственный протокол фирмы Schneider Electric, в сети могут быть несколько мастеров).
Ещё небольшая статья про работу устройств по протоколу Modbus в системах Умный Дом: RS-485 Modbus в системах Умного Дома.
303,861 просмотров всего, 102 просмотров сегодня
Протокол Modbus. Обзор, описание и примеры использования.
Продолжаем подробно разбирать стандарты передачи данных. И героем сегодняшней статьи станет протокол Modbus! Впервые спецификация протокола Modbus была опубликована ни много ни мало, а в 1979 году, но до сих пор не утратила своей актуальности! Итак, приступаем…
Modbus — самый широко распространенный промышленный протокол для организации обмена данными между различными устройствами (межмашинное взаимодействие, Machine-to-Machine, M2M). Популярность объясняется многими факторами, среди которых простота реализации, отсутствие необходимости использовать дополнительные микросхемы, и, конечно же, открытость протокола.
Основные плюсы Modbus:
В то же время протокол не избавлен от некоторых недостатков:
Обсуждая достоинства и недостатки протокола мы частично забежали вперед, так что теперь давайте разберем все поэтапно…
Как уже было упомянуто, протокол использует обмен данными по модели ведущий-подчиненный (Master — Slave). Ведущий отправляет запросы, на которые могут отвечать подчиненные. Slave-устройство не может само начать обмен данными, только по команде от Master’a.
В качестве физического уровня стандарт предусматривает использование интерфейсов RS-232, RS-422 и RS-485. Также существует реализация протокола Modbus для TCP/IP — Modbus TCP. Но этот вариант мы сегодня будем затрагивать в меньшей степени.
Сеть Modbus может состоять из нескольких slave-устройств (от 1-го до 247-ми), но master должен быть только один. Каждое из подчиненных устройств имеет свой собственный адрес, соответственно, ведущий может адресовать свое сообщение или запрос конкретному slave-устройству.
Кроме того, поддерживаются широковещательные сообщения, которые принимают все подчиненные. Но разница заключается в том, что опознав сообщение, адресованное именно ему, подчиненное устройство отправляет ведущему ответ. На широковещательные же запросы подчиненные отвечать не могут.
На адреса slave накладываются некоторые ограничения:
Вот как может выглядеть один из вариантов подключения устройств с использованием RS-485:
Здесь у нас присутствует один master и три slave-устройства с адресами от 0x03 до 0x05.
Переходим дальше… Различают несколько логических уровней протокола:
Modbus RTU | RS-232 RS-422 RS-485 |
Таблица | Тип элемента |
---|---|
Дискретные входы (Discrete Inputs) | 1 бит |
Дискретные выходы (регистры флагов, Coils) | 1 бит |
Регистры ввода (Input Registers) | 16-битное слово |
Регистры хранения (Holding Registers) | 16-битное слово |
Дискретные входы и регистры ввода доступны только для чтения данных, а, соответственно, дискретные выходы и регистры хранения — для чтения и записи.
Доступ к регистрам таблицы осуществляется при помощи 16-ти битного адреса. Первому элементу таблицы соответствует адрес 0. Таким образом, каждая из этих 4-х таблиц может включать в себя вплоть до 65536 регистров (адреса 0…65535 — 16 бит).
Вот теперь давайте рассмотрим конкретные команды из группы стандартных:
И, конечно же, мы не можем не разобрать конкретные примеры запросов и ответов при работе по Modbus.
Протокол Modbus. Примеры команд.
Первым делом займемся чтением данных — коды функций 0x01, 0x02, 0x03, 0x04. В общем виде запросы ведущего и ответы подчиненного выглядят следующим образом (здесь мы рассматриваем только часть пакета — PDU):
Обратите внимание, что в запросе передается количество элементов(!), то есть ячеек таблиц данных (регистров). А в ответе для указания размера данных используются уже байты. Значения адреса и количество элементов передаются в виде 16-битных слов, при этом старший байт передается первым.
Пойдем дальше обобщенного описания формата и проанализируем команды для конкретного устройства. В качестве этого устройства я использую сервопривод серии ASDA-A2, который для обмена данными использует как раз-таки протокол Modbus, причем поддерживает и Modbus RTU, и Modbus ASCII.
Пусть нам надо прочитать данные, расположенные по адресам 0x0200 и 0x0201, slave-устройства с адресом 0x01. Запрос master’а для Modbus RTU будет таким:
Здесь у нас в запросе, указано, что мы хотим прочитать значение двух элементов (регистров). И ответ slave:
А в ответе уже видим, что прочитано 4 байта, поскольку значение одного регистра — это 2 байта (16 бит), а регистров у нас тоже 2. Таким образом, полученные значения:
CRC Low и CRC High — это соответственно младший и старший байты 16-ти битной контрольной суммы.
В Modbus ASCII все несколько иначе, запрос выглядит так (в кавычках указаны ASCII символы):
И в первом и во втором случае запрашиваем значения одних и тех же регистров и, соответственно, получаем в ответ одинаковые данные.
При чтении битов регистров флагов или дискретных входов запрос выглядит точно также, а вот байты данных ответного сообщения иначе:
Здесь одно значение флага или дискретного входа занимает один бит. И все эти биты упакованы в байты, и если число запрошенных флагов/входов не распределяется по байтам (не кратно 8), то «лишние» биты заполняются нулями. Как в последнем байте на этой схеме.
Переходим к записи! Для записи одного значения используются команды с кодами 0x05 и 0x06. Запрос в целом похож на уже рассмотренный (при чтении данных), только вместо количества элементов для чтения передаются данные, которые будут записаны:
При записи значений флагов или дискретных входов число 0xFF00 соответствует включенному состоянию, 0x0000 — выключенному. В случае успешного выполнения запроса подчиненное устройство отправляет ведущему точную копию этого запроса.
С этим разобрались! Но необходимо рассмотреть еще и случай записи нескольких значений (коды команд 0x10 и 0x0F). В общем виде формат запроса такой:
И, в обязательном порядке, рассмотрим практический пример 🙂 Пусть нам требуется записать значения 0x0BB8 и 0x0000 по адресам, начинающимся с 0x0112. Запрос и ответ Modbus RTU:
И для Modbus ASCII:
Довольно большая получилась статья, но очень уж хотелось затронуть все по максимуму… И, на самом деле, некоторые моменты остались раскрытыми до конца 🙂 Например, расчет контрольной суммы для Modbus RTU и Modbus ASCII, алгоритмы там абсолютно разные. Так что в ближайшее время будет еще как минимум одна статья с примером программы для расчета LRC и CRC, оставайтесь на связи!
Знакомство с Modbus
Modbus — это протокол, который используют поверх TCP сокетов или в RTU варианте поверх работы с Serial портом, или 485 интерфейса насколько это встречалось в моей практике.
Для протокола существуют открытые спецификации на официальном сайте, где подробно разбирается Modbus по составляющим, правда на английском. Modbus нужен, как правило, чтобы читать регистры с устройств, или записывать в них данные, даже по 1 биту, и еще ряд дополнительных свойств. Это может обеспечить взаимодействие программы и устройства, чтобы считать измеренные устройством данные (заряд батареи, показания вольтметра, температуры) и произвести настройку устройства.
Кратко покажу что такое modbus rtu:
Так можно прочитать приходящие на сервер запросы modbus rtu. Структура 8 байт. FF это байт.
Может прийти сообщение вида: 02 03 A0 28 00 04 93 2A
Расшифрую сообщение. 02 — это номер устройства, к которому идет обращение. 03 — номер функции, т.е. 3 — читать регистры, а бывает еще записывать, регистры, коилы по 1 биту и т.д.
A0 28 если перевести в десятичную систему будет 41000 — номер регистра, 00 04 — значит еще 4 регистра нужно считать от 41000. Последние 2 числа — 2 байта кода CRC16.
Раз такое сообщение пришло, соответственно так же нужно заполнить массив на стороне отправки, и переправить либо через tcp сокеты, либо через com порт, или другим способом.
Ответ так же заполняется, но там будет уже сообщение вида: 02 03 08 00 01 00 02 00 03 00 04 95 В8 т.е. код устройства, код функции, количество передаваемых байт, 1234 данных (это как бы значения регистров). 2 байта код CRC.
Код CRC рассчитывается от сообщения не включая 2 байта кода CRC. Это для функции 3. В коде:
Заполнить данными и подсчитать CRC:
И отправить по Serial порту:
Таким образом отправили и ответили на функцию 3 (чтение нескольких регистров) по протоколу Modbus.
Спасибо за внимание! Читайте спецификации на официальном сайте протокола.
Modbus RTU для Чайников
Modbus — протокол, работающий по принципу «клиент-сервер».
Широко применяется в промышленности.
Modbus может использоваться для передачи данных через последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP.
В этой статье рассмотрим на примере линии RS-485.
И так, в основе интерфейса RS-485 лежит принцип дифференциальной (балансной) передачи данных. Суть его заключается в передаче одного сигнала по двум проводам. Причем по одному проводу (условно A) идет оригинальный сигнал, а по другому (условно B) — его инверсная копия. Другими словами, если на одном проводе «1», то на другом «0» и наоборот. Таким образом, между двумя проводами витой пары всегда есть разность потенциалов: при «1» она положительна, при «0» — отрицательна.
Именно этой разностью потенциалов и передается сигнал. Такой способ передачи обеспечивает высокую устойчивость к синфазной помехе. Синфазной называют помеху, действующую на оба провода линии одинаково. К примеру, электромагнитная волна, проходя через участок линии связи, наводит в обоих проводах потенциал. Если сигнал передается потенциалом в одном проводе относительно общего, как в RS-232, то наводка на этот провод может исказить сигнал относительно хорошо поглощающего наводки общего («земли»). Кроме того, на сопротивлении длинного общего провода будет падать разность потенциалов земель — дополнительный источник искажений. А при дифференциальной передаче искажения не происходит. В самом деле, если два провода пролегают близко друг к другу, да еще перевиты, то наводка на оба провода одинакова. Потенциал в обоих одинаково нагруженных проводах изменяется одинаково, при этом информативная разность потенциалов остается без изменений.
Воплощение
Есть несколько вариантов.
— Подешевле на известной MAX-ADM485.
Без изоляции, развязки, изолированного источника питания. Зато стоит не более 25 рублей.
— Подороже, сюда можно отнести монстра ADM2587, ADM2483 и пр.
Разводить пп желательно очень вдумчиво.
Узел RS-485 хорошо вынести подальше от точных и измерительных цепей, узлов и т.п.
На обычную сигнальную линию проложенную вдоль силовых установок и мощных потребителей, воздействует огромное количество наводок и помех.
В некоторых случаях, их потенциал может достигнуть нескольких тысяч вольт!
Так выглядит типичная посылка, от Ведущего — Ведомому.
Так выглядит ответ Ведомого — Ведущему
ID — Адрес ведомого устройства. Он может иметь значения от 1 до 247. Адрес 0 используется для широковещательной передачи, его распознаёт каждое устройство, адреса в диапазоне 248…255 — зарезервированы.
Команда(код функции):
в данном примере одна, на чтение 0x03.
Но в действительности их намного больше.
Все коды функций делятся на:
— Публичные коды, описанные в стандарте MODBUS-IDA. Их список включает уже назначенные и используемые коды, а также коды для будущего использования;
— User-Defined Function Codes (65-72, 100-110) — коды, которые могут использоваться компаниями для собственных функций, и не описаны в спецификации;
— Reserved Function Codes (9, 10, 13, 14, 41, 42, 43, 90, 91, 125, 126 и 127) — зарезервированы коды, которые не доступны для общего использования.
(0x02) — чтение значений из нескольких дискретных входов (Read Discrete Inputs).
(0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers).
(0x04) — чтение значений из нескольких регистров ввода (Read Input Registers).
(0x05) — запись значения одного флага (Force Single Coil).
(0x06) — запись значения в один регистр хранения (Preset Single Register).
(0x07) — Чтение сигналов состояния (Read Exception Status)
(0x0F) — запись значений в несколько регистров флагов (Force Multiple Coils)
(0x10) — запись значений в несколько регистров хранения (Preset Multiple Registers)
(0x16) — запись в один регистр хранения с использованием маски «И» и маски «ИЛИ» (Mask Write Register).
(0x18) — Чтение данных из очереди (Read FIFO Queue)
(0x14) — Чтение из файла (Read File Record)
(0x15) — Запись в файл (Write File Record)
(0x08) — Диагностика (Diagnostic)
(0x0B) — Чтение счетчика событий (Get Com Event Counter)
(0x0C) — Чтение журнала событий (Get Com Event Log)
(0x11) — Чтение информации об устройстве (Report Slave ID)
(0x2B) — Encapsulated Interface Transport
Обработка ошибок
Ведущий отправляет запрос к Ведомому, в котором в поле «код функции» указывает ему на необходимое действие.
Байты данных содержат информацию, необходимую для выполнения данной функции.
Ведомый, в случае удачного выполнения этой функции, повторяет код функции в ответе.
При возникновении ошибки, код функции в ответе модифицируется — старший бит выставляется в 1.
В байтах данных передается причина ошибки. Например при исполнении Ведомым функции 0x0F возникла ошибка, тогда он ответит Ведущему полем функции равным 0x8F.
В дополнении к изменению кода функции, Ведомый размещает в поле данных уникальный код, который указывает на тип и причину ошибки.
CRC-16, циклически избыточный код.
Полином:
Для расчета есть два метода:
Простой
и Табличный
Использование табличной функции
unsigned char mess[3] = <1,108,8>;
volatile unsigned short res1 = CRC16(&mess,3);
res1 будет равен 0x0СС6 при подстановке в конце команды менять местами
старший и младший байты не надо. Эта функция при занесении значения в
res1 автоматически меняет местами старший и младший байты.
Как указано в даташите на ADM485, для работы на прием выводы RE-DE-DI должны быть в 0,
тогда на выводе RO появляются принятые данные.
Для работы на передачу — все противоположно, но данные следует слать на DI.
Простая функция приема
Ответ выглядит примерно так
Все интервалы организованы на прерываниях.
Сообщение должно начинаться и заканчиваться интервалом тишины, длительностью не менее 3,5 символов.
Во время передачи сообщения не должно быть пауз длительностью более 1,5 символов.
Для скоростей более 19200 бод допускается использовать интервалы 1,75 и 0,75 мс, соответственно.
Для отладки удобно использовать что-то вроде Modbus_Poll.
К сожалению он не бесплатный, триальная версия работает 25 дней, ограничивает работу 10 минутами и всячески достает сообщениями…
Файл логанализатора, с общением по Modbus Яндекс диск
Рекомендуется к прочтению:
Спецификация Modbus Link
RS-485 для чайников — Link
Modbus в Википедии Link
Modbus протокол Link
Отдельное спасибо товарищу Papandopala, за функцию табличного расчета CRC.
- Что такое модах у армян
- Что такое модбас протокол