ЛикБез: Что такое ModBus RTU и ModBus TCP. Промышленный протокол ModBus

Интерфейс RS-48


Стандарт ANSI TIA/EIA-485, более известный как RS485, определяет сбалансированный способ надёжной передачи данных на длинные расстояния в условиях промышленных помех. Также стандарт определяет топологию сети и описывает способы согласования полного сопротивления линии интерфейса и предоставляет результаты лабораторных тестов.

Физически, интерфейс RS485 является дифференциальным, обеспечивает многоточечные соединения и позволяет передавать и принимать данные в обоих направлениях.

Упрощённо, сеть интерфейса RS485 представляет собой приемопередатчики, соединенные при помощи витой пары - двух скрученных проводов (см. рис. 2.1).


Типовая разница напряжений между линиями A и B передатчика равна 3В, минимальная 1.5В, максимальная 5В.

Разница напряжений между линиями A и B на приёмнике должна быть не менее 0.2В и абсолютная разница потенциалов относительно общего провода должно быть в диапазоне (-7…+12)В.

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

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

Существуют стандартные решения этой проблемы (R, RC - терминаторы). У любой линии связи есть такой параметр, как волновое сопротивление Zв. Оно зависит от характеристик используемого кабеля и не зависит от его длины. Для обычно применяемых в линиях связи витых пар волновое сопротивление Zв составляет (90-120) Ом. Рассмотрим варианты:

  1. Если на удаленном конце линии, между проводниками витой пары включить резистор с номинальным омическим сопротивлением равным волновому сопротивлению линии, то электромагнитная волна, дошедшая до ≪тупика≫ поглощается на таком резисторе. Отсюда его названия - согласующий резистор или ≪терминатор≫ . Помимо достоинств этого метода (повышение скорости, увеличение длины и подавление отражений), есть и недостатки (дополнительная нагрузка на драйверы повышает энергопотребление, остальные ответвления линии продолжают вносить искажения, драйвер приёмника находится в неоднозначном состоянии: либо режим ожидания, либо режим приёма).
  2. Если на удалённом конце вместо резистора установить RC цепочку R=(90-120) Ом, С=1000 пФ, то можно устранить проблему повышенного энергопотребления и проблему неопределённости драйвера приёмника (для приёмников с функциями open-line и failsafe). Но из-за постоянной времени RC цепи, максимальная скорость передачи и длинна линии будут меньшими.

Эффект отражения и необходимость правильного согласования накладывают ограничения на конфигурацию линии связи (топология сети). Линия связи должна представлять собой один кабель витой пары. К этому кабелю присоединяются все приемники и передатчики (гирлянда). Расстояние от линии до микросхем интерфейса RS485 должно быть как можно короче, так как длинные ответвления вносят рассогласование и вызывают отражения. В оба наиболее удаленных конца кабеля включают терминаторы. Калибр витой пары достаточно не более AWG24.


Следует также сказать, что к линии интерфейса все устройства подключаются через специализированные микросхемы (драйверы интерфейса RS485). Они могут быть разных производителей и с различными техническими параметрами и как следствие различной стоимости. Эти драйверы в значительной степени могут определять эксплуатационные свойства приборов: дальность передачи, количество приборов в одном участке сети и надёжность передачи.


Протокол MODBUS


MODBUS - это протокол уровня приложений (уровень 7 модели OSI), что обеспечивает связь между устройствами, соединёнными различными каналами связи и сетями.

Де-факто, MODBUS является стандартом в сетях промышленного назначения с 1979 года. Он обеспечивает связь миллионам устройств во всём мире, в том числе и через Интернет. Есть различные реализации протокола:

  • Для асинхронных беспроводных, оптических и проводных каналов связи (RS-232, RS-485, RS-422)
  • Для TCP/IP (порт 502) через интернет
  • MODBUS-PLUS - для высокоскоростных сетей с передачей меток (high speed token passing network)

Кроме того, разнородные участки сетей могут объединяться шлюзами (специальными конверторами).

Для асинхронных последовательных каналов связи существует две реализации MODBUS-SERIAL-LINE протокола МODBUS-RTU и MODBUS-ASCII (уровень 1 и 2 модели OSI). Разница между ними заключается в способе кодировки данных, способе синхронизации фреймов, и алгоритме обеспечения целостности данных. В нашем случае, в сети RS485 обмен данными реализован посредством протокола MODBUS-RTU. Далее по тексту будем рассматривать ситуацию только в этом аспекте.

MODBUS-SERIAL-LINE протокол - это протокол типа MASTER-SLAVE (протокол запросов-ответов). Ведущий в сети (MASTER) всегда один. Каждый подчинённый (SLAVE) должен иметь уникальный номер 1-247. Адрес 0 - это широковещательный запрос, адресованный сразу всем подчинённым. Таким образом, логически в одном участке сети может быть до 248 устройств (включая MASTER). Каждый запрос содержит код функции. Под MODBUS функциями понимают определённые сервисы предоставляемые подчинёнными ведущему. Таким образом, роль клиента играет MASTER, а роль сервера, с определённым набором функций-сервисов, SLAVE.


Функции протокола MODBUS


Каждый SLAVE может содержать уникальный набор функций-сервисов, но есть и ряд стандартных функций, которые подробно описаны в документе (www.modbus.org ). Также полезная информация может быть найдена в документе “MODBUS over serial line specification and implementation guide” (www.modbus.org ).

Поддерживаемые нами функции (см. табл. 4.1 - 4.2).



В более ранних версиях приборов (до 2010г) были реализованы лишь пользовательские функции, но со временем стало понятно, что для обеспечения совместного использования приборов с ПЛК (минуя ПК) необходимы и стандартные функции.

Будьте внимательны и обратите внимание на то, что стандартные функции оперируют только со словами (16-бит) и в формате big-endian, но при этом формат контрольной суммы CRC16 little-endian! Поэтому, для исключения разночтений в описании протокола MODBUS, в части порядка следования байт контрольной суммы CRC16, стоит пользоваться нехитрым правилом: правильно посчитанная контрольная сумма неповреждённого пакета (с участием 2-ух последних байт CRC16) всегда равна нулю.

Правильный запрос: CRC16 (1 104 0 0 8 0 103 195) = 0

Неверный запрос: CRC16 (1 104 0 0 8 0 195 103) <> 0

Стандартные функции (см. таб. 4.1) подробно описаны в документе “MODBUS Application Protocol Specification” (www.modbus.org ).






Функция 108 «Служебные команды» имеет следующие коды подфункций (см. таб. 4.8).
Подфункции, возвращающие какие-либо данные, имеют префикс GET. Подфункции, не возвращающие данных, не содержат поля данных и, при удачном выполнении, возвращаются эхом.


Подфункции 1 и 2, возвращающие номер тома всегда возвращают 4-х байтное значение типа DWORD.

Подфункции 3 и 4, возвращающие номера страниц могут возвращать как 2-х байтные (WORD), так и 4-х байтные (DWORD) значения, в зависимости от модели прибора.


