Контроль ошибок modbus

Во время обмена
данными могут возникать ошибки двух
типов:

  • ошибки, связанные
    с искажениями при передаче данных;

  • логические ошибки.

Ошибки первого
типа обнаруживаются при помощи фреймов
символов, контроля чётности и циклической
контрольной суммы CRC-16-IBM
(используется число-полином
= 0xA001).

Rtu фрейм

В RTU режиме сообщение
должно начинаться и заканчиваться
интервалом тишины — временем передачи
не менее 3.5 символов при данной скорости
в сети. Первым полем затем передаётся
адрес устройства.

Вслед за последним
передаваемым символом также следует
интервал тишины продолжительностью не
менее 3.5 символов. Новое сообщение может
начинаться после этого интервала.

Фрейм сообщения
передаётся непрерывно. Если интервал
тишины продолжительностью 1.5 возник во
время передачи фрейма, принимающее
устройство должно игнорировать этот
фрейм как неполный.

Таким образом,
новое сообщение должно начинаться не
раньше 3.5 интервала, т.к. в этом случае
устанавливается ошибка.

Немного об интервалах
(речь идёт о Serial Modbus RTU): при скорости
9600 и 11 битах в кадре (стартовый бит + 8
бит данных + бит контроля чётности +
стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), т.е. более
4 мс; 1.5 * 11 / 9600 = 0,00171875, т.е. не более 1 мс.
Для скоростей более 19200 бод допускается
использовать интервалы 1,75 и 0,75 мс
соотвественно.

Логические ошибки

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

1. Если Slave принимает
корректный запрос и может его нормально
обработать, то возвращает нормальный
ответ.

2. Если Slave не
принимает какого либо значения, никакого
ответа не отправляется. Master диагностирует
ошибку по таймауту.

3. Если Slave принимает
запрос, но обнаруживает ошибку (parity,
LRC, or CRC), никакого ответа не отправляется.
Master диагностирует ошибку по таймауту.

4. Если Slave принимает
запрос, но не может его обработать
(обращение к несуществующему регистру
и т.д.), отправляется ответ содержащий
в себе данные об ошибке.

Направление
передачи

адрес
подчинённого устройства

номер
функции

данные
(или код ошибки)

CRC

Запрос
(Master→Slave)

0x01

0x77

0xDD

0xC7
0xA9

Ответ
(Slave→Master)

0x01

0xF7

0xEE

0xE6
0x7C

Таблица
2-1. Кадр ответа (Slave→Master) при возникновении
ошибки modbus RTU

Стандартные коды ошибок

01
Принятый код функции не может быть
обработан на подчиненном.

02
Адрес данных указанный в запросе не
доступен данному подчиненному.

03
Величина содержащаяся в поле данных
запроса является не допустимой

величиной
для подчиненного.

04
Невосстанавливаемая ошибка имела место
пока подчиненный пытался выполнить

затребованное
действие.

05
Подчиненный принял запрос и обрабатывает
его, но это требует много времени.

Этот
ответ предохраняет главного от генерации
ошибки таймаута.

06
Подчиненный занят обработкой команды.

Главный
должен повторить сообщение позже, когда
подчиненный освободится.

07
Подчиненный не может выполнить программную
функцию, принятую в запросе.

Этот
код возвращается для неудачного
программного запроса, использующего

функции
с номерами 13 или 14.

Главный
должен запросить диагностическую
информацию или информацию об

ошибках
с подчиненного.

08
Подчиненный пытается читать расширенную
память, но обнаружил ошибку паритета.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Modbus: общие положения

Протокол Modbus и одноимённая сеть [1-4] являются самыми распространёнными в мире среди протоколов и сетей. Несмотря на свой возраст (Modbus стал стандартом де-факто ещё в 1979 году) он не только не устарел, но, наоборот, демонстрирует существенно возросшее количество ориентированных на него новых разработок и увеличивающийся объём организационной поддержки протокола. Миллионы Modbus-устройств по всему миру продолжают успешно работать, обновляются версии описания протокола [2].

Одним из главных преимуществ Modbus является отсутствие необходимости в специальных интерфейсных контроллерах (PROFIBUS и CAN требуют для своей реализации заказных микросхем), также к преимуществам следует причислить простоту программной реализации и элегантность принципов функционирования. Всё это снижает затраты на освоение стандарта как системными интеграторами, так и разработчиками контроллерного оборудования. Высокая степень открытости протокола обеспечивается полностью бесплатными текстами стандартов, которые можно скачать с сайта www.modbus.org.

В России Modbus по распространённости конкурирует только с PROFIBUS. Популярность протокола в настоящее время объясняется, прежде всего, совместимостью с большим количеством оборудования, которое поддерживает протокол Modbus. Кроме того, Modbus имеет высокую достоверность передачи данных, связанную с применением надёжного метода контроля ошибок. Modbus позволяет унифицировать команды обмена благодаря стандартизации номеров (адресов) регистров и функций их чтения-записи.

Основным недостатком Modbus является сетевой обмен по типу «ведущий–ведомый», что не позволяет ведомым устройствам передавать данные по мере их появления и поэтому требует интенсивного опроса ведомых устройств ведущим.

Разновидностями Modbus выступают Modbus Plus [4], представляющий собой многомастерный протокол с кольцевой передачей маркера, и протокол Modbus TCP [5], рассчитанный на использование в сетях Ethernet и Интернет.

Протокол Modbus имеет два режима передачи: RTU (remote terminal unit – удалённое терминальное устройство) и ASCII. Стандарт предусматривает, что режим RTU в протоколе Modbus должен присутствовать обязательно, а режим ASCII является опционным. Пользователь может выбирать любой из них, но все модули, включённые в сеть Modbus, должны иметь один и тот же режим передачи.

Мы рассмотрим только протокол Modbus RTU, поскольку Modbus ASCII в России практически не используется. Отметим, что Modbus ASCII нельзя путать с частнофирменным протоколом DCON, который используется в модулях фирм Advantech и ICP DAS и не соответствует стандарту Modbus.

Стандарт Modbus предусматривает применение физического интерфейса RS-485, RS-422 или RS-232. Наиболее часто применяемым для организации промышленной сети является 2-проводной интерфейс RS-485. Для соединений точка–точка может быть использован интерфейс RS-232 или RS-422.

В стандарте Modbus имеются требования обязательные, рекомендуемые и опционные (необязательные). Существует три степени соответствия стандарту: полностью соответствует (когда протокол соответствует всем обязательным и всем рекомендуемым требованиям), условно соответствует (когда протокол соответствует только обязательным требованиям и не соответствует рекомендуемым) и не соответствует.

Модель OSI протокола Modbus содержит три уровня: физический, канальный и прикладной (табл. 1).

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

В новых разработках на основе Modbus стандарт рекомендует использовать интерфейс RS-485 с двухпроводной линией передачи, но допускается применение четырёхпроводной линии и интерфейса RS-232.

Modbus-шина должна состоять из одного магистрального кабеля, от которого могут быть сделаны отводы. Магистральный кабель Modbus должен содержать 3 проводника в общем экране, два из которых представляют собой витую пару, а третий соединяет общие («земляные») выводы всех интерфейсов RS-485 в сети. Общий провод и экран должны быть заземлены в одной точке, желательно около ведущего устройства.

Устройства могут подключаться к кабелю тремя способами:

  • непосредственно к магистральному кабелю;

  • через пассивный разветвитель (тройник);

  • через активный разветвитель, содержащий развязывающий повторитель интерфейса.

В документации на устройство и на разветвитель должны быть указаны наименования подключаемых цепей.

На каждом конце магистрального кабеля должны быть установлены резисторы для согласования линии передачи, как это требуется для интерфейса RS-485. В отличие от RS-485 наличие терминальных резисторов в соответствии со стандартом Modbus является обязательным независимо от скорости обмена. Их номинал может быть равным 150 Ом при мощности 0,5 Вт. Терминальные резисторы, а также резисторы, устраняющие неопределённость состояния линии при высокоомном состоянии передатчиков, устанавливаются так же, как и в других сетях на основе физического интерфейса RS-485. Стандарт требует, чтобы в руководствах по эксплуатации устройств Modbus было сказано, имеются ли указанные резисторы внутри устройства или их необходимо устанавливать при монтаже сети. Если требуются внешние резисторы, то они должны иметь номинал в интервале от 450 до 650 Ом и быть установлены только в одном месте в пределах каждого сегмента сети (сегментами считаются части сети между повторителями интерфейса).

Modbus-устройство обязательно должно поддерживать скорости обмена 9600 и 19 200 бит/с, из них 19 200 бит/с устанавливается по умолчанию. Допускаются также скорости 1200, 2400, 4800, … 38 400 бит/с, 65 и 115 кбит/с, …

Скорость передачи должна выдерживаться в передатчике с погрешностью не хуже 1%, а приёмник должен принимать данные при отклонении скорости передачи до 2%.

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

Максимальная длина магистрального кабеля при скорости передачи 9600 бит/с и сечении жил более 0,13 мм2 (AWG 26) составляет 1 км. Отводы от магистрального кабеля не должны быть длиннее 20 м. При использовании многопортового пассивного разветвителя с N отводами длина каждого отвода не должна превышать значения 40/N м.

Modbus не устанавливает конкретных типов разъёмов, но если используются разъёмы RJ-45, mini-DIN или D-shell, они должны быть экранированными, а цоколёвки должны соответствовать стандарту.

Для минимизации ошибок при монтаже рекомендуется использовать провода следующих цветов: жёлтый – для положительного вывода RS-485 (на котором устанавливается логическая 1, когда через интерфейс выводится логическая 1), коричневый – для второго вывода интерфейса RS-485, серый – для общего провода.

Типовым сечением кабеля является AWG 24 (0,2 мм2, диаметр провода 0,51 мм). При использовании кабеля категории 5 его длина не должна превышать 600 м. Волновое сопротивление кабеля желательно выбирать более 100 Ом, особенно для скорости обмена более 19 200 бит/с.

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

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

Адреса с 1 по 247 являются адресами Modbus-устройств в сети, а с 248 по 255 зарезервированы. Ведущее устройство не должно иметь адреса, и в сети не должно быть двух устройств с одинаковыми адресами.

Ведущее устройство может посылать запросы всем устройствам одновременно (широковещательный режим) или только одному. Для широковещательного режима зарезервирован адрес 0 (при использовании в команде этого адреса она принимается всеми устройствами сети).

Описание кадра (фрейма) протокола Modbus

В протоколе Modbus RTU сообщение начинает восприниматься как новое после паузы (тишины) на шине длительностью не менее 3,5 шестнадцатеричных символов (14 бит), то есть величина паузы в секундах зависит от скорости передачи.

Формат кадра показан на рис. 1. 

Поле адреса всегда (даже в ответах на команду, посланную ведущим) содержит только адрес ведомого устройства. Благодаря этому ведущее устройство знает, от какого модуля пришёл ответ.

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

Поле «Данные» может иметь произвольное количество байтов в диапазоне от 0 до 255. В нём может содержаться информация о параметрах, используемых в запросах контроллера или ответах модуля.

Поле «Контрольная сумма» содержит контрольную сумму CRC длиной 2 байта.

Структура данных в режиме RTU

В режиме RTU данные передаются младшими разрядами вперёд (рис. 2).

По умолчанию в режиме RTU бит паритета устанавливают равным 1, если количество двоичных единиц в байте нечётное, и равным 0, если оно чётное. Такой паритет называют чётным (even parity), а метод контроля называют контролем чётности.

При чётном количестве двоичных единиц в байте бит паритета может быть равен 1. В этом случае говорят, что паритет является нечётным (odd parity).

Контроль чётности может отсутствовать вообще. В этом случае вместо бита паритета должен использоваться второй стоповый бит. Для обеспечения максимальной совместимости с другими продуктами рекомендуется использовать возможность замены бита паритета на второй стоповый бит.

Ведомые устройства могут воспринимать любой из вариантов: чётный, нечётный паритет или его отсутствие.

Структура сообщения Modbus RTU

Сообщения Modbus RTU передаются в виде кадров, для каждого из которых известны начало и конец. Признаком начала кадра является пауза (тишина) продолжительностью не менее 3,5 шестнадцатеричных символов (14 бит). Кадр должен передаваться непрерывно. Если при передаче кадра обнаруживается пауза продолжительностью более 1,5 шестнадцатеричных символов (6 бит), то считается, что кадр содержит ошибку и должен быть отклонён принимающим модулем. Эти величины пауз должны строго соблюдаться при скоростях ниже 19 200 бит/с, однако при более высоких скоростях рекомендуется использовать фиксированные значения паузы – 1,75 мс и 750 мкс соответственно.

Контроль ошибок

В режиме RTU имеются два уровня контроля ошибок в сообщении:

  • контроль паритета для каждого байта (опционно);

  • контроль кадра в целом с помощью CRC-метода.

CRC-метод используется независимо от проверки паритета. Значение CRC устанавливается в ведущем устройстве перед передачей. При приёме сообщения вычисляется код CRC для всего сообщения и сравнивается с его значением, указанным в поле CRC кадра. Если оба значения совпадают, считается, что сообщение не содержит ошибки.

Стартовые, стоповые биты и бит паритета в вычислении CRC не участвуют.

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

Прикладной уровень Modbus RTU версии 1.1а описан в [3]. Он обеспечивает коммуникацию между устройствами типа «ведущий–ведомый». Прикладной уровень является независимым от физического и канального, в частности, он может использовать протоколы Ethernet TCP/IP (Modbus TCP/IP), Modbus Plus (многомастерная сеть с передачей маркера), интерфейсы RS-232, RS-422, RS-485, оптоволоконные линии, радиоканалы и другие физические среды для передачи сигналов.

Прикладной уровень Modbus основан на запросах с помощью кодов функций. Код функции указывает ведомому устройству, какую операцию оно должно выполнить.

При использовании протокола прикладного уровня с различными протоколами транспортного и канального уровня сохраняется неизменным основной блок Modbus-сообщения, включающий код функции и данные (этот блок называется PDU – protocol data unit – элемент дан-ных протокола). К блоку PDU могут добавляться дополнительные поля при использовании его в различных промышленных сетях, и тогда он называется ADU – application data unit – элемент данных приложения.

Коды функций

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

Коды функций являются числами в диапазоне от 1 до 127, причём коды в диапазоне от 65 до 72 и от 100 до 110 относятся к задаваемым пользователем функциям. Коды в диапазоне от 128 до 255 зарезервированы для пересылки кодов ошибок в ответном сообщении. Код 0 не используется.

Коды ошибок используются ведомым устройством, чтобы определить, какое действие предпринять для их обработки. Значения кодов и их смысл описаны в стандарте на Modbus RTU [3].

Поле данных (рис. 1) в сообщении, посланном от ведущего устройства ведомому, содержит дополнительную информацию, которую ведомое устройство использует, чтобы выполнить функцию, указанную в поле «Код функции». Поле данных может содержать значения состояний дискретных входов/выходов, адреса регистров, из которых надо считывать (записывать) данные, количество байтов данных, ссылки на переменные, количество переменных, код подфункций и т.п.

Если ведомое устройство нормально выполнило принятую от ведущего функцию, то в ответе поле «Код функции» содержит ту же информацию, что и в запросе. В противном случае ведомый выдаёт код ошибки. В случае ошибки код функции в ответе равен коду функции в запросе, увеличенному на 128.

Содержание поля данных

В сообщении ведущего устройства ведомому поле данных содержит дополнительную информацию, необходимую для выполнения указанной функции. Например, если код функции указывает, что необходимо считать данные из группы регистров устройства ввода (код функции 03 hex), то поле данных содержит адрес начального регистра и количество регистров. Если ведущее устройство посылает команду записи данных в группу регистров (код функции 10 hex), то поле данных должно содержать адрес начального регистра, количество регистров, количество байтов данных и данные для записи в регистр.

Конкретное содержание поля данных устанавливается стандартом для каждой функции отдельно.

В некоторых сообщениях поле данных может иметь нулевую длину.

Список кодов Modbus

В табл. 2 приведён пример кодов Modbus RTU для модуля дискретного ввода и вывода типа RealLab! NL-16DI (фирмы НИЛ АП). Для чтения логических состояний входов модуля через интерфейс RS-485 необходимо послать команду в формате, показанном на рис. 1, где в полях «Адрес» и «Код функции» указываются значения из соответствующих граф табл. 2.

Modbus TCP

Протокол Modbus TCP [5] (или Modbus TCP/IP) используется для того, чтобы подключить устройства с протоколом Modbus к Ethernet или сети Internet. Он использует кадры Modbus RTU на 7-м (прикладном) уровне модели OSI, протоколы Ethernet на 1-м и 2-м уровнях модели OSI и TCP/IP на 3-м и 4-м уровнях, то есть Ethernet TCP/IP используется для транспортировки модифицированного кадра Modbus RTU.

Кадр Modbus RTU (рис. 1) в этом случае не имеет поля контрольной суммы, поскольку используется стандартная контрольная сумма Ethernet TCP/IP; нет также поля адреса, поскольку в Ethernet используется иная систем адресации. Таким образом, только два поля – «Код функции» и «Данные» (блок PDU) встраиваются в протокол Ethernet TCP/IP. Перед ними вставляется новое поле (рис. 3) – MBAP (Modbus application protocol – прикладной протокол Modbus). 

Поле «Идентификатор обмена» используется для идентификации сообщения в случае, когда в пределах одного TCP-соединения клиент посылает серверу несколько сообщений без ожидания ответа после каждого сообщения. Поле «Идентификатор протокола» содержит нули и зарезервировано для будущих применений. Поле «Длина» указывает количество следующих за ним байтов. Поле «Идентификатор устройства» идентифицирует удалённый сервер, расположенный вне сети Ethernet (например, в сети Modbus RTU, которая соединена с Ethernet с помощью межсетевого моста).

Чаще всего это поле содержит нули или единицы, игнорируется сервером и отправляется обратно в том же виде (как эхо).

Изображённый на рис. 3 фрейм называется фреймом ADU, встраивается в поле «Данные» фрейма Ethernet [1] и посылается через TCP-порт 502, специально зарезервированный для Modbus TCP (порты назначаются и контролируются организацией IANA – Internet Assigned Numbers Authority, www.iana.org). Клиенты и серверы Modbus посылают, получают и прослушивают сообщения через TCP-порт 502.

Таким образом, структура кадра и смысл его полей «Код функции» и «Данные» для Modbus и Modbus TCP совершенно идентичны, поэтому для работы с Modbus TCP не требуется дополнительного обучения при знании Modbus RTU. Те же самые коды функций и данные, что и в Modbus RTU, передаются по очереди с прикладного (7-го) уровня модели OSI (рис. 4) на транспортный уровень, который добавляет к блоку PDU кадра Modbus RTU (рис. 1) заголовок с протоколом TCP. Далее новый полученный кадр передаётся на сетевой уровень, где в него добавляется заголовок IP, затем он передаётся на канальный уровень Ethernet и на физический. Дойдя до физического уровня, блок PDU оказывается «обросшим» заголовками протоколов всех уровней, через которые он прошёл. Пройдя по линии связи, сообщение продвигается снизу вверх по стеку протоколов (уровням модели OSI) в устройстве получателя, где на каждом уровне из него удаляется соответствующий заголовок, а на прикладном уровне выделяется блок PDU (код функции и данные) кадра протокола Modbus RTU.

В сети c протоколом Modbus TCP устройства взаимодействуют по типу «клиент–сервер», где в качестве клиента выступает ведущее устройство, в качестве сервера – ведомое. Сервер не может инициировать связи в сети, но некоторые устройства в сети могут выполнять роль как клиента, так и сервера.

Modbus TCP не имеет широковещательного или многоабонентского режима, он осуществляет соединение только между двумя устройствами. ●

Литература

  1. Денисенко В.В. Компьютерное управление технологическим процессом, экспериментом, оборудованием. – М. : Горячая линия – Телеком, 2008. – 608 с.

  2. Modbus over serial line specification and implementation guide, v1.02 [Электронный ресурс]. – Режим доступа : http://www.modbus.org. – Dec. 20, 2006. – 44 p.

  3. Modbus application protocol specification v1.1a [Электронный ресурс]. – Режим доступа : http://www.modbus-IDA.org. – June 4, 2004. – 51 p.

  4. Modicon Modbus Protocol Reference Guide. PI-MBUS-300 Rev. J. – MODICON, Inc., Industrial Automation Systems. – June 1996. – 121 p.

  5. Modbus messaging on TCP/IP implementation guide, v1.0a [Электронный ресурс]. – Режим доступа : http://www.modbus-IDA.org. – June 4, 2004 – 46 p.

Modbus — коммуникационный протокол, основанный на клиент-серверной архитектуре. Разработан фирмой Modicon для использования в контроллерах с программируемой логикой (PLC). Стал стандартом де-факто в промышленности и широко применяется для организации связи промышленного электронного оборудования. Использует для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP. В настоящее время поддерживается некоммерческой организацией Modbus-IDA.

Общее описание протокола Modbus RTU[править | править код]

Протокол Modbus описывает единый простой формат передачи данных PDU, который в свою очередь входит в полный пакет ADU. Формат ADU меняется в зависимости от типа линии связи. Существуют три режима протокола: Modbus RTU, Modbus ASCII, Modbus TCP. Первые два используют последовательные линии связи (в основном RS-485, реже RS-422/RS-232), последний использует для передачи данных по сетям TCP/IP.

Протокол Modbus RTU предполагает одно ведущее (запрашивающее) устройство в линии (master), которое может передавать команды одному или нескольким ведомым устройствам (slave), обращаясь к ним по уникальному в линии адресу. Синтаксис команд протокола позволяет адресовать 247 устройств на одной линии связи стандарта RS-485 (реже RS-422 или RS-232).

Инициатива проведения обмена всегда исходит от ведущего устройства. Ведомые устройства прослушивают линию связи. Мастер подаёт запрос (посылка, последовательность байт) в линию и переходит в состояние прослушивания линии связи. Ведомое устройство отвечает на запрос, пришедший в его адрес.
Окончание ответной посылки мастер определяет, по временному интервалу между окончанием приёма предыдущего байта и началом приёма следующего. Если этот интервал превысил время, необходимое для приёма двух байт на заданной скорости передачи, приём кадра ответа считается завершённым.
Кадры запроса и ответа по протоколу modbus имеют фиксированный формат, приведённый в (Таблица 1-1).

Таблица 1-1. Кадр посылки Modbus RTU

адрес ведомого устройства номер функции данные CRC

1 байт

1 байт

N < 253 (байт) 2 байта

где:

  • адрес ведомого устройства — первое однобайтное поле кадра. Оно содержит адрес подчинённого устройства, к которому адресован запрос. Ведомые устройства отвечают только на запросы, поступившие в их адрес. Ответ также начинается с адреса отвечающего ведомого устройства, который может изменяться от 1 до 254. Адрес 0 используется для широковещательной передачи, его распознаёт каждое устройство;
  • номер функции — это следующее однобайтное поле кадра. Оно говорит ведомому устройству, какие данные или выполнение какого действия требует от него ведущее устройство;
  • данные — поле содержит информацию, необходимую ведомому устройству для выполнения заданной мастером функции или содержит данные, передаваемые ведомым устройством в ответ на запрос ведущего. Длина и формат поля зависит от номера функции;
  • CRC — (контрольная сумма) заключительное двухбайтное поле кадра. Контрольная сумма завершает кадры запроса и ответа и применяется для проверки отсутствия ошибок в кадре посылки Modbus RTU.

Следует отметить, что поле CRC записывается младшим байтом вперёд. Алгоритм расчёта CRC может отличаться для разных устройств.

Адресация данных в протоколе Modbus RTU[править | править код]

Все операции с данными привязаны к нулю, каждый вид данных (регистр, выходное/входное значение) начинаются с адреса 0000.
Адресация к ячейке начинается с 1.

Например:
Флаг номер 1 программируемого контроллера имеет адрес 0000 (указывается в поле «Адрес»).

Флаг номер 127 (DEC) имеет адрес 0x007E hex (126 dec) (указывается в поле «Адрес»).

Запоминающий регистр 40001 будет иметь адрес 0000 в поле «Адрес» команды. Потому что код операции уже содержит в себе необходимую информацию об адресе. Операции с этими регистрами имеют смещение Адрес_регистра — 40000 = Значение Используемое В Поле «Адрес». Тип адресации команд в дальнейшем будем помечать т.о.

смещение обозначение
-40000 4x
-10000 1x

Запоминающий регистр 40108 будет иметь адрес 006B hex (107 dec)

Контроль ошибок в протоколе Modbus RTU[править | править код]

Во время обмена данными могут возникать ошибки двух типов:

  • ошибки, связанные с искажениями при передаче данных;
  • логические ошибки.

Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001).

RTU фрейм[править | править код]

В RTU режиме сообщение начинается с интервала тишины равного времени передачи 3.5 символов при данной скорости передачи в сети. Первым полем затем передается адрес устройства.

Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала.

Фрейм сообщения передается непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство заканчивает прием сообщения и следующий байт будет воспринят как начало следующего сообщения.

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

Логические ошибки[править | править код]

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

1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.

2. Если Slave не принимает какого либо значения, никакого ответа не отправляется. Master диагностирует ошибку по таймауту.

3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по таймауту.

4. Если Slave принимает запрос, но не может его обработать (обращение к несуществующему регистру и т.д.), отправляется ответ содержащий в себе данные об ошибке.

Таблица 2-1. Кадр ответа (Slave→Master) при возникновении ошибки modbus RTU

Направление передачи адрес подчинённого устройства номер функции данные (или код ошибки) CRC

Запрос (Master→Slave)

0x01

0x77

0xDD

0xC7 0xA9

Ответ (Slave→Master)

0x01

0xF7

0xEE

0xE6 0x7C

Стандартные коды ошибок[править | править код]

01 Принятый код функции не может быть обработан на подчиненном.
02 Адрес данных указанный в запросе не доступен данному подчиненному. 
03 Величина содержащаяся в поле данных запроса является не допустимой 
   величиной для подчиненного. 
04 Невосстанавливаемая ошибка имела место пока подчиненный пытался выполнить
   затребованное действие. 
05 Подчиненный принял запрос и обрабатывает его, но это требует много времени. 
   Этот ответ предохраняет главного от генерации ошибки таймаута.
06 Подчиненный занят обработкой команды. 
   Главный должен повторить сообщение позже, когда подчиненный освободится. 
07 Подчиненный не может выполнить программную функцию, принятую в запросе. 
   Этот код возвращается для неудачного программного запроса, использующего
   функции с номерами 13 или 14.
   Главный должен запросить диагностическую информацию или информацию об 
   ошибках с подчиненного. 
08 Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. 
   Главный может повторить запрос, но обычно в таких случаях требуется ремонт.

Стандартные коды функций протокола Modbus[править | править код]

В протокол Modbus можно выделить несколько подмножеств команд ( Таблица 3-1).

Таблица 3-1

Подмножество команд Диапазон кодов команд

Стандартные команды

1-21

Резерв для расширенных функций

22-64

Пользовательские

65-119

Резерв для внутренних нужд

120-255

0x10 Preset Multiple Registers (Установка значений в несколько регистров)[править | править код]

Тип адресации 4x

Значения регистров передаются в линию начиная с указанного адреса, следующие значения регистров передаются после него (см. поле «Данные»).
Ниже приведены примеры команда ведущего устройства (таблица 3-2) и ответ ведомого (таблица 3-3):

Таблица 3-2. Пример установки значения в один регистр

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Кол. регистров ст. байт 05 Кол. регистров мл. байт 06 Кол. байт 07 Данные ст. байт 08 Данные мл. байт 09 CRC мл. байт 10 CRC ст. байт

Master→Slave

0x01

0x10

0x00

0x01

0x00

0x01

0x02

0xFF

0xFF

0xA6

0x31

Таблица 3-3.Ответ на команду установки значения в один регистр

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Кол. регистров ст. байт 05 Кол. регистров мл. байт 06 CRC мл. байт 07 CRC ст. байт

Slave→Master

0x01

0x10

0x00

0x01

0x00

0x01

0x50

0x09

0x03 Read Holding Registers (Чтение значений из нескольких регистров)[править | править код]

Тип адресации 4x

Ниже приведены примеры команда ведущего устройства (таблица 3-4) и ответ ведомого (таблица 3-5):

Таблица 3-4. Пример чтения значения из одного регистра

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Кол. регистров ст. байт 05 Кол. регистров мл. байт 06 CRC мл. байт 07 CRC ст. байт

Master→Slave

0x01

0x03

0x00

0x01

0x00

0x01

0xD5

0xCA

Значения регистров передаются в линию начиная с указанного адреса, следующие значения регистров передаются после него (см. поле «Данные»).

Таблица 3-5. Ответ на команду чтения значения из одного регистра

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Кол. Байт 03 Данные ст. байт 04 Данные мл. байт 05 CRC мл. байт 06 CRC ст. байт

Slave→Master

0x01

0x03

0x02

0xFF

0xFF

0xB9

0xF4

0x06 Preset Single Register (Установка значения в один регистр)[править | править код]

Тип адресации 4x

Ниже приведены примеры команда ведущего устройства (таблица 3-2) и ответ ведомого (таблица 3-3):

Таблица 3-6. Пример установки значения в один регистр

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Данные ст. байт 05 Данные мл. байт 06 CRC мл. байт 07 CRC ст. байт

Master→Slave

0x01

0x06

0x00

0x01

0xFF

0xFF

0xD9

0xBA

Таблица 3-7. Ответ на команду установки значения в один регистр

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Данные ст. байт 05 Данные мл. байт 06 CRC мл. байт 07 CRC ст. байт

Slave→Master

0x01

0x06

0x00

0x01

0xFF

0xFF

0xD9

0xBA

0x01 Read Coil Status (Чтение значений из нескольких регистров флагов)[править | править код]

Тип адресации 0x

Запрос:

Состоит из адреса флага и количества считываемых флагов. Адресация флагов начинается с 0, количество флагов с 1.

Ответ:

Значение флагов передается в одном бите в поле «Данные». Трактовка флагов: 1 = ON; 0 = OFF. 0-й бит первого байта данных содержит значение флага указанного в поле «Адрес». Если запросить состояние одного флага, то в младшем бите будет возвращено значение флага, а все остальные старшие биты заполнены нулями.

Ниже приведены примеры запроса ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7). В примере запрашивается состояние 9 флагов с адреса 1. В ответе содержится 2 байта данных, для большей ясности будем считать что все запрашиваемые флаги находятся в состоянии ON, а все остальные в состоянии OFF.

Таблица 3-8. Пример чтения значения из одного регистра флагов

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Кол. флагов ст. байт 05 Кол. флагов мл. байт 06 CRC мл. байт 07 CRC ст. байт

Master→Slave

0x01

0x01

0x00

0x01

0x00

0x09

0x

0x

Таблица 3-9. Пример ответа на запрос чтения значения из одного регистра флагов

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Количество байт 03 Данные (флаги 0-7) 04 Данные (флаги 8-15) 05 CRC мл. байт 06 CRC ст. байт

Slave→Master

0x01

0x01

0x02

0xFF

0x01

0x

0x

0x0F Force Multiple Coils (Запись значений в несколько регистров флагов)[править | править код]

Тип адресации 0x

Команда:

Состоит из адреса флага, количества изменяемых флагов, количества передаваемых байт устанавливаемых значений. Адресация флагов начинается с 0, количество флагов с 1. Устанавливаемые значения передаются начиная с байта, в котором находится младшим битом значение, устанавливаемое по адресу указываемому в поле «00 адрес подчиненного устройства».

Ответ:

Состоит из начального адреса флага и количества записанных флагов. Адресация флагов начинается с 0, количество флагов с 1.

Ниже приведены примеры команды ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7).

Таблица 3-7. Пример команды записи значения в один из регистр флагов

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Количество флагов ст. байт 05 Количество флагов мл. байт 06 Количество байт данных 07 Данные (значения для флагов биты 0-7) 08 Данные (значения для флагов биты 8-15) 09 CRC мл. байт 0A CRC ст. байт

Master→Slave

0x01

0x0F

0x00

0x13

0x00

0x0A

0x02

0xCD

0x01

0x72

0xCB

Таблица 3-7. Пример команды записи значения в один из регистр флагов

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Количество флагов ст. байт 05 Количество флагов мл. байт 05 CRC мл. байт 06 CRC ст. байт

Slave→Master

0x01

0x0F

0x00

0x13

0x00

0x0A

0x24

0x09

0x05 Force Single Coil (Запись значения в один флаг регистра флагов)[править | править код]

Команда:

Состоит из адреса флага и устанавливаемого значения. Поле «Значение флага мл. байт» всегда равно нулю (0x00), поле «Значение флага ст. байт» принимает значения 0xFF если флаг устанавливается в «1»(ON) или 0x00 если флаг устанавливается в «0»(OFF), другие значения недопустимы и не влияют на значение флага. Адресация флагов начинается с 0.

Ответ:

Состоит из начального адреса флага и количества записанных флагов. Адресация флагов начинается с 0, количество флагов с 1.

Ниже приведены примеры команды ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7).

Таблица 4-4. Пример: команда установки значения в один флаг

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Значение флага ст. байт 05 Значение флага мл. байт 06 CRC мл. байт 07 CRC ст. байт

Master→Slave

0x01

0x05

0x00

0x13

0xFF

0x00

0x7D

0xFF

Таблица 4-4. Пример: Ответ на команду установки значения в один флаг

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Значение флага ст. байт 05 Значение флага мл. байт 06 CRC мл. байт 07 CRC ст. байт

Slave→Master

0x01

0x05

0x00

0x13

0xFF

0x00

0x7D

0xFF

0x50 Set date and time (Установка даты и времени)[править | править код]

Ниже приведены примеры команда ведущего устройства (таблица 5-4) и ответ ведомого (таблица 5-5):

Таблица 5-4. Пример установки даты и времени

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Час [0..23] 03 Минута [0..59] 04 Секунды [0..59] 05 День [1..31] 06 Месяц [1..12] 07 Год [0..99] 08 Столетие [19-20] 09 CRC мл. байт 10 CRC ст. байт

Master→Slave

0x01

0x50

0x0A

0x01

0x00

0x01

0x0A

0x02

0x14

0x89

0x1C

Таблица 5-5. Ответ на команду установки даты и времени

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Час [0..23] 03 Минута [0..59] 04 Секунды [0..59] 05 День [1..31] 06 Месяц [1..12] 07 Год [0..99] 08 Столетие [19-20] 09 CRC мл. байт 10 CRC ст. байт

Slave→Master

0x01

0x50

0x0A

0x01

0x00

0x01

0x0A

0x02

0x14

0x89

0x1C

Ссылки на используемые в статье источники[править | править код]

  • Modbus-IDA некоммерческая организация, которая поддерживает данный протокол
  • Оригинальные спецификации протокола на английском языке
  • Введение в Modbus протокол
  • Описание стандартного описания протокола ModBus на английском языке
  • Реализация протокола Modicon Modbus RTU (Комплекс программ «ЗОНД»)
  • Linux C Programming Examples
  • Как Modbus работает
  • Программа испытания Modbus Simply Modbus
  • Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc.
  • FreeModbus ASCII/RTU и tcp для microcontrollers
  • Бесплатное программа для теста устройств Modbus RTU
  • форум по настройки Modbus

Modbus — открытый коммуникационный протокол, основанный на архитектуре «клиент-сервер». Широко применяется в промышленности для организации связи между электронными устройствами. Может использовать для передачи данных через последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (Modbus TCP).

Не следует путать MODBUS и MODBUS Plus. MODBUS Plus — проприетарный протокол принадлежащий Schneider Electric. Физический уровень уникальный, похож на Ethernet 10BASE-T, полудуплекс по одной витой паре, скорость 1Мбит/с. Транспортный протокол — HDLC, поверх которого специфицировано расширение для передачи MODBUS PDU.

Содержание

  • 1 История
  • 2 Стандарт MODBUS
    • 2.1 Специфическая терминология
    • 2.2 Состав стандарта
    • 2.3 Достоинства стандарта
    • 2.4 Недостатки стандарта
  • 3 Введение
  • 4 Категории кодов функций
  • 5 Модель данных
  • 6 Стандартные функции протокола Modbus
    • 6.1 Чтение данных
    • 6.2 Запись одного значения
    • 6.3 Запись нескольких значений
  • 7 Контроль ошибок в протоколе Modbus RTU
    • 7.1 RTU фрейм
    • 7.2 Логические ошибки
      • 7.2.1 Стандартные коды ошибок
  • 8 Примечания
  • 9 Ссылки на используемые в статье источники
  • 10 Учебные материалы
  • 11 Утилиты

[править] История

Modbus был разработан компанией Modicon (в настоящее время принадлежит Schneider Electric) для использования в её контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году.[1] Это был открытый стандарт, описывающий формат сообщений и способы их передачи в сети состоящей из различных электронных устройств.

Первоначально контроллеры MODICON использовали последовательный интерфейс RS-232.[1] Позднее стал применяться интерфейс RS-485, так как он обеспечивает более высокую надёжность, позволяет использовать более длинные линии связи и подключать к одной линии несколько устройств.

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

[править] Стандарт MODBUS

В настоящее время развитием Modbus занимается некоммерческая организация Modbus-IDA[2].

[править] Специфическая терминология

  • PDU (Protocol Data Unit) — общая для всех физических уровней часть пакета MODBUS. Включает в себя код функции и данные пакета.
  • ADU (Application Data Unit) — полный пакет MODBUS. Включает в себя специфичную для физического уровня часть пакета и PDU.

MODBUS специфицирует 4 типа данных:

  • Discrete Inputs — однобитовый тип, доступен только на чтение.
  • Coils — однобитовый тип, доступен на чтение и на запись.
  • Input Registers — 16-битовый знаковый или беззнаковый тип, доступен только на чтение.
  • Holding Registers — 16-битовый знаковый или беззнаковый тип, доступен на чтение и на запись.

[править] Состав стандарта

Стандарты MODBUS состоят из 3 частей:

  • Документ Modbus Application Protocol содержит спецификацию прикладного уровня сетевой модели OSI:
    • Элементарный пакет протокола, так называемый PDU (Protocol Data Unit), он един для всех физических уровней. PDU упаковывается в индивидуальный для каждого транспорта application data unit (ADU).
    • Коды функций и состав PDU для каждого кода.
  • Документ Modbus over serial line содержит спецификацию канального и физического уровней сетевой модели OSI для физических уровней RS485 и RS232. В принципе может использоваться любой физический уровень основанный на асинхронном приемопередатчике.
  • Документ MODBUS Messaging on TCP/IP Implementation Guide содержит спецификацию ADU для транспорта через TCP/IP стек.

[править] Достоинства стандарта

Основные достоинства стандарта — открытость и массовость. Огромное количество датчиков и исполнительных устройств выпущено промышленностью. Практически все промышленные системы контроля и управления имеют программные драйвера для работы с MODBUS сетями.

[править] Недостатки стандарта

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

  • Стандарт специфицирует метод передачи только двух типов данных. Отсутствие четкого указания в стандарте привело к тому что с другими типами данных сторонние производители MODBUS-решений поступали по своему усмотрению. Разброд де-факто в этом вопросе не позволил впоследствии сделать уточнения в официальном документе: это вызвало бы всплеск недовольства производителей и возможную войну форматов.
  • Стандарт не позволяет никакой оперативной сигнализации от конечного устройства к мастеру в случае необходимости (прерывания). Нужно ждать своей очереди в опросе. Это существенно ограничивает применимость MODBUS-решений в системах управления реального времени.
  • Стандарт не позволяет конечным устройствам обмениваться фиксированными данными друг с другом без участия мастера. Это существенно ограничивает применимость MODBUS-решений в системах регулирования реального времени.
  • Стандарт не предлагает никаких решений по начальной инициализации системы. Назначение сетевых адресов и прописывание в системе параметров каждого конкретного устройства выполняются вручную.

[править] Введение

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

Обычно в сети есть только один клиент, так называемое, «главное» (англ. master) устройство, и несколько серверов — «подчиненных» (slaves) устройств. Главное устройство инициирует транзакции (передаёт запросы). Главный может адресоваться индивидуально к подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчиненное устройство отвечает на запрос, адресованный именно ему. При получении широковещательного запроса ответ не формируется.

Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1…127. Диапазон значений 128…255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.

Modbus PDU

номер функции данные
1 байт N < 253 (байт)

Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи.

Существуют три основных реализации протокола Modbus, две для передачи данных по последовательным линиям связи, как медным EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так и оптическим и радио:

  • Modbus ASCII — для обмена используются только ASCII символы. Для проверки целостности используется алгоритм en:Longitudinal redundancy check. Сообщение разделяется на столбцы с помощью символа «:» и заканчивается символами новой строки CR/LF.
  • Modbus RTU

и для передачи данных по сетям Ethernet поверх TCP/IP:

  • Modbus TCP.

Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):

адрес ведомого устройства номер функции данные блок обнаружения ошибок

где

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

Максимальный размер ADU для последовательных сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт.

Для Modbus TCP ADU выглядит следующим образом:

ID транзакции ID протокола длина пакета адрес ведомого устройства код функции данные

где

  • ID транзакции — два байта, обычно нули
  • ID протокола — два байта, нули
  • длина пакета — два байта, старший затем младший, длина следующей за этим полем части пакета
  • адрес ведомого устройства — адрес подчинённого устройства, к которому адресован запрос. Обычно игнорируется, если соединение установлено с конкретным устройством. Может использоваться, если соединение установлено с бриджем, который выводит нас, например, в сеть RS485.

Поле контрольной суммы в Modbus TCP отсутствует.

[править] Категории кодов функций

В действующей в настоящее время спецификации протокола определяются три категории кодов функций:

Стандартные команды 
Их описание должно быть опубликовано и утверждено Modbus-IDA. Эта категория включает в себя как уже определенные, так и свободные в настоящее время коды.
Пользовательские команды 
Два диапазона кодов (от 65 до 72 и от 100 до 110), для которых пользователь может реализовать произвольную функцию. При этом не гарантируется, что какое-то другое устройство не будет использовать тот же самый код для выполнения другой функции.
Зарезервированные 
В эту категорию входят коды функций, не являющиеся стандартными, но уже используемые в устройствах, производимых различными компаниями. Это коды 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.

[править] Модель данных

Одно из типичных применений протокола — чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре таблицы данных:

Таблица Тип элемента Тип доступа
Дискретные входы (Discrete Inputs) один бит только чтение
Регистры флагов (Coils) один бит чтение и запись
Регистры ввода (Input Registers) 16-битное слово только чтение
Регистры хранения (Holding Registers) 16-битное слово чтение и запись

Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы, В этом случае команды работающие с дискретными данными и с 16-битными регистрами будут фактически обращаться к одним и тем же данным.

Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.

[править] Стандартные функции протокола Modbus

PDU запроса и ответа для стандартных функций

номер
функции
запрос/ответ
1 (0x01) A1 A0 Q1 Q0
N D (N байт)
2 (0x02) A1 A0 Q1 Q0
N D (N байт)
3 (0x03) A1 A0 Q1 Q0
N D (N байт)
4 (0x04) A1 A0 Q1 Q0
N D (N байт)
5 (0x05) A1 A0 D1 D0
A1 A0 D1 D0
6 (0x06) A1 A0 D1 D0
A1 A0 D1 D0
15 (0x0F) A1 A0 Q1 Q0 N D (N байт)
A1 A0 Q1 Q0
16 (0x10) A1 A0 Q1 Q0 N D (N байт)
A1 A0 Q1 Q0
  • A1 и A0 — адрес элемента,
  • Q1 и Q0 — количество элементов,
  • N — количество байт данных
  • D — данные

[править] Чтение данных

Для чтения значений из перечисленных выше таблиц данных используются функции с кодами 1—4 (шестнадцатеричные значения 0x01—0x04):

  • 1 (0x01) — чтение значений из нескольких регистров флагов (Read Coil Status)
  • 2 (0x02) — чтение значений из нескольких дискретных входов (Read Discrete Inputs)
  • 3 (0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers)
  • 4 (0x04) — чтение значений из нескольких регистров ввода (Read Input Registers)

Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым.

В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.

Значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым:

байт 1 байт 2 байт 3 байт 4 байт N-1 байт N
RA,1 RA,0 RA+1,1 RA+1,0 RA+Q-1,1 RA+Q-1,0

Значения флагов и дискретных входов передаются в упакованном виде: по одному биту на флаг. Единица означает включённое состояние, ноль — выключенное. Значения запрошенных флагов заполняют сначала первый байт, начиная с младшего бита, затем следующие байты, также от младшего бита к старшим. Младший бит первого байта данных содержит значение флага, указанного в поле «адрес». Если запрошено количество флагов, не кратное восьми, то значения лишних битов заполняются нулями:

байт 1 байт N
FA+7 FA+6 FA+5 FA+4 FA+3 FA+2 FA+1 FA 0 0 FA+Q-1 FA+Q-2

[править] Запись одного значения

  • 5 (0x05) — запись значения одного флага (Force Single Coil)
  • 6 (0x06) — запись значения в один регистр хранения (Preset Single Register)

Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта).

Для регистра хранения значение является просто 16-битным словом.

Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы.

Если команда выполнена успешно, ведомое устройство возвращает копию запроса.

[править] Запись нескольких значений

  • 15 (0x0F) — запись значений в несколько регистров флагов (Force Multiple Coils)
  • 16 (0x10) — запись значений в несколько регистров хранения (Preset Multiple Registers)

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

Ответ состоит из начального адреса и количества изменённых элементов.

Ниже приведён пример команды ведущего устройства и ответа ведомого (для Modbus RTU).

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Количество флагов ст. байт 05 Количество флагов мл. байт 06 Количество байт данных 07 Данные ст. байт 08 Данные мл. байт 09 CRC мл. байт 0A CRC ст. байт

Master→Slave

0x01

0x0F

0x00

0x13

0x00

0x0A

0x02

0xCD

0x01

0xCB

0x72

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Количество флагов ст. байт 05 Количество флагов мл. байт 05 CRC мл. байт 06 CRC ст. байт

Slave→Master

0x01

0x0F

0x00

0x13

0x00

0x0A

0x09

0x24

[править] Контроль ошибок в протоколе Modbus RTU

Во время обмена данными могут возникать ошибки двух типов:

  • ошибки, связанные с искажениями при передаче данных;
  • логические ошибки.

Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001). При этом младший байт передается первым, в отличие от байтов адреса и значения регистра в PDU

[править] RTU фрейм

В RTU режиме сообщение должно начинаться и заканчиваться интервалом тишины — временем передачи не менее 3,5 символов при данной скорости в сети. Первым полем затем передаётся адрес устройства.

Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3,5 символов. Новое сообщение может начинаться после этого интервала.

Фрейм сообщения передаётся непрерывно. Если интервал тишины продолжительностью 1,5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный.

Таким образом, новое сообщение должно начинаться не раньше 3,5 интервала, так как в этом случае устанавливается ошибка.

Немного об интервалах (речь идёт о Serial Modbus RTU): при скорости 9600 и 11 битах в кадре (стартовый бит + 8 бит данных + бит контроля чётности + стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), то есть более 4 мс; 1.5 * 11 / 9600 = 0,00171875, то есть более 1 мс. Для скоростей более 19200 бод допускается использовать интервалы 1,75 и 0,75 мс соответственно.

[править] Логические ошибки

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

1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.

2. Если Slave не принимает какого-либо значения, никакого ответа не отправляется. Master диагностирует ошибку по тайм-ауту.

3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по тайм-ауту.

4. Если Slave принимает запрос, но не может его обработать (обращение к несуществующему регистру и т. д.), отправляется ответ содержащий в себе данные об ошибке.

Таблица 2-1. Кадр ответа (Slave→Master) при возникновении ошибки modbus RTU

Направление передачи адрес подчинённого устройства номер функции данные (или код ошибки) CRC

Запрос (Master→Slave)

0x01

0x77

0xDD

0xC7 0xA9

Ответ (Slave→Master)

0x01

0xF7

0xEE

0xE6 0x7C

[править] Стандартные коды ошибок

  • 01 — Принятый код функции не может быть обработан на подчиненном.
  • 02 — Адрес данных, указанный в запросе, не доступен данному подчиненному.
  • 03 — Величина, содержащаяся в поле данных запроса, является недопустимой величиной для подчиненного.
  • 04 — Невосстанавливаемая ошибка имела место, пока подчиненный пытался выполнить затребованное действие.
  • 05 — Подчиненный принял запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет главного от генерации ошибки тайм-аута.
  • 06 — Подчиненный занят обработкой команды. Главный должен повторить сообщение позже, когда подчиненный освободится.
  • 07 — Подчиненный не может выполнить программную функцию, принятую в запросе. Этот код возвращается для неудачного программного запроса, использующего функции с номерами 13 или 14. Главный должен запросить диагностическую информацию или информацию об ошибках с подчиненного.
  • 08 — Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. Главный может повторить запрос, но обычно в таких случаях требуется ремонт.

[править] Примечания

  1. 1 2 Modbus interface tutorial
  2. About Modbus-IDA

[править] Ссылки на используемые в статье источники

  • Modbus-IDA некоммерческая организация, которая поддерживает данный протокол
  • Оригинальные спецификации протокола на английском языке
  • Modbus Specifications and Implementation Guides (ModBus TCP\IP)
  • Введение в Modbus протокол
  • Библиотека для работы с протоколом modbus в GNU/Linux
  • Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc.

[править] Учебные материалы

  • Обучающие материалы
  • Как Modbus работает

[править] Утилиты

  • OPC серверы для работы с протоколом Modbus
  • Реализация протокола на языке LabVIEW — библиотека Vi
  • Утилита опроса и записи данных по протоколу Modbus RTU/ASCII — некорректно формирует запросы по TCP/IP (не по Modbus TCP\IP Specifications and Implementation)
  • modpoll (Master) (win32, linux, solaris, qnx6) — Бесплатная консольная утилита опроса и записи данных по протоколу Modbus RTU/ASCII/TCP\IP; достаточно удобная, но код выхода программы (при правильных параметрах) всегда 0 (версия 2.4.0) даже если Slave вернул код ошибки на запрос (обещано исправить в след релизе).
  • OSM Modbus terminal — бесплатная утилита для работы с регистрами Modbus (карта регистров)
  • PeakHMI MODBUS TCP/IP Slave simulator (Win GUI) — бесплатная и очень удобная утилита, симулятор ModBus TCP/IP Slave
  • Simply Modbus — программа испытания Modbus.
  • rmodbus — свободная реализация протокола на Ruby.
  • Сторож — гибкая система диспетчеризации под Linux с поддержкой протокола MODBUS.
  • FreeModbus — ASCII/RTU и TCP для микроконтроллеров
  • pymodbus — модуль modbus для языка python

п·о·р

UART

Физические уровни
Точка-точка токовая петля • RS-232 • IrDA • HART • модем
Сетевые RS-422 • RS-423 • RS-485 • LIN
Специальные en:Kansas City Standard (Компакт-кассета, грампластинка).
Протоколы
Точка-точка PPP • SLIP • IrDA • HART
Сетевые Modbus • LIN • DMX-512 • P-NET • Profibus
Сферы использования Последовательный порт • IrDA
Реализации 8250 UART • 16550 UART

5. Modbus

Протокол Modbus и сеть Modbus являются самыми распространенными в мире. Несмотря на свой возраст (стандартом де-факто Modbus стал еще в 1979 году), Modbus не только не устарел, но, наоборот, существенно возросло количество новых разработок и объем организационной поддержки этого протокола. Миллионы Modbus-устройств по всему миру продолжают успешно работать, а последняя версия описания протокола появилась в декабре 2006 г.

Одним из преимуществ Modbus является отсутствие необходимости в специальных интерфейсных контроллерах (Profibus и CAN требуют для своей реализации заказные микросхемы), простота программной реализации и элегантность принципов функционирования. Все это снижает затраты на освоение стандарта как системными интеграторами, так и разработчиками контроллерного оборудования. Высокая степень открытости протокола обеспечивается также полностью бесплатными текстами стандартов, которые можно скачать с сайта www.modbus.org.

В России Modbus по распространенности конкурирует только с Profibus. Популярность протокола в настоящее время объясняется, прежде всего, совместимостью с большим количеством оборудования, которое имеет протокол Modbus. Кроме того, Modbus имеет высокую достоверность передачи данных, связанную с применением надежного метода контроля ошибок. Modbus позволяет унифицировать команды обмена благодаря стандартизации номеров (адресов) регистров и функций их чтения-записи.

Основным недостатком Modbus является сетевой обмен по типу «ведущий/ведомый», что не позволяет ведомым устройствам передавать данные по мере их появления и поэтому требует интенсивного опроса ведомых устройств ведущим.

Разновидностями Modbus являются протоколы Modbus Plus – многомастерный протокол с кольцевой передачей маркера и Modbus TCP, рассчитанный на использование в сетях Ethernet и интернет.

Протокол Modbus имеет два режима передачи: RTU (Remote Terminal Unit – «удаленное терминальное устройство») и ASCII. Стандарт предусматривает, что режим RTU в протоколе Modbus должен присутствовать обязательно, а режим ASCII является опционным. Пользователь может выбирать любой из них, но все модули, включенные в сеть Modbus, должны иметь один и тот же режим передачи.

Мы рассмотрим только протокол Modbus RTU, поскольку Modbus ASCII в России практически не используется. Отметим, что Modbus ASCII нельзя путать с частно-фирменным протоколом DCON, который используется в модулях фирм Advantech и ICP DAS и не соответствует стандарту Modbus.

Стандарт Modbus предусматривает применение физического интерфейса RS-485, RS-422 или RS-232. Наиболее распространенным для организации промышленной сети является 2-проводной интерфейс RS-485. Для соединений точка-точка может быть использован интерфейс RS-232 или RS-422.

В стандарте Modbus имеются обязательные требования, рекомендуемые и опционные (необязательные). Существует три степени соответствия стандарту: «полностью соответствует» – когда протокол соответствует всем обязательным и всем рекомендуемым требованиям, «условно соответствует» – когда протокол соответствует только обязательным требованиям и не соответствует рекомендуемым, и «не соответствует».

Модель OSI протокола Modbus содержит три уровня: физический, канальный и прикладной.

Физический уровень. В новых разработках на основе Modbus стандарт рекомендует использовать интерфейс RS-485 с двухпроводной линией передачи, но допускается применение четырехпроводной линии и интерфейса RS-232.

Modbus-шина должна состоять из одного магистрального кабеля, от которого могут быть сделаны отводы. Магистральный кабель Modbus должен содержать 3 проводника в общем экране, два из которых представляют собой витую пару, а третий соединяет общие («земляные») выводы всех интерфейсов RS-485 в сети. Общий провод и экран должны быть заземлены в одной точке, желательно около ведущего устройства.

Устройства могут подключаться к кабелю тремя способами: непосредственно к магистральному кабелю; через пассивный разветвитель (тройник); через активный разветвитель (содержащий развязывающий повторитель интерфейса).

В документации на устройство и на тройник должны быть указаны наименования подключаемых цепей.

На каждом конце магистрального кабеля должны быть установлены резисторы для согласования линии передачи, как это требуется для интерфейса RS-485. В отличие от физического интерфейса RS-485, в котором терминальные резисторы на низких скоростях обмена можно не использовать, стандарт на протокол Modbus формально требует применения терминальных резисторов для всех скоростей обмена. Их номинал может быть равным 150 Ом и мощность 0.5 Вт. Стандарт требует, чтобы в руководствах по эксплуатации устройств Modbus было сказано, имеются ли указанные резисторы внутри устройства, или их необходимо устанавливать при монтаже сети. Если требуются внешние резисторы, то они должны иметь номинал в интервале от 450 до 650 Ом и быть установлены только в одном месте в пределах каждого сегмента сети (сегментами считаются части сети между повторителями интерфейса).

Modbus-устройство обязательно должно поддерживать скорости обмена 9600 бит/с и 19200 бит/с, из них 19200 бит/с устанавливается «по умолчанию». Допускаются также скорости 1200, 2400, 4800,…,38400 бит/с, 65 кбит/с, 115 кбит/с,… .

Скорость передачи должна выдерживаться в передатчике с погрешностью не хуже 1%, а приемник должен принимать данные при отклонении скорости передачи до 2%.

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

Максимальная длина магистрального кабеля при скорости передачи 9600 бит/с и сечении жил более 0.13 кв. мм (AWG26) составляет 1 км. Отводы от магистрального кабеля не должны быть длиннее 20 м. При использовании многопортового пассивного разветвителя с N отводами длина каждого отвода не должна превышать значения 40 м/N.

Modbus не устанавливает конкретных типов разъемов, но если используются разъемы RJ45, mini-DIN или D-Shell, они должны быть экранированными, а цоколевки должны соответствовать стандарту.

Для минимизации ошибок при монтаже рекомендуется использовать провода следующих цветов: желтый – для положительного вывода RS-485 (на котором устанавливается логическая «1», когда через интерфейс выводится логическая «1»); коричневый – для второго вывода интерфейса RS-485; серый – для общего провода.

Типовым сечением кабеля является AWG 24 (0.2 кв. мм, диаметр провода 0.51 мм). При использовании кабеля категории 5 его длина не должна превышать 600 м. Волновое сопротивление кабеля желательно выбирать более 100 Ом, особенно для скорости обмена более 19200 бит/с.

Канальный уровень. Протокол Modbus предполагает, что только одно ведущее устройство (контроллер) и до 247 ведомых (модулей ввода-вывода) могут быть объединены в промышленную сеть. Обмен данными всегда инициируется ведущим. Ведомые устройства никогда не начинают передачу данных, пока не получат запрос от ведущего. Ведомые устройства также не могут обмениваться данными друг с другом. Поэтому в любой момент времени в сети Modbus может происходить только один акт обмена.

Адреса с 1 по 247 являются адресами Modbus устройств в сети, а с 248 по 255 зарезервированы. Ведущее устройство не должно иметь адреса и в сети не должно быть двух устройств с одинаковыми адресами.

Ведущее устройство может посылать запросы всем устройствам одновременно («широковещательный режим») или только одному. Для широковещательного режима зарезервирован адрес «0» (при использовании в команде этого адреса она принимается всеми устройствами сети).

Описание кадра (фрейма) протокола Modbus. В протоколе Modbus RTU сообщение начинает восприниматься как новое после паузы (тишины) на шине длительностью не менее 3.5 символов (14 бит), т.е. величина паузы в секундах зависит от скорости передачи.

Формат кадра протокола Modbus RTU.

Формат кадра протокола Modbus RTU; PDU – «Protocol Data Unit» – «элемент данных протокола»; ADU – «Application Data Unit» – «элемент данных приложения».

Формат кадра показан на рисунке выше. Поле адреса всегда содержит только адрес ведомого устройства, даже в ответах на команду, посланную ведущим. Благодаря этому ведущее устройство знает, от какого модуля пришел ответ.

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

Поле «Данные» может содержать произвольное количество байт. В нем может содержаться информация о параметрах, используемых в запросах контроллера или ответах модуля.

Поле «Контрольная сумма» содержит контрольную сумму CRC длиной 2 байта.

Структура данных в режиме RTU. В режиме RTU данные передаются младшими разрядами вперед. По умолчанию в RTU режиме бит паритета устанавливают равным 1, если количество двоичных единиц в байте нечетное, и равным 0, если оно четное. Такой паритет называют четным (even parity) и метод контроля называют контролем четности.

При четном количестве двоичных единиц в байте бит паритета может быть равен 1. В этом случае говорят, что паритет является нечетным (odd parity).

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

Ведомые устройства могут воспринимать любой из вариантов: четный, нечетный паритет или его отсутствие.

Структура Modbus RTU сообщения. Сообщения Modbus RTU передаются в виде кадров, для каждого из которых известно начало и конец. Признаком начала кадра является пауза (тишина) продолжительностью не менее 3.5 шестнадцатеричных символов (14 бит). Кадр должен передаваться непрерывно. Если при передаче кадра обнаруживается пауза продолжительностью более 1.5 шестнадцатеричных символа (6 бит), то считается, что кадр содержит ошибку и должен быть отклонен принимающим модулем. Эти величины пауз должны строго соблюдаться при скоростях ниже 19200 бит/с, однако при более высоких скоростях рекомендуется использовать фиксированные значения паузы, 1.75 мс и 750 мкс соответственно.

Контроль ошибок. В режиме RTU имеется два уровня контроля ошибок в сообщении: контроль паритета для каждого байта (опционно); контроль кадра в целом с помощью CRC метода.

CRC метод используется независимо от проверки паритета. Значение CRC устанавливается в ведущем устройстве перед передачей. При приеме сообщения вычисляется CRC для всего сообщения и сравнивается с его значением, указанным в поле CRC кадра. Если оба значения совпадают, считается, что сообщение не содержит ошибки.

Стартовые, стоповые биты и бит паритета в вычислении CRC не участвуют.

Прикладной уровень. Прикладной уровень Modbus RTU обеспечивает коммуникацию между устройствами типа «ведущий/ведомый». Прикладной уровень является независимым от физического и канального, в частности, он может использовать протоколы Ethernet TCP/IP (Modbus TCP/IP), Modbus Plus (многомастерная сеть с передачей маркера), интерфейсы RS-232, RS-422, RS-485, оптоволоконные, радиоканалы и другие физические среды для передачи сигналов.

Прикладной уровень Modbus основан на запросах с помощью кодов функций. Код функции указывает ведомому устройству, какую операцию оно должно выполнить.

При использовании протокола прикладного уровня с различными протоколами транспортного и канального уровня сохраняется неизменным основной блок Modbus-сообщения, включающий код функции и данные (этот блок называется PDU – «Protocol Data Unit» – «элемент данных протокола»). К блоку PDU могут добавляться дополнительные поля при использовании его в различных промышленных сетях и тогда он называется «ADU» – «Application Data Unit» – «элемент данных приложения».

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

Коды функций являются числами в диапазоне от 1 до 127. Коды в диапазоне от 65 до 72 и от 100 до 110 относятся к задаваемым пользователем функциям, в диапазоне от 128 до 255 зарезервированы для пересылки кодов ошибок в ответном сообщении. Код «0» не используется.

Коды ошибок используются ведомым устройством, чтобы определить, какое действие предпринять для их обработки. Значения кодов и их смысл описаны в стандарте на Modbus RTU.

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

Если ведомый нормально выполнил принятую от ведущего функцию, то в ответе поле «код функции» содержит ту же информацию, что и в запросе. В противном случае ведомый выдает код ошибки. В случае ошибки код функции в ответе равен коду функции в запросе, увеличенному на 128.

Содержание поля данных. В сообщении ведущего устройства ведомому поле данных содержит дополнительную информацию, необходимую для выполнения указанной функции. Например, если код функции указывает, что необходимо считать данные из группы регистров устройства ввода (код функции 03 hex), то поле данных содержит адрес начального регистра и количество регистров. Если ведущее устройство посылает команду записи данных в группу регистров (код функции 10 hex), то поле данных должно содержать адрес начального регистра, количество регистров, количество байтов данных и данные для записи в регистр.

Конкретное содержание поля данных устанавливается стандартом для каждой функции отдельно.

Описание протокола Modbus RTU

Сообщение Modbus RTU состоит из адреса устройства SlaveID, кода функции, специальных данных в зависимости от кода функции и CRC контрольной суммы.

SlaveID Код функции Специальные данные CRC

Если отбросить SlaveID адрес и CRC контрольную сумму, то получится PDU, Protocol Data Unit. SlaveID – это адрес устройства, может принимать значение от 0 до 247, адреса с 248 до 255 зарезервированы. Данные в модуле хранятся в 4 таблицах. Две таблицы доступны только для чтения и две для чтения-записи. В каждой таблице помещается 9999 значений.

Номер регистра Адрес регистра HEX Тип Название Тип
1-9999 0000 до 270E Чтение-запись Discrete Output Coils DO
10001-19999 0000 до 270E Чтение Discrete Input Contacts DI
30001-39999 0000 до 270E Чтение Analog Input Registers AI
40001-49999 0000 до 270E Чтение-запись Analog Output Holding Registers AO

В сообщении Modbus используется адрес регистра. Например, первый регистр AO Holding Register, имеет номер 40001, но его адрес равен 0000. Разница между этими двумя величинами есть смещение offset. Каждая таблица имеет свое смещение, соответственно: 1, 10001, 30001 и 40001. Ниже приведен пример запроса Modbus RTU для получения значения AI аналогового выхода (holding registers) из регистров от #40108 до 40110 с адресом устройства 17.

11 03 006B 0003 7687

Регистр аналогового выхода AO0 имеет значение AE 41 HEX или 44609 в десятичной системе.

Регистр аналогового выхода AO1 имеет значение 56 52 HEX или 22098 в десятичной системе.

Регистр аналогового выхода AO2 имеет значение 43 40 HEX или 17216 в десятичной системе.

Значение AE 41 HEX — это 16 бит 1010 1110 0100 0001, может принимать различное значение, в зависимости от типа представления.

Значение регистра 40108 при комбинации с регистром 40109 дает 32 бит значение.

Пример представления.

Приведем таблицу с кодами функций чтения и записи регистров Modbus RTU.

Эта команда используется для чтения значений дискретных выходов DO.

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

Значения DO в ответе находятся в одном байте и соответствуют значению битов.

Значения битов определяются как 1 = ON и 0 = OFF.

Младший бит первого байта данных содержит значение DO адрес которого указывался в запросе. Остальные значения DO следуют по нарастающей к старшему значению байта. Т.е. справа на лево.

Если запрашивалось меньше восьми значений DO, то оставшиеся биты в ответе будут заполнены нулями (в направлении от младшего к старшему байту). Поле Byte Count Количество байт далее указывает количество полных байтов данных в ответе.

Пример запроса DO с 20 по 56 для SlaveID адреса устройства 17. Адрес первого регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса (0014 hex = 20, -1 смещение нуля = получаем 0013 hex = 19).

Состояния выходов DO 27-20 показаны как значения байта CD hex, или в двоичной системе 1100 1101.

В регистре DO 56-52 5 битов справа были запрошены, а остальные биты заполнены нулями до полного байта (0001 1011).

Эта команда используется для чтения значений дискретных входов DI.

Пример запроса DI с регистров от #10197 до 10218 для SlaveID адреса устройства 17. Адрес первого регистра будет 00C4 hex = 196, т.к. счет ведется с 0 адреса.

Эта команда используется для чтения значений аналоговых выходов AO.

Пример запроса AO с регистров от #40108 до 40110 для SlaveID адреса устройства 17. Адрес первого регистра будет 006B hex = 107, т.к. счет ведется с 0 адреса.

Эта команда используется для чтения значений аналоговых входов AI.

Пример запроса AI с регистра #30009 для SlaveID адреса устройства 17. Адрес первого регистра будет 0008 hex = 8, т.к. счет ведется с 0 адреса.

Эта команда используется для записи одного значения дискретного выхода DO.

Значение FF 00 hex устанавливает выход в значение включен ON.

Значение 00 00 hex устанавливает выход в значение выключен OFF.

Все остальные значения недопустимы и не будут влиять значение на выходе.

Нормальный ответ на такой запрос — это эхо (повтор запроса в ответе), возвращается после того, как состояние DO было изменено.

Пример записи в DO с регистром #173 для SlaveID адреса устройства 17. Адрес регистра будет 00AC hex = 172, т.к. счет ведется с 0 адреса.

Состояние выхода DO173 поменялось с выключен OFF на включен ON.

Эта команда используется для записи одного значения аналогового выхода AO.

Пример записи в AO с регистром #40002 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 hex = 1, т.к. счет ведется с 0 адреса.

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

Пример записи в несколько DO с регистрами от #20 до #29 для SlaveID адреса устройства 17. Адрес регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса.

В ответе возвращается количество записанных регистров.

Эта команда используется для записи нескольких значений аналогового выхода AO.

Пример записи в несколько AO с регистрами #40002 и #40003 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 hex = 1, т.к. счет ведется с 0 адреса.

Если устройство получило запрос, но запрос не может быть обработан, то устройство ответит кодом ошибки.

Ответ будет содержать измененный Функциональный код, старший бит будет равен 1.

Понравилась статья? Поделить с друзьями:
  • Контроль датчика кислорода ошибка или не завершен
  • Контроль незакрытых ошибок пд текущего периода что это
  • Контроллер remak коды ошибок
  • Контроль над ошибками
  • Контроллер regin optigo ошибка al3