Протокол Modbus

2020-12-31 Промышленное  4 комментария

Несмотря на свой солидный возраст, а разработан он был еще в 70-х годах компанией Modicon, Modbus до сих пор является одним из самых, а скорее даже самым распространенным промышленным протоколом связи, во многом благодаря простой программной реализации и широкой поддержке большинством устройств, применяемых при создании систем автоматизации технологических процессов. Кроме того, протокол обладает высокой достоверностью передачи данных, связанную с применением надежного метода контроля ошибок.

modbus

Конечно, есть у протокола Modbus и свои недостатки, в частности сетевой обмен данными ведется по типу «ведущий-ведомый» (master-slave), то есть в сети может быть только одно ведущее устройство (master), которое опрашивает одно или несколько ведомых (slave). После отправки запроса ведущее устройство ожидает ответ от ведомого в течении определенного времени задержки — тайм-аута. Если в течение этого времени ответ не получен, master считает, что связь с ведомым отсутствует.

Соответственно ведомое устройство не может начать передавать данные по мере их поступления, а должно дождаться опроса со стороны ведущего, что приводит к тому, что master должен постоянно опрашивать slave устройства. Из этого вытекает и еще один недостаток протокола — slave устройство не может обнаружить потерю связи с master.

Реализация протоколов Modbus

Согласно модели OSI (Open Systems Interconnection), представляющую собой модель взаимодействия открытых систем, определяющей каким образом различные сетевые устройства взаимодействуют между собой, протокол Modbus содержит три уровня: физический, канальный и прикладной.

Физический уровень

На физическом уровне на базе последовательных интерфейсов связи RS-232, RS-485 реализованы протоколы Modbus RTU и Modbus ASCII. Передача данных по протоколу Modbus TCP осуществляется на основе сетей Ethernet через TCP/IP соединение. Далее рассмотрим структуру протокола Modbus RTU, как наиболее часто используемого.

Остановимся немного подробнее на этих терминах — интерфейс, протокол.

Интерфейсы передачи данных обеспечивают физическое подключение устройств в сети, то есть в данном случае они обеспечивают необходимые электрические параметры линии связи и другие параметры, связанные с передачей сигнала от одного устройства к другому, но при этом ничего не сообщают о том, как устройства должны обмениваться данными. За это отвечает протокол передачи данных, который определяет правила пересылки пакетов данных в сети.

На практике наиболее часто встречаются сети на основе интерфейса RS-485, для которых характерны следующие особенности построения:

  • Шинная топология сети — сетевая архитектура, предусматривающая последовательное подключение устройств к линии.
    Подключение устройств по RS-485
    Согласно спецификации, на линию с максимальным расстоянием 1200 м можно подключить до 32 устройств. Если протяженность линии превышает это значение, либо необходимо подключение большего количества устройств, то применяются повторители интерфейса (репитеры). Благодаря этому количество опрашиваемых устройств в сети может увеличиться до 247 и протяженность линии увеличиться еще на 1200 м.
  • Двухпроводная линия передачи данных. Интерфейс RS-485 подразумевает дифференциальный способ передачи данных, то есть по одному проводу передается оригинальный сигнал, а по второму- инвертированный, то есть если на одном проводе единица, то на другом ноль и наоборот. Таким образом между ними всегда присутствует разность потенциалов. При разности напряжений более 200мВ, до +12В считается, что на линии установлено значение логической единицы, при значении напряжения менее -200мВ до -7В — логического нуля.
  • Для соединения шины стандарт предписывает применение экранированной витой пары с волновым сопротивлением 120 Ом, где два провода используются для передачи данных, а третий в качестве общего GND, для выравнивания потенциалов устройств. Общий провод и экран должны заземляться в одной точке. Особенно эти требования актуальны для линий с большой протяженностью.
  • Установка согласующих (терминальных) резисторов, примерно такого же номинала, как волновое сопротивление кабеля, на концах линии. В некоторых случаях терминальные резисторы уже встроены в само устройство и их включение в линию и выключение осуществляется джамперами.

Канальный уровень

Канальный уровень отвечает за создание, прием и передачу пакетов данных в сети. Запросы по Modbus RTU поступают от устройства-мастера к подчиненным устройствам в виде пакетов данных (фреймов, кадров), состоящих из адреса подчиненного устройства, кода функции, данных и контрольной суммы.