Карты распределения памяти приборов


В следующих таблицах представлены карты распределения памяти приборов. Следует отметить тот факт, что в стандартных MODBUS функциях размеры типов данных могут отличаться от типов данных пользовательских функций (в большую сторону) в случае, если размер типа данных не кратен типу WORD (2 байта).

Порядок следования байт указан в столбце Order. Обозначение BE соответствует порядку big endian, а LE - little endian.

Операции, доступные для данной переменной, указываются в последнем столбце rw (read-write). R - разрешается только чтение, W - разрешается только запись, RW - разрешается, как чтение, так и запись.

Массивы обозначены словом array, а количество элементов массив указано в квадратных скобках [n].






Однофазный прибор OMIX измеряет 7 параметров качества электроэнергии, в массивах памяти (array) они расположены в следующем порядке -напряжение, -ток, - частота, - полная мощность, - активная мощность, - реактивная мощность, - cos(Φ).







Использованные источники информации
  • Electrical Characteristics of Balanced Voltage Digital Interface Circuits, ANSI/TIA/EIA-422-B-1994, Telecommunications Industry Association, 1994
  • Electrical Characteristics of Generators and Receivers for Use in Balanced Digital Multipoint Systems, ANSI/TIA/EIA-485-A-1998, Telecommunications Industry Association, 1998
  • Application Guidelines for TIA/EIA-485-A, TIA/EIA Telecommunications Systems Bulletin, Telecommunications Industry Association, 1998
  • A Comparison of Differential Termination Techniques, Joe Vo, National Semiconductor, Application Note AN-903
  • Data Transmission Design Seminar Reference Manual, 1998, Texas Instruments, literature number SLLE01
  • Data Transmission Line Circuits Data Book, 1998, Texas Instruments, literature number SLLD001
  • MODBUS Application Protocol Specification
  • MODBUS over serial line specification and implementation guide

ООО «Автоматика» 2012

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

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

Прежде всего, как представлены данные в устройстве поддерживающем ModBus. Это четыре таблицы с данными:

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

В реальной практике чаще всего встречаются устройства, в которых есть только таблица Holding Registers, иногда объединённая с таблицей Input Registers.

Для доступа к этим таблицам существует ряд стандартный функций ModBus:

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

Запись одного значения:

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

Запись нескольких значений:

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

Из сказанного выше следует, что самые часто используемые функции ModBus это 3, 6 и 16 («Read Holding Registers», «Preset Single Register» и «Preset Multiple Registers» — соответственно).

Что происходит при чтении или записи регистра в ModBus устройство? Рассмотрим, для начала, протокол ModBus RTU. Он применяется для передачи данных по последовательным интерфейсам, таким как RS-232 или RS-485. Большинство современных устройств используют RS-485, так как он, во первых, как правило, двух проводной и во вторых, позволяет подключить несколько устройств в один шлейф.

Важно то, что при подобной топологии на одном шлейфе может быть только один ModBus Master, то есть устройства не могут свободно «общаться» между собой. На каждом шлейфе организуется четкая иерархия Master – Slave («Ведущий» – «Ведомый»). Ведомых, как уже было сказано, может быть несколько, а ведущий только один!

Адресная модель ModBus позволяет использовать адреса устройств с 1 по 247, что иногда вводит в заблуждение некоторых «проектологов», т.к. RS-485 позволяет подключить к одной шине, без усилителей и репитеров, только 32 устройства. На самом деле я рекомендую для стабильной работы, с приемлемым количеством повторных запросов, не превышать значение 20 устройств на одну шину RS-485.

Итак, для чтения одного Holding Register ведущий посылает запрос на адрес ведомого устройства с кодом функции 3 (Read Holding Registers), указанием адреса интересующего регистра и количеством регистров для чтения, в данном случае = 1. На что ведомый отвечает пакетом, в котором повторяет собственный адрес, номер обрабатываемой функции и, в поле данных размещает значение запрашиваемого регистра. Для чтения нескольких последовательных регистров в запросе ведущий просто указывает адрес первого и их количество.

В общем виде, работу функции 3 (Read Holding Registers) протокола ModBus можно представить так:

Теперь рассмотрим, чем отличается ModBus TCP от ModBus RTU. Во первых, нет ограничения на одного ведущего в сети, все устройства могут практически свободно «общаться» между собой. Во вторых используется другой формат пакета, добавился заголовок, что более типично для данной среды передачи.

Так как транспортом для передачи служит протокол TCP, то для адресации устройств ведущему необходимо знать IP адрес ведомого устройства и порт, на котором ведомый ожидает запросов. Стандартный порт для ModBus TCP протокола 502 , но некоторые среды программирования контроллеров, например CODESYS, позволяют его изменить. Тот же самый CODESYS, а точнее контроллеры, запрограммированные в этой среде или средах производных от CODESYS, при работе по протоколу ModBus TCP игнорируют поле «Unit ID» и отвечают на запросы для любого «Unit ID», а не выдают сообщение об ошибке. Это значит, что иногда, достаточно знать IP адрес и порт контроллера.

Довольно часто сталкиваюсь с непониманием модели OSI среди инженеров и проектировщиков АСУ ТП и АСУЗ. Поэтому вот еще одна картинка, разъясняющая то, как пакет ModBus TCP передается по Ethernet сети:

UPD (26.09.2016): Довольно неплохое русскоязычное видео на тему:

6.3. MODBUS Serial

Первые сети MODBUS базировались на асинхронных последовательных линиях связи и получили название MODBUS RTU и MODBUS ASCII . На физическом уровне они используют стандартные последовательные интерфейсы с символьным режимом передачи (см. рис.6.1).

В настоящее время в MODBUS-IDA эти сети получили название MODBUS over Serial Line и описаны в соответствующем стандарте. В нем указываются правила и рекомендации использования на канальном и физическом уровне.

Поскольку сеть MODBUS RTU/ASCII может иметь шинную топологию, определен метод доступа к шине - это модель Ведущий/Ведомый. В сетях MODBUS RTU и MODBUS ASCII Процесс Ведущего всегда является Клиентом, а Процессы Ведомых - Серверами. Это значит, что Ведущий отсылает запросы, а Ведомые их обрабатывают. Этот запрос может быть адресован как индивидуальному узлу так и всем Ведомым на шине (broadcast).

На канальном уровне MODBUS RTU/ASCII используется адресация, ориентированная на идентификаторы узлов. Каждый Ведомый должен иметь свой уникальный адрес (1-247), Ведущий не адресуется. При индивидуальных запросах, Ведущий (с клиентским Процессом) формирует кадр с сообщением-запросом и отправляет его по указанному адресу. Ведомый (с серверным Процессом) получает этот кадр и обрабатывает сообщение. После его обработки, Ведомый формирует кадр с сообщением-ответом, и отправляет его обратно Ведущему. Кадр с сообщением-ответом носит также функции кадра подтверждения, которого Ведущий будет ждать от Ведомого течение времени, определенного тайм-аутом.

При широковещательных запросах (broadcast) используется 0-вой адрес. Широковещательные запросы не требуют подтверждения, поэтому после отправки широковещательного кадра, Ведущий не ожидает ответного кадра.

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

На рис.6.11 показан общий вид кадра MODBUS Serial. Обратите внимание, что разграничение между кадрами и тип контрольной суммы здесь не указаны, поскольку это зависит от режима передачи ASCII или RTU. В поле адреса устройства Ведущий (при запросе) указывает адрес получателя, а Ведомый (при ответе) - свой адрес. Поля MODBUS PDU описаны выше.

На временной диаграмме рис.6.12 показаны три типичные ситуации работы модели Ведущий-Ведомый на MODBUS Serial. Первая ситуация - типичный обмен в одноадресном режиме, вторая - в широковещательном, третья - реакция Ведомого на коммуникационную ошибку.

6.3.2. MODBUS RTU

Данный режим предусматривает использование 8 бит данных в 11-битном символе, который позволяет передавать по байту на символ. Формат символа в RTU режиме: 1 стартовый бит, 8 бит данных (младший бит передается первым), 1 бит паритета + 1 стоповый бит или без паритета + 2 стоповых бита.

Формат кадра MODBUS RTU приведен на рисунке 6.13. Разграничение между кадрами производится с помощью пауз между символами. Новый кадр не должен появляться на шине раньше, чем 3.5 * Тс от предыдущего, где Тс - время передачи одного символа. Если отсутствие сигнала на линии (интервал тишины) будет больше чем 1.5 * Тс приемник идентифицирует окончание кадра. С другой стороны, появление нового кадра ранее 3.5 * Тс, тоже приведет к ошибке.

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


6.3.3. MODBUS ASCII

В данном режиме каждый байт сообщения передается как два ASCII символа их шестнадцатеричного представления, т.е. значение байта 03 16 будет передаваться как ASCII-код символов "0" и "3" (0110000 0110011) Таким образом, байты данных, код функции и байт поля проверки будет передаваться кодами символов 0-9, A-F. Формат символа в ASCII-режиме: 1 стартовый бит, 7 битов данных (младший бит передается первым); 1 бит паритета + 1 стоповый бит или без паритета + 2 стоповых бита.

Формат кадра приведен на рис.6.14. Как видим, для разграничения между кадрами используются стартовый символ ":" и стоповая последовательность "CR LF". Приемники на шине непрерывно отслеживают символ ":" который однозначно указывает на начало кадра. Когда он принят, приемники отлавливают поле адреса и т.д. Это очень простой способ синхронизации, который позволяет некритически относиться к паузам между символами (до 1 сек.). Адрес Ведомого и код функции занимают по два символа, согласно значению одного байта. Далее идут n * 2 символов данных, где n количество байт данных. В ASCII режиме для подсчета контрольной суммы используется алгоритм LRC. Причем контрольная сумма проводится над всеми байтами кадра, кроме стартовой и стоповой последовательности символов.

Режим ASCII накладывает меньшие требования на оборудование, за счет использования стартовой и столбовой последовательности в разграничении кадров, и нечувствительности к значительным паузам между символами. Но эти преимущества отражаются на его недостатках. RTU-режим более требователен к интервалам между кадрами, но значительно продуктивнее чем ASCII .

Пример 6.4. MODBUS. Расчет времени опроса ведомых на MODBUS-RTU.

Задача . Построить кадры форматов сообщений запросов и ответов для MODBUS RTU и рассчитать общее время опроса 10-ти аналоговых 16-битных переменных для 4-х ведомых (рис.6.15). Битовая скорость передачи данных - 19200 бит/с. Клиентский Процесс Ведущего (TSX Premium) и серверные Процессы ведомых (ПЛК TSX Micro) принимают сообщения в начале цикла, а отправляют - в конце цикла. Время цикла Ведущего = 10 мс, Ведомого - 5с .

Выполнения задания. Доступ к внутренним аналоговым переменным TSX Micro проводится через 03 или 04 функцию, поэтому формат кадров будет выглядеть как на рис.6.16.

Учитывая, что структура других кадров - аналогичная, приводить их формат нет смысла.
Аналогично рис.6.12 построим временную диаграмму обмена (рис.6.17).

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

В TSX Micro MODBUS-сервер реализован на уровне операционной системы. Специфика реализации заключается в том, что прием MODBUS-запросов из коммуникационного порта системой проводится в начале цикла, а отправка сообщений-ответов – в конце.

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

На рис.6.17 показано, что поступления кадра приходит где-то внутри цикла. Это значит, что их обработка и генерация ответа пройдет примерно через 1,5 цикла. Следует понимать, что это усредненное значение, для наихудшей оценки лучше резервировать 2 времени цикла (т.е. когда кадр пришел сразу после опроса коммуникационного порта). Таким образом время транзакции для одного ПЛК, например PLC1 (ТТ1), будет равна:

ТТ1=С5+T1.req+2*C1+T1.res+C5*2 (6.1)

ТТ1 рассчитан с учетом 2-х циклов затраченных Ведомым на генерацию ответа на сообщение-запрос. Если бы транзакция проводилась не периодически, как по условию задачи, а по возникновению события, то во время транзакции необходимо было бы включить также еще один цикл Ведущего. Несложно вывести время опроса всех ведомых:

ТТall=C5*9+C1*2+C2*2+C3*2+C4*2+T1.req+T1.res+ T2.req+T2.res+ T3.req+T3.res+ T4.req+T4.res (6.2)

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

ТТall= C5*9 + C1*8 + (T1.req+T2.req)*4(6.3)

Рассчитаем время T1.req и T2.req.

Время передачи кадра (Тframe) можно ориентировочно рассчитать по количеству символов (Nsymb) в кадре и времени передачи одного символа (Tsymb):

Tframe=Nsymb*Tsymb (6.4)

Время передачи одного символа рассчитывается:

время передачи одного символа = количество бит в символе/битовая скорость;
Время передачи кадров будет равна (див.рис.6.16 и рис.6.17):

T1.req=8*(11/19200)=4,58 мс

T1.res=25*(11/19200)=14,33 мс

TTall=90+40+ (4,58+14,33)*4= 206 мс.

Таким образом, для опроса 10-ти переменных из 4-х Ведомых со скоростью 19200 бит/с необходимо затратить примерно 206 мс. Если необходим периодический опрос, желательно зарезервировать определенное время, например еще дополнительно 100 мс.

В ряде случаев, реализация функций MODBUS-Клиента ложится на операционную систему, а доступ к ним в программе ПЛК происходит через интерфейсные коммуникационные функции. В частности, это характерно для большинства ПЛК от Scneider Electric (Momentum, Quantum, TSX Micro, TSX Premium, M340). В ряде других систем - клиентскую сторону на прикладном уровне необходимо полностью прописывать в программе ПЛК, а интерфейс предоставляется только для обмена с коммуникационным портом. В этом случае система предоставляет сервисы отправки и получения сообщений (которые формирует и анализирует сама программа пользователя), и генерации и проверки контрольной суммы. Рассмотрим пример .

Пример 6.5. MODBUS. Реализация MODBUS-клиента на TSX Twido.

Задача . Записать фрагмент программы в ПЛК Twido для считывания 3-х регистров с Ведомого с адресом 1 (рис.6.18).

Решение . В Twido клиентскую сторону MODBUS необходимо реализовывать через универсальную функцию EXCHx, которая отправляет и/или получает данные через коммуникационный порт с номером x. Параметрами функции являются таблица слов (%MW), в которых размещаются данные управления функцией, данные для отправки и буфер для приема. Если обмен будет проходить через коммуникационный порт 2, то вызов функции будет иметь следующий формат :

EXCH2 %MWy:n,

где y - номер первой переменной выделенной таблицы, n - количество слов в таблице.

Формат таблицы, то есть данных, которые необходимо заполнить, и область данных для приема одинаков для всех типов коммуникаций. Для функций 03/04 (чтение N слов) по MODBUS-RTU эта таблица будет иметь вид, приведенный в табл.6.2).

Таблица параметров состоит из 3-х частей-подтаблиц. В таблице управления функцией задаются параметры самой функции. Так в старшем байте 0-го слова указывается, что эта функция работает в обе стороны, т.е. после отправки данных, необходимо ждать ответа. Младший байт этого же слова указывает на длину таблицы передачи (в данном случае 6 байт), для того чтобы система знала о байтах которые необходимо передать (со 2-го слова по 4-е) и откуда начинается буфер приема (с 5-го слова) . Смещение в передаче и приеме необходимо для выравнивания данных в буферах по словам.

Таблица передачи содержит непосредственно сам запрос, т.е. кадр без кода CRC. Таблица приема - это буфер, который система заполнит кадром ответа, при положительном результате. Таким образом, перед использованием этой функции необходимо построить кадр запроса и ответа за исключением поля CRC (рис.6.19)

Таблица 6.2

Таблица параметров

Индекс в таблице

Старший байт

Младший байт

Таблица управления комм. функцией

01 (тип ф-ции отправка+приём)

06 (длина таблицы передачи)

03 (смещение в приёме)

00 (смещение в передаче)

Таблица передачи

адрес Ведомого

03 (номер функции)

адрес начального регистра

количество регистров

Таблица приёма (сообщение-ответ)

адреса Ведомого

03 (номер функции)

00 (байт для смещения)

счнтчик байт

первый регистр

второй регистр

...

N+6

N-ный регистр

Как видим, в запросе 6 байт. Это количество необходимо вписать в младший байт 0-го слова таблицы. В ответе ожидается 9-байт. Если байты кадра ответа разместить в последовательности слов (в ПЛК Schneider Electric память адресуется словами), то старший байт первого принятого регистра (согласно условию это %MW100) будет находиться на младшем байте 2-го слова буфера, а младший байт принятого регистра придется на старший байт 3-го слова в буфере. Таким образом, все принятые слова будут смещены, и прочитать их будет проблематично. Для устранения этой проблемы в таблице параметров функции есть поле смещения приема, в котором указывается номер байта в буфере приема, который будет сдвигать всю последовательность.

Фрагмент программы будет выглядеть как на рис.6.20.
Верхняя цепочка LD предназначена для заполнения таблицы управления функцией и заполнения таблицы передачи.

Во второй цепочке производится непосредственно вызов функции. Переменная %MSG2.D возвращает логическую "1", когда функция EXCH2 обработана и результат получен. Ее использование не дает "затопить" сеть чрезмерным количеством кадров, ведь пока нет ответа на предыдущий запрос или не прошло время тайм-аута, новый запрос отправлять нельзя.

Последний цепочка предназначена для записи результата чтения в переменные %MW0:3 (таблица с 3-х слов начиная с %MW0). Переменная %MSG2.E будет равной 1-це тогда, когда есть место ошибки в вызове функции.

6.3.4. Реализация физического уровня для MODBUS Serial

В отличие от начальной спецификации, которая ограничивалась описанием кадра, в стандарте MODBUS-IDA описываются также правила для реализации сети на физическом уровне. MODBUS over Serial Line базируется на использовании последовательных интерфейсов RS-485, RS-422 и RS-232.

Для RS-485 определена топология - это шина, в которой предусмотрено три способа подключения устройств (рис.6.21):

- Непосредственно к магистральному (trunk) кабелю, без ответвлений;

- Через пассивную коробку подключения и кабель ответвления (Derivation);

- Через активную коробку и специфический кабель ответвления.

Интерфейсы между кабелями и элементами сети имеют следующие обозначения (см. рис.6.21): ITr - интерфейс к магистральному кабелю; IDv - интерфейс между устройством и пассивной коробкой; AUI - интерфейс между устройством и активной коробкой; LT - терминаторы линии.
Битовые скорости определены равными 9600 бит/с и 19200 бит/с (по умолчанию). Другие скорости являются опциональными. Используется метод кодирования NRZ.

При использовании RS-485 стандарт определяет правила подключения устройств по 2-х проводной и 4-х проводной схеме, а также правила совместимости 2-х проводных и 4-х проводных интерфейсов на единственной линии. Ниже рассмотрено только 2-х проводное подключение, поддержка которого является обязательным.

По сути, 2-х проводное подключение на самом деле является 3-х проводным, так как кроме линий A-(D0 ) и B+(D1 ) используется также общая линия C(Common ), которая является обязательной (рис.6.22) .

Общее количество устройств ограничено: 32 устройства на одном сегменте RS-485 без репитеров (использование репитеров разрешается). Максимальная длина кабеля зависит от скорости, типа кабеля, количества нагрузок и конфигурации сети (2-х проводная или 4-х проводная). Для битовой скорости 9600 и кабеля AWG26 максимальная длина ограничена 1000м. Кабель ответвления должен быть короче 20 м. Если используются мультипортовые коробки с n портами, то каждый кабель ответвления ограничен длиной 40/n м.

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

Для погашения отражения волн на концах линии между D1 и D0 выставляется терминаторы линии (LT). Терминаторы разрешается выставлять только на магистральном кабеле. В качестве терминаторов можно использовать:

- Резистор номиналом 150 Ом и мощностью 0.5 Вт;

- Последовательно соединенные конденсатор (1 нФ, 10 В минимум) и резистор номиналом 120 Ом (0.25 Вт) при использовании поляризации линии

В стандарте MODBUS Serial определены правила реализации защитного смещения (поляризации), которые предусматривают подключение питания номиналом 5 В между D1 и D0 через PullUp и PullDown резисторы для поддержания логической "1" на линии при отсутствии передачи. Номинал резисторов выбирается от 450 Ом до 650 Ом в зависимости от количества устройств (650 Ом при большом количестве). Защитное смещение проводится только в одной точке линии, как правило на стороне Ведущего. Максимальное количество устройств с реализованной поляризацией уменьшается на 4 по сравнению с системой без поляризации. Поляризация является необязательной. Однако коммуникации на устройствах могут давать сбой при отсутствии логического сигнала. Если это так, то поляризацию необходимо реализовывать самостоятельно, или использовать существующие схемы, если таковые предусмотрены устройствами.

Стандарт определяет также механический интерфейс, т.е. типы разъемов, вилок и соответствие сигналов на контактах. В качестве механического терминала можно использовать клемную колодку, экранированный RJ-45 (рис.6.23) или экранированный SUB-D9 разъем (рис.6.24).

В таблице 6.3 указано назначение контактов для коннекторов при 2-х проводном подключением по RS-485, а в таблице 6.4 по RS-232

Таблица 6.3

Предназначение контактов конекторов при подключении по RS-485

номера контактов

требования к наличию

цепь IDv

цепь ITr

название RS-485

комментарий

(см. раздел 3)

RJ45

SUB-D9

опционально

PMC

управление режимом ком. порта

обязательно

D1

B/B"

напряж V1, V1>V0 для лог. "1"

обязательно

D0

A/A"

напряж V0, V0>V1 для лог. "0"

желательно

Питание 5…24 VDC

обязательно

Common

Common

C/C"

Питание и сигнальная земля

Таблица 6.4

Предназначение контактов конекторов при подключении по RS-232

DCE (модем)

контур

DTE

номера контактов

требования к наличию

название

комментарий

(см. раздел 3)

источник

RS-232

требования к наличию

номера

контактов

RJ45

SUB-D9

RJ45

SUB-D9

обязательно

TxD

Transmitted Data

<< DTE

обязательно

обязательно

RxD

Received Data

DCE >>

обязательно

опционально

CTS

Clear to Send

DCE >>

опционально

опционально

RTS

Request to Send

<< DTE

опционально

обязательно

Common

Signal Common

обязательно

В качестве кабелей для 2-х проводного типа соединения стандарт определяет двойную экранированную витую пару категорий 4 (до 600м) или 5 (до 1000м), где в одной паре идут сбалансированные сигналы D0 и D1, а во второй - сигнальная земля Common. Рекомендуемые цвета кабелей: D1 желтый; D0 коричновий; Common серый.

Пример 6.6. MODBUS. Схема сетевых соединений MODBUS RTU.

Задача . Нарисовать схему сетевых соединений для 2-х проводной реализации шины MODBUS RTU со следующими узлами:

- PLC1: VIPA CPU 115SER 6BL32 (Ведущий) через встроенный последовательный порт процессорного модуля;

- PLC2: TSX Twido TWDLMDA40DTK (Ведомый) через коммуникационный модуль TWD NOZ 485T

- PLC3: TSX Twido TWDLMDA40DTK (Ведомый) через коммуникационный модуль TWD NOZ 485T

Решение . На рис.6.25 показана схема сетевых соединений для поставленной задачи. Спецификация сетевых средств дана в таб.6.5.

Как видно из рис.6.25, PLC1 подключается к шине через пассивную коробку, а вернее через клеммную колодку, что в принципе равнозначно. Это вызвано тем, что на ПЛК подключения идет с использованием 9-штекерного SUB-D разъема, что требует разработку собственного кабеля, схема подключения (спая) которого к коннектору и к клеммной колодке показан ниже основной схемы.

Таким образом к вилке КК1 провода кабеля КМ2 необходимо припаять. Назначение пинов розетки SER не совпадает со стандартной. Пины 8 и 3 (соответственно А (D0) и В (D1)) идут в одну пару, затем подключаются к ХТ1:1 и ХТ1:2; 5 и 6 (соответственно M5V (-5В) и P5V (+5 В)) идут в другую витую пару кабеля КМ2. Питания 5В необходимо для того, чтобы реализовать защитное смещение (асимметрию) в соответствии со стандартом. Кроме того M5V является сигнальной землей (Common).

Кабель КМ2 подключается к ХТ1 согласно схеме, показанной на рис.6.25. Экран кабеля соединяется с сигнальной землей в соответствии с требованиями стандарта. Следует напомнить, что ПЛК VIPA в этой системе является Ведущим, следовательно и защитное смещение и соединения экрана с землей необходимо реализовывать именно в этом месте. Защитное смещение производится с помощью питания 5В, которое берется из порта SER и двух резисторов.

Таблица 6.5.

Спецификация сетевых средств

Обозначение

Наименование

Референс

Колич

Примечание

PLC1

ПЛК VIPA 100

VIPA CPU 115SER 6BL32

1 шт.

VIPA

PLC2, PLC3

ПЛК Twido

TWDLMDA40DTK

2 шт.

Schneider Electric

MK1, MK2

коммуникационный модуль для реализации интерфейса RS-485, подключение под винт

TWD NOZ 485T

2 шт.

Schneider Electric

KK1

9-пиновий SUB-D коннектор типа вилка

1 шт.

XT1

клеммная колодка на 4 клеммы

1 шт.

TL1,TL2

терминаторы линии

2 шт

изготовляются с поз. 7 и 8

Резистор 120 Ом (0.25 Вт)

2 шт.

в составе поз.6

Конденсатор 1 нФ (>10 В)

2 шт.

в составе поз поз.6

Ru,Rd

Резистор 500 Ом (0.25 Вт)

2 шт

КМ1

AWG26

300 м

КМ2

кабель двойная экранированная витая пара 5-й категории AWG26

2 м

КМ3

кабель двойная экранированная витая пара 5-й категории AWG26

300 м

PLC2 и PLC3 соединяются с шиной с помощью коммуникационного модуля с клеммной колодкой. Это позволяет реализовать подключение без ответвлений. Однако на колодке не предусмотрено место подключения экрана, поэтому кабель экранируется отдельно.

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

В настоящее время MODBUS Serial используется как на уровне контроллеров так и на уровне датчиков (для распределенной периферии). Его использование проблематично при наличии на шине нескольких устройств SCADA / HMI , которые в клиент-серверной архитектуре должны быть Клиентами, ведь на MODBUS RTU/ASCII только Ведущий может быть Клиентом. Но даже в такой ситуации есть возможность организовать доставку данных всем нуждающимся узлам, если они поддерживают такой режим.

Исходя из указанного, на шине MODBUS Serial можно остановить свой выбор в случае, если:

- все устройства-Серверы поддерживают MODBUS RTU / ASCII в режиме Ведомого;

- необходимо только одно устройство-Клиент, которому необходимо инициировать обмены на шине, поддерживающий MODBUS RTU/ASCII как Ведущий;

- скорость восстановления данных - удовлетворяет условию задачи;
нет необходимости в

В этой статье вы узнаете о протоколе Modbus TCP, который является развитием протокола Modbus RTU. Англоязычная версия статьи доступна на ipc2u.com .

Куда посылать команду Modbus TCP?

В сети Ethernet адресом устройства является его IP-адрес. Обычно устройства находятся в одной подсети, где IP адреса отличаются последними цифрами 192.168.1.20 при использовании самой распространённой маски подсети 255.255.255.0.

Интерфейсом является сеть Ethernet , протоколом передачи данных – TCP/IP .

Используемый TCP-порт: 502 .

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

Команда Modbus TCP состоит из части сообщения Modbus RTU и специального заголовка.

Из сообщения Modbus RTU удаляется SlaveID адрес в начале и CRC контрольная сумма в конце, что образует PDU, Protocol Data Unit.

Ниже приведен пример запроса Modbus RTU для получения значения AO аналогового выхода (holding registers) из регистров от #40108 до 40110 с адресом устройства 17.

11 03 006B 0003 7687

Отбрасываем адрес устройства SlaveID и контрольную сумму CRC и получаем PDU:

03 006B 0003

К началу получившегося сообщения PDU добавляется новый 7-байтовый заголовок, который называется MBAP Header (Modbus Application Header). Этот заголовок имеет следующие данные:

Transaction Identifier (Идентификатор транзакции) : 2 байта устанавливаются Master, чтобы однозначно идентифицировать каждый запрос. Может быть любыми. Эти байты повторятся устройством Slave в ответе, поскольку ответы устройства Slave не всегда могут быть получены в том же порядке, что и запросы.

Protocol Identifier (Идентификатор протокола) : 2 байта устанавливаются Master, всегда будут = 00 00, что соответствует протоколу Modbus.

Length (Длина) : 2 байта устанавливаются Master, идентифицирующие число байтов в сообщении, которые следуют далее. Считается от Unit Identifier до конца сообщения.

Unit Identifier (Идентификатор блока или адрес устройства) : 1 байт устанавливается Master. Повторяется устройством Slave для однозначной идентификации устройства Slave.

Итого получаем:

Modbus RTU Slave ID Запрос CRC
Modbus RTU 11 03 006B 0003 7687
0001 0000 0006 11 03 006B 0003
PDU
ADU, Application Data Unit

В ответе от Modbus TCP Slave устройства мы получим:

0001 0000 0009 11 03 06 022B 0064 007F

0001 Идентификатор транзакции Transaction Identifier
0000 Идентификатор протокола Protocol Identifier
0009 Длина (9 байтов идут следом) Message Length
11 Адрес устройства (17 = 11 hex) Unit Identifier
03 Функциональный код (читаем Analog Output Holding Registers) Function Code
06 Количество байт далее (6 байтов идут следом) Byte Count
02 (02 hex) Register value Hi (AO0)
2B (2B hex) Register value Lo (AO0)
00 Значение старшего разряда регистра (00 hex) Register value Hi (AO1)
64 Значение младшего разряда регистра (64 hex) Register value Lo (AO1)
00 Значение старшего разряда регистра (00 hex) Register value Hi (AO2)
7F Значение младшего разряда регистра (7F hex) Register value Lo (AO2)

Регистр аналогового выхода AO0 имеет значение 02 2B HEX или 555 в десятичной системе.

Регистр аналогового выхода АО1 имеет значение 00 64 HEX или 100 в десятичной системе.

Регистр аналогового выхода АО2 имеет значение 00 7F HEX или 127 в десятичной системе.

Типы команд Modbus TCP

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

Код функции Что делает функция Тип значения Тип доступа
01 (0x01) Чтение DO Read Coil Status Дискретное Чтение
02 (0x02) Чтение DI Read Input Status Дискретное Чтение
03 (0x03) Чтение AO Read Holding Registers 16 битное Чтение
04 (0x04) Чтение AI Read Input Registers 16 битное Чтение
05 (0x05) Запись одного DO Force Single Coil Дискретное Запись
06 (0x06) Запись одного AO Preset Single Register 16 битное Запись
15 (0x0F) Запись нескольких DO Force Multiple Coils Дискретное Запись
16 (0x10) Запись нескольких AO Preset Multiple Registers 16 битное Запись

Как послать команду Modbus TCP на чтение дискретного вывода? Команда 0x01

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

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

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

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 04
01 Адрес устройства 01 Адрес устройства
01 Функциональный код 01 Функциональный код
00 01 Количество байт далее
00 02 Значение регистра DO 0-1
00 Количество регистров Hi байт
02 Количество регистров Lo байт

Состояния выходов DO0-1 показаны как значения байта 02 hex, или в двоичной системе 0000 0010.

Значение DO1 будет вторым справа, а значение DO0 будет первым справа (младший бит).

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

Модули с дискретным выводом: ioLogik E1211 , ET-7060 , ADAM-6060

Как послать команду Modbus TCP на чтение дискретного ввода? Команда 0x02

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

Запрос и ответ для DI похож на запрос для DO.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 04
01 Адрес устройства 01 Адрес устройства
02 Функциональный код 02 Функциональный код
00 Адрес первого регистра Hi байт 01 Количество байт далее
00 Адрес первого регистра Lo байт 03 Значение регистра DI 0-1
00 Количество регистров Hi байт
02 Количество регистров Lo байт

Состояния выходов DI 0-1 показаны как значения байта 03 hex, или в двоичной системе 0000 0011.

Значение DI1 будет вторым справа, а значение DI0 будет первым справа (младший бит).

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

Модули с дискретным вводом: ioLogik E1210 , ET-7053 , ADAM-6050

Как послать команду Modbus TCP на чтение аналогового вывода? Команда 0x03

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 07
01 Адрес устройства 01 Адрес устройства
03 Функциональный код 03 Функциональный код
00 Адрес первого регистра Hi байт 04 Количество байт далее
00 Адрес первого регистра Lo байт 02 Значение регистра Hi (AO0)
00 Количество регистров Hi байт 2B Значение регистра Lo (AO0)
02 Количество регистров Lo байт 00 Значение регистра Hi (AO1)
64 Значение регистра Lo (AO1)

Состояния выхода AO0 показаны как значения байта 02 2B hex, или в десятичной системе 555.

Состояния выхода AO1 показаны как значения байта 00 64 hex, или в десятичной системе 100.

Модули с дискретным вводом: ioLogik E1210 , ET-7053 , ADAM-6050

Как послать команду Modbus TCP на чтение аналогового ввода? Команда 0x04

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 07
01 Адрес устройства 01 Адрес устройства
04 Функциональный код 04 Функциональный код
00 Адрес первого регистра Hi байт 04 Количество байт далее
00 Адрес первого регистра Lo байт 00 Значение регистра Hi (AI0)
00 Количество регистров Hi байт 0A Значение регистра Lo (AI0)
02 Количество регистров Lo байт 00 Значение регистра Hi (AI1)
64 Значение регистра Lo (AI1)

Состояния выхода AI0 показаны как значения байта 00 0A hex, или в десятичной системе 10.

Состояния выхода AI1 показаны как значения байта 00 64 hex, или в десятичной системе 100.

Модули с аналоговым вводом: ioLogik E1240 , ET-7017-10 , ADAM-6217

Как послать команду Modbus TCP на запись дискретного вывода? Команда 0x05

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

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

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 06
01 Адрес устройства 01 Адрес устройства
05 Функциональный код 05 Функциональный код
00 Адрес регистра Hi байт 00 Адрес регистра Hi байт
01 Адрес регистра Lo байт 01 Адрес регистра Lo байт
FF Значение Hi байт FF Значение Hi байт
00 Значение Lo байт 00 Значение Lo байт

Модули с дискретным выводом: ioLogik E1211 , ET-7060 , ADAM-6060

Как послать команду Modbus TCP на запись аналогового вывода? Команда 0x06

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 06
01 Адрес устройства 01 Адрес устройства
06 Функциональный код 06 Функциональный код
00 Адрес регистра Hi байт 00 Адрес регистра Hi байт
01 Адрес регистра Lo байт 01 Адрес регистра Lo байт
55 Значение Hi байт 55 Значение Hi байт
FF Значение Lo байт FF Значение Lo байт

Состояние выхода AO0 поменялось на 55 FF hex, или в десятичной системе 22015.

Модули с аналоговым выводом: ioLogik E1241 , ET-7028 , ADAM-6224

Как послать команду Modbus TCP на запись нескольких дискретных выводов? Команда 0x0F

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
08 06
01 Адрес устройства 01 Адрес устройства
0F Функциональный код 0F Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
00 Адрес первого регистра Lo байт 00 Адрес первого регистра Lo байт
00 Количество регистров Hi байт 00
02 Количество регистров Lo байт 02
01 Количество байт далее
02 Значение байт

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

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

Модули с дискретным выводом: ioLogik E1211 , ET-7060 , ADAM-6060

Как послать команду Modbus TCP на запись нескольких аналоговых выводов? Команда 0x10

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
0B 06
01 Адрес устройства 01 Адрес устройства
10 Функциональный код 10 Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
00 Адрес первого регистра Lo байт 00 Адрес первого регистра Lo байт
00 Количество регистров Hi байт 00 Кол-во записанных рег. Hi байт
02 Количество регистров Lo байт 02 Кол-во записанных рег. Lo байт
04 Количество байт далее
00 Значение Hi AO0 байт
0A Значение Lo AO0 байт
01 Значение Hi AO1 байт
02 Значение Lo AO1 байт

Состояние выхода AO0 поменялось на 00 0A hex, или в десятичной системе 10.

В уроке 48 я показал пример нестандартного протокола обмена данными через интерфейс UART. Как всегда все нестандартное позволяет оптимизировать выполнение задачи, а все универсальное упрощает разработку задачи.

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

Общее описание протокола.

ModBus – открытый протокол обмена данными в малых локальных сетях. Как правило, используется для передачи данных через интерфейсы RS-232, RS-485, RS-422, в сетях TCP/IP, UDP. Благодаря своей простоте и универсальности ModBus получил широкое распространение и стал де факто стандартом в малых распределенных вычислительных системах. Практически все современные контроллеры поддерживают работу в сетях ModBus.

В сети ModBus контроллеры, как правило, соединены по топологии ”Общая шина”. Взаимодействие контроллеров происходит в соответствии с моделью master-slave (ведущий-ведомый).

В сети есть главное устройство - ведущее. А также несколько подчиненных устройств – ведомые. Обмен может быть инициирован только ведущим устройством.

Транзакция (последовательность операций при обмене данными) состоит из запроса и ответа.

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

Ведомое устройство, определив свой адрес в запросе, формирует ответ.

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

Существуют 3 варианта протокола ModBus.

  • ModBus ASCII – текстовый протокол. В нем используются только ASCII символы. Каждый байт передается как два шестнадцатеричных символа.
  • ModBus RTU – числовой протокол. Данные передаются в двоичном виде. Байт, передаваемый по сети это число протокола.
  • ModBus TCP – протокол для передачи данных в TCP/IP сетях.

Числовые и текстовые протоколы я сравнивал еще в . По производительности и скорости обмена, безусловно, преимущество имеют числовые протоколы. Ближайшие уроки будем использовать ModBus RTU. Именно этому варианту посвящена последующая информация урока.

Протокол ModBus RTU.

В сети по топологии ”Общая шина” подключены устройства (контроллеры). Стандарт ModBus допускает совместную работу до 247 контроллеров.

В каждом контроллере есть данные, собственно говоря, которыми и обмениваются устройства.

Стандарт ModBus определяет 4 типа данных.

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

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

На практике используются только данные Регистры хранения (Holding Registers). Доступ к данным осуществляется через 16 битный адрес. В итоге:

  • данные в каждом контроллере представляют собой таблицу 16 битных регистров;
  • в таблице данных может быть до 65536 элементов;
  • нумерация элементов начинается с 0.

Ведущее устройство инициирует транзакцию – обмен данными. Транзакция может быть индивидуальной (запрос-ответ) или широковещательной (адресуются одновременно все ведомые устройства). Транзакция состоит из одного кадра запроса и одного кадра ответа. При широковещательной транзакции используется только кадр запроса.

Данные кадра передаются сплошным потоком. Пауза между передачей данных не должна превышать время передачи 1,5 символа. Признаком нового кадра является отсутствие обмена в сети (молчание) в течение времени необходимого на передачу 3,5 символов. Если в течение этого времени линия сети находилась в неактивном состоянии, то ведомые устройства воспринимают первое принятое данное как начало кадра.

В общем случае кадр запроса имеет следующий формат.


Адрес (8 бит).

Кадр начинается с поля адреса, которое состоит из 8 разрядов. Содержит адрес ведомого устройства, которому предназначено сообщение от ведущего. Каждое ведомое устройство должно иметь уникальный адрес от 1 до 247. И только адресуемое ведомое устройство должно ответить на запрос ведущего. В ответе сообщается ведущему устройству, с каким из ведомых установлена связь.

Адрес 0 используется в широковещательном режиме. Все ведомые устройства выполняют заданную в запросе функцию, но подтверждение не посылают.

Функция (8 бит).

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

Старший бит байта функция устанавливается в 1 в ответе ведомого устройства, чтобы сообщить ведущему, что операция была выполнена с ошибкой. При успешной операции старший бит равен 0.

  • Стандартные команды. Коды, определенные стандартом на протокол ModBus.
  • Пользовательские команды. Для кодов 65…72 и 100…110 пользователь может сам назначить произвольную функцию.
  • Зарезервированные команды. Это коды, которые не были изначально определены стандартом, но уже используются в устройствах разных производителей.

Подавляющее большинство ModBus контроллеров используют только 3 функции.

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

Данные (N * 8 бит).

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

Каждое данное имеет 16 разрядов (2 байта). Данные передаются старшим байтом вперед. Например, последовательная передача регистров с адресами 0 и 1 должна происходить следующим образом:

  • старший байт регистра 0 ->
  • младший байт регистра 0 ->
  • старший байт регистра 1 ->
  • младший байт регистра 1 ->.

При передаче 4х байтового числа, например, с плавающей запятой последовательность та же. Число разбивается на два 16 разрядных регистра и в каждом из них первым передается старший байт (1-> 0-> 3-> 2->).

Контрольная сумма (16 бит).

Поле контроля целостности данных сообщений. Позволяет проверять кадры на наличие ошибок. Речь идет об ошибках, появляющихся при передаче данных.

Я постараюсь в общих чертах рассказать о контрольном коде. Лучше пропустить этот параграф. Может голова треснуть. У меня, когда я затрагиваю эту тему – всегда трещит. В следующем уроке я представлю практическую реализацию вычисления контрольного кода ModBus.

В качестве контрольной суммы используется циклический избыточный код (CRC). Все биты кадра передачи собираются в огромное двоичное число. Оно делится на код порождающего полинома. Остаток от деления и есть контрольный код.

Используется полиноминальная арифметика по модулю 2. Это означает, что все действия при вычислении CRC это арифметические операции без переноса. Вычитание и сложение происходят побитно, без учета переноса из-за чего эти операции дают одинаковый результат и могут быть заменены операцией ”исключающее или”. При делении вместо вычитания делителя из делимого также используется операция ”исключающее или”. Это общий принцип вычисления CRC. Практически вычисления производятся с помощью более эффективных алгоритмов.

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

Стандарт ModBus RTU использует стандартный циклический код CRC-16 с порождающим полиномом X 16 +X 15 +X 2 +1. Это 16ти разрядный код, двоичные коэффициенты 1 1000 0000 0000 0101 (8005h в шестнадцатеричном представлении).

Сообщение рассматривается как одно последовательное двоичное число, в котором старший бит передается первым. Это число умножается на X 16 (сдвиг влево на 16 разрядов), и делится на X 16 +X 15 +X 2 +1 (1 1000 0000 0000 0101). 16ти битный остаток (предварительно инициализированный всеми единицами) и есть контрольный код сообщения.

Обработка логических ошибок.

Кроме ошибок, связанных с искажением данных при передаче могут быть логические ошибки, когда запрос принят без ошибок, но не может быть выполнен. Как правило, такие ошибки связаны с недопустимым адресом, данными, кодами и т.п. Большинство ModBus контроллеров поддерживают следующие типы ошибок.

Код ошибки Название Описание
01 ILLEGAL FUNCTION Код функции не поддерживается в контроллере
02 ILLEGAL DATA ADRESS Недопустимый адрес данных
03 ILLEGAL DATA VALUE Недопустимые значения данных
04 SLAVE DEVICE FAILURE Произошла ошибка при выполнении операции

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

Детальное рассмотрение функций.

Функция 03 – чтение регистров хранения.

Используется для чтения значений нескольких регистров хранения. В запросе передается адрес первого элемента таблицы регистров, значение которого необходимо прочитать и количество считываемых регистров. Для адреса и количества используются 16ти разрядные числа. Старший байт передается первым.

Запрошенные данные содержатся в ответе. Перед блоком данных передается байт, который содержит число прочитанных данных в байтах.

Формат запроса функции чтения регистров хранения.

Номер байта Номер байта в параметре Параметр
0 0 Адрес контроллера 01 01
1 0 Функция 03 03
2 1 Начальный адрес регистров 0008 00
3 0 08
4 1 Количество регистров 0002 00
5 0 02
6 1 Контрольная сумма 45C9 45
7 0 C9

Ответ (адрес ведомого, код функции, количество прочитанных байтов, значения регистров).

Номер байта Номер байта в параметре Параметр Пример чтения регистров с адресами 8 и 9
0 0 Адрес контроллера 01 01
1 0 Функция 03 03
2 0 Количество прочитанных байтов 04 04
3 1 Значение регистра 8 12A5 12
4 0 A5
5 1 Значение регистра 9 E020 E0
6 0 20
7 1 Контрольная сумма A770 A7
8 0 70

Функция 06 – запись в один регистр хранения.

Используется для записи в единичный регистр. В запросе передается адрес регистра и значение для него. При успешном выполнении ведомый контроллер в ответе передает копию запроса.

Формат запроса функции записи одного регистра хранения.

Номер байта Номер байта в параметре Параметр
0 0 Адрес контроллера 01 01
1 0 Функция 06 06
2 1 Адрес регистра 0009 00
3 0 09
4 1 Значение регистра 12A5 12
5 0 A5
6 1 Контрольная сумма 9513 95
7 0 13

Ответ (повторяет запрос).

Номер байта Номер байта в параметре Параметр Пример записи в регистр 9 значения 12A5
0 0 Адрес контроллера 01 01
1 0 Функция 06 06
2 1 Адрес регистра 0009 00
3 0 09
4 1 Значение регистра 12A5 12
5 0 A5
6 1 Контрольная сумма 9513 95
7 0 13

Функция 16 – запись значений в регистры хранения.

Используется для записи в несколько, последовательно расположенных в таблице, регистров.

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

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

Формат запроса функции записи регистров хранения.

Номер байта Номер байта в параметре Параметр
0 0 Адрес контроллера 01 01
1 0 Функция 10 10
2 1 Начальный адрес регистров 0008 00
3 0 08
4 1 Количество регистров 0002 00
5 0 02
6 0 Счетчик байтов 04 04
7 1 Значение регистра 8 12A5 12
8 0 A5
9 1 Значение регистра 9 E020 E0
10 0 20
11 1 Контрольная сумма AF4A AF
12 0 4A

Ответ (адрес ведомого, код функции, начальный адрес и количество регистров).

Номер байта Номер байта в параметре Параметр Пример записи регистров с адресами 8 и 9
0 0 Адрес контроллера 01 01
1 0 Функция 10 10
2 1 Начальный адрес регистров 0008 00
3 0 08
4 1 Количество регистров 0002 00
5 0 02
6 1 Контрольная сумма С00A C0
7 0 0A

ModBus и специализированные протоколы.

Теперь можете сравнить протокол ModBus со специализированном протоколом из .

Номер байта Формат числа Назначение
0 … 3 float Температура
4 … 7 float Напряжение
8 byte Состояние кнопки
9 byte Резерв
10, 11 int Контрольная сумма (сумма байтов 0 … 9 ^ 0xa1e3)

По сравнению со специализированным протоколом:

  • ModBus медленнее, его производительность ниже. Для получения такого же количества информации по сети передается намного больше данных.
  • Реализация его сложнее. Требуется больше ресурсов микроконтроллера и сети.

Но достоинства во многих случаях весомее.

  • За счет более сложной контрольной суммы и избыточности информации ошибки сети определяются в нем надежнее, выше достоверность данных.
  • Сеть легко расширяется. Очень просто добавлять новые устройства.
  • ModBus – стандартный протокол. Множество контроллеров различных производителей поддерживают его.

Пожалуй, главная причина применения нестандартных протоколов – это недостаточность вычислительных ресурсов системы.

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

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

Рубрика: . Вы можете добавить в закладки.