Modbus передача данных

Адрес устройства — это имя идентификатор, благодаря которому ведущее устройство может определить, от какого модуля пришел ответ на запрос, а подчиненные устройства отвечают только на те запросы, которые поступили в их адрес. Благодаря этому в сети не возникает конфликтов при передаче данных. Каждое устройство должно иметь свой уникальный адрес с 1 по 247, с 248 по 255 адреса зарезервированы. В сети не должно быть устройств с одинаковыми адресами. Адрес 0 является широковещательным и предназначен для передачи информации всем устройствам в сети. Запрос с нулевым адресом устройства не предполагает ответа.

Код функции передает команду, которую должно выполнить устройство. Стандартом предусмотрено три категории кодов функций: стандартные, задаваемые пользователем и зарезервированные.

Данные содержат необходимую информацию для выполнения заданной функции или значения данных, передаваемые ведомым устройством в ответ на запрос ведущего.

Контрольная сумма служит для проверки отсутствия ошибок в передаваемых данных. В Мodbus RTU используется 2 байта контрольной суммы. Проверка осуществляется на основе алгоритма CRC16 (циклический избыточный код), который проверяет целостность данных пакетов.

Передача сообщений в Мodbus RTU представлена в следующем формате:

формат данных Modbus

Посылка сообщения всегда начинается со стартового бита — бита с нулевым уровнем. Затем идут 8 бит данных младшим битом вперед, бит четности, служащий для проверки общей чётности двоичного числа и заканчивается сообщение битом с единичным уровнем — стоповым битом. Бит четности (parity bit) обеспечивает контроль целостности передаваемых данных. При контроле по чётности (even parity) к данным добавляется бит чётности, значение которого делает полученную сумму чётной, при контроле по нечётности (odd parity) полученная сумма должна стать нечётной. Бит четности не является обязательным и может вообще отсутствовать в сообщении. В этом случае вместо бита четности используется второй стоповый бит.

формат данных Modbus

Прикладной уровень

Прикладной уровень обеспечивает обмен данными между устройствами ведущий-ведомый. Он основан на обращении с помощью кодов функций к регистрам данных для чтения/записи значений.

Протокол Modbus определяет четыре типа данных:

Тип данных Размер Доступ Номер регистра Диапазон адресов
Discrete Inputs Дискретные входы 1 бит только чтение 10001...19999 0 — 65535
Coils Регистры флагов 1 бит чтение и запись 00001...09999 0 — 65535
Input Registers Регистры ввода 16-битное слово только чтение 30001...39999 0 — 65535
Holding Registers Регистры хранения 16-битное слово чтение и запись 40001...49999 0 — 65535

 

Дискретные входы (Discrete Inputs) – представляют однобитовые регистры (0 или 1), хранящие состояние дискретных входов устройства. Эти регистры поддерживают только чтение.

Регистры флагов (Coils) также представляют собой однобитовые регистры, но хранящие состояние дискретных выходов устройств. Допускают как чтение, так и запись.

Регистры ввода (Input Registers) представлены 16-битовым знаковым или беззнаковым типом. Используются для работы с входными данными, например аналоговыми значениями входов. Поддерживают только чтение.

Регистры хранения (Holding Registers) представлены 16-битовым знаковым или беззнаковым типом. Поддерживают как чтение, так и запись данных.

Адреса регистров

Доступ к регистрам данных из таблицы осуществляется при помощи 16-ти битного адреса. Первому элементу соответствует адрес 0. Таким образом, каждая из этих 4-х таблиц может включать в себя до 65536 регистров (адреса 0…65535 – 16 бит).

Нумерация регистров представлена в виде десятичных значений. Для обращения к адресу требуемого регистра необходимо указать так называемое смещение (offset) — убрать первую цифру из номера регистра и вычесть единицу. Например в Holding Registers нумерация начинается с 40001. Отбросим значение 4 и вычтем из единицы единицу. Таким образом адрес регистра будет равен 0.

Коды функций

Для доступа к данным области памяти используются коды функций. Несмотря на то, что стандартных кодов существует довольно много, в основном используются следующие коды функций:

Код функции HEX Название Действие
1 0×01 Read Coils Чтение значений нескольких регистров флагов
2 0×02 Read Discrete Inputs Чтение значений нескольких дискретных входов
3 0×03 Read Holding Registers Чтение значений нескольких регистров хранения
4 0×04 Read Input Registers Чтение значений нескольких регистров ввода
5 0×05 Write Single Coil Запись одного регистра флагов
6 0×06 Write Single Register Запись одного регистра хранения
15 0x0F Write Multiple Coils Запись нескольких регистров флагов
16 0×10 Write Multiple Register Запись нескольких регистров хранения

 

Из таблицы понятно, что например для Discrete Inputs используется только функция 02, для Coils уже можно использовать либо 01 функцию для чтения, либо 05 для записи одного регистра, либо 15 для записи группы регистров и т.д.

Пример запроса

Предположим, нам надо обратиться к устройству с адресом 17 и получить значение аналогового выхода с помощью Holding Register из регистров 40108 до 40110, то есть значение 3-х регистров. В этом случае, запрос от ведущего устройства к ведомому будет представлен в следующем виде:

11 03 006B 0003 7687

  • 11 — Адрес ведомого устройства в формате HEX (17=11 hex)
  • 03 — Функция Read Holding Registers, считываем значение нескольких регистров хранения
  • 006B — Адрес первого регистра (40108-40001 = 107 = 6B hex, смещение регистра)
  • 0003 — Количество считываемых регистров ( 3 регистра с 40108 до 40110)
  • 7687 — Контрольная сумма CRC

Ведомое устройство должно переслать следующий ответ:

11 03 06 AE41 5652 4340 49AD

  • 11 — Адрес устройства
  • 03 — Функция Read Holding Registers
  • 06 — Количество байт (6 байтов идут следом)
  • AE — Значение старшего разряда регистра в hex (Register value Hi-AO0)
  • 41 — Значение младшего разряда регистра в hex (Register value Lo-AO0)
  • 56 — Значение старшего разряда регистра в hex (Register value Hi-AO1)
  • 52 — Значение младшего разряда регистра в hex (Register value Lo-AO1)
  • 43 — Значение старшего разряда регистра в hex (Register value Hi-AO2)
  • 40 — Значение младшего разряда регистра в hex (Register value Lo-AO2)
  • 49 — Контрольная сумма (CRC value Lo)
  • AD — Контрольная сумма (CRC value Hi)

Коды ошибок

Вместо корректного  ответа, содержащего запрошенные данные, ведомое устройство может переслать ответ с ошибкой. При этом к коду функции в ответе добавляется код 0×80 в формате hex, то есть в данном случае к коду функции 03 добавляется 80 и признак ошибки будет иметь значение 83.

Кроме того отсылается код ошибки:

  • 01 — функция не поддерживается. Это значит, что, возможно, функция не стандартная или просто не реализована конкретно в этом устройстве.
  • 02 — запрошенная область памяти не доступна. Каждое устройство содержит определённое количество данных определённого типа. Например, в устройстве доступно 100 регистров общего назначения. Если при этом запросить чтение 101 регистров, то возникнет ошибка 02.
  • 03 — функция не поддерживает запрошенное количество данных. Например, функция Read Holding Registers позволяет считывать от 1 до 2000 регистров общего назначения. Поэтому, даже если в подчинённом устройстве доступно для чтения 10 000 регистров, при запросе более 2000 с помощью данной функции возникает эта ошибка.
  • 04 — функция выполнена с ошибкой. Этот код отсылается в случае, если ошибка не относится к трем предыдущим кодам.

Резюме

Данная статья является, можно сказать, только вводной частью в тему промышленных протоколов и безусловно не охватывает все вопросы, связанные с ними, в частности с Modbus. Так например мы не рассмотрели Modbus TCP и его отличия от RTU, также не была рассмотрена практическая реализация обмена данными по Modbus между устройствами.  Так что статьи по данной теме обязательно еще будут на сайте.

Поделиться в соц. сетях

Опубликовать в LiveJournal
Опубликовать в Яндекс

  • Albert says:

    Вы не подскажите, как можно связать устройства наZ-Wave c Modbus? Я так понимаю, что напрямую это не получится?

    • admin says:

      Не могу вам ничего посоветовать, с Z-Wave не знаком.

    • Vlad says:

      Через сетевой шлюз попробуйте, с ZigBee так делал.

  • Кристина says:

    Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU ( Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (

Комментарии

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>