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

Мы разобрали общую структуру протокола ModBus. Сегодня мы рассмотрим разновидность этого протокола — ModBus TCP, которая используется для реализации ModBus в сетях Ethernet.

ModBus TCP всегда работает поверх TCP/IP стека, поэтому не может считаться полноценным ModBus протоколом в его классическом виде.

Основное отличие, которое накладывает TCP/IP на ModBus при их совместном использовании — непосредственное подключение к определённому адресу. Протокол TCP/IP устроен по принципу «клиент-сервер». Для обмена данными клиент открывает сеанс связи с сервером, указывая его адрес.

Переходя на терминологию протокола ModBus ведущее устройство (мастер) в TCP-сети становится клиентом (т.к. именно клиент является инициатором обмена данными), а подчинённое устройство (слейв) — сервером.

Таким образом, для того чтобы передать запрос подчинённому устройству в TCP-сети мастер должен сначала открыть сеанс связи с ним. Причём открытие сеанса реализуется не на уровне протокола ModBus, а на уровне TCP/IP. Поэтому ведущее устройство не может средствами ModBus передавать запросы разным устройствам, так же, как это происходит в ModBus RTU или ASCII.

По этой же причине в ModBus TCP отсутствуют широковещательные сообщения (сразу всем подчинённым устройствам).

Однако, Master-устройство может подключаться к необходимому узлу (слейву) средствами протокола TCP/IP, а затем уже общаться с ним на языке ModBus.

На рисунке рабочее место диспетчера под управлением SCADA-системы является сервером сбора данных и одновременно мастером в сети ModBus TCP. Оно последовательно подключается к каждому удалённому контроллеру, открывая сеанс связи в сети TCP/IP и обменивается с ним ModBus-пакетами.

Безусловно, такой обмен происходит дольше, чем в случае ModBus RTU, т.к. дополнительное время уходит на открытие и закрытие сеанса TCP/IP. Однако, это даёт возможность объединить устройства находящиеся на значительном удалении витой парой или даже по WiFi.

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

При такой конфигурации клиент сети TCP (он же мастер сети ModBus) подключается к шлюзу (серверу) и ведёт общение только с ним. Шлюз же переадресует сообщение внутри шины ModBus (RTU или ASCII) тому устройству, адрес которого указан в ModBus-пакете.

Структура пакета ModBus TCP

Сначала вспомним структуру классического ModBus-пакета (RTU или ASCII):

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

А вот так выглядит структура пакета ModBus TCP:

Как вы можете видеть, в пакете ModBus TCP по сравнению с ModBus RTU добавлены блоки идентификаторов обмена и протокола, а так же от отсутствует блок контроля подлинности пакета. Последнее объясняется тем, что контроль целостности пакета обеспечивается средствами протокола TCP/IP, поэтому отпадает необходимость в его ModBus-реализации.

Рассмотрим что означает каждый из блоков пакета ModBus TCP:

  • id обмена — чаще всего два нуля. Применяется только в том случае, если мастер отсылает подчинённому устройству несколько запросов подряд без ожидания ответа. При этом id позволяет затем понять какому из запросов какой ответ соответствует.
  • id протокола — всегда нули, не применяется. Поле оставлено в качестве резерва для будующих применений.
  • длина пакета — совокупная длина блоков «адрес», «номер функции» и «данные». Длина пакета передаётся двумя байтами, первым из которых идет старший.
  • адрес ведомого устройства — аналог такого же блока в структуре пакета ModBus RTU, но обычно не используется, т.к. ,как уже говорилось, в ModBus TCP мастер и так открывает сеанс обмена только с одним слейвом (у которого, конечно, есть и IP адрес в сети TCP/IP). Данное поле используется только в варианте ModBus TCP-сети со шлюзом. Тогда шлюз сам перенаправляет пакет по указанному адресу.
  • поля код функции и данные аналогичны соответствующим полям в классическом ModBus-пакете.

Modbus - открытый протокол последовательной связи. Был разработан в 1979 году для использования с устройствами программируемого логического контроллера (PLC), в настоящее время широко используется для подключения многих типов промышленных электронных устройств, подключенных к различным типам сетей.

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

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

Modbus — протокол расширенного применения

Преобразователь протоколов широко используется по ряду причин:

  • Modbus — протокол с открытым исходным кодом. Это означает, что он может быть включен в широкий диапазон типов устройств от любого поставщика оборудования.
  • Использует простую структуру сообщений, что делает ее менее сложной для развертывания. Может потребовать всего несколько дней для реализации. Это явное конкурентное преимущество в сравнении с другими протоколами, которые могут потребовать месяцев для изучения и развертывания.
  • Поддерживает последовательные или Ethernet-соединения.
  • Используется с двумя типами последовательных соединений: RS-232 и RS-485. Некоторые версии протокола Modbus tcp также могут быть отправлены через Ethernet или TCP/IP. Эти сообщения Modbus упакованы как однобитовые или 16-битные пакеты слов.

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

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

Как правило, ПК настроен на запуск таких программ, как Wonderware, Intellution или LabVIEW в одном месте для сбора данных из разных процессов по всему предприятию. Другое приложение предназначено для настройки удаленных контроллеров производственных процессов (ПЛК, Allen-Bradley, Siemens, PLCDirect и другие). Для реагирования на различные уровни или режимы, которые передаются с устройства.

Два варианта протокола

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

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

Протокол Modbus для чайников

Modbus - это протокол последовательной связи, используемый для передачи информации по последовательным линиям между электронными устройствами. То, которое запрашивает информацию, называется ведущим (Master), а информация о поставке устройств — подчиненные устройства (Slaves). В стандартной сети Modbus есть один Master и до 247 Slaves, каждый из которых имеет уникальный подчиненный адрес от 1 до 247. Master может также записывать информацию в Slaves.

Для чего его используют?

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

Modbus обычно используется для передачи сигналов от приборов и устройств управления обратно в главный контроллер или систему сбора данных, например, систему, которая измеряет температуру и влажность, передает результаты на компьютер. Modbus часто используется для подключения контрольного компьютера с удаленным терминальным блоком (RTU) в системах диспетчерского управления и сбора данных (SCADA). Версии протокола Modbus существуют для последовательных линий (RTU и ASCII) и для Ethernet (TCP).

Как это работает?

Modbus передается по последовательным линиям между устройствами. Самой простой установкой был бы один последовательный кабель, соединяющий последовательные порты на двух устройствах: Master и Slave.

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

Протокол Master/Slave

При описании протокола Modbus RTU связь осуществляется между централизованным ведущим оборудованием, 247 подключенными электронными устройствами в одной сети. Конструкцию обычно называют протоколом «ведущий/ведомый», поскольку система Master запрашивает информацию у подключенных устройств, которые называются «подчиненными». Ведомые устройства отправляют информацию только мастеру в ответ на эти запросы, они не работают автономно. Ведущий может также записывать информацию на подчиненные устройства, но подчиненные устройства не могут записывать информацию ведущему устройству.

Когда ведомое устройство передает сообщение Modbus, оно начинает формировать сообщение с уникальным идентификатором адреса. Это число от 1 до 247, что позволяет мастеру определять, какое конкретное устройство отвечает запрошенной информации.

Связь и устройства

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

Существует много модемов и шлюзов, поддерживающих Modbus, поскольку это очень простой протокол и часто копируется. Некоторые из них были специально разработаны для него. Различные реализации используют проводную, беспроводную связь, например, в диапазоне ISM, и даже службу коротких сообщений (SMS), а также услугу общей пакетной радиосвязи (GPRS). Типичные проблемы, с которыми приходится сталкиваться дизайнерам, включают проблемы с высокой задержкой и временем.

Обзор типов регистра Modbus

Типы регистров, на которые ссылаются устройства, включают:

Катушку (дискретный выход); . дискретный вход; . входной регистр; . регистрацию холдинга.

Коды функций

  • Коды общих функций - от 1 до 127, за исключением пользовательских кодов, проверенных сообществом Modbus, публично задокументированы и гарантированно уникальны.
  • Пользовательские коды функций - находятся в двух диапазонах от 65 до 72, от 100 до 110.
  • Коды зарезервированных функций - используются некоторыми компаниями для устаревших продуктов, недоступны для общего пользования.

Преимущества

Некоторые преимущества использования протокола Modbus:

  • Если драйвер уже установлен, а пользователь знаком с Ethernet и сокетами TCP/IP, драйвер может работать и обмениваться данными с ПК через несколько часов. Расходы на разработку считаются низкими. Требуется минимальное число оборудования. Драйвер совместим с любой операционной системой.
  • Нет необходимости в «экзотических» наборах микросхем, поэтому система может использовать стандартные ПК-карты Ethernet для общения с недавно реализованным устройством. Поскольку стоимость Ethernet падает, сокращаются затраты на аппаратное обеспечение. Пользователи не привязаны к одному поставщику услуг для поддержки, но могут воспользоваться нынешними разработками.
  • Спецификация доступна бесплатно для скачивания, никаких дополнительных лицензионных сборов, необходимых для использования протоколов Modbus, не требуется.
  • Взаимодействие между устройствами разных производителей и совместимость с установленной базой совместимых устройств.

Стоят преобразователи протоколов Modbus дорого. Цена промышленных шлюзов составляет 1000 долларов.

Ограничения

Поскольку Modbus был разработан в конце 1970-х годов для связи с численность типов данных ограничена теми, которые были поняты ПЛК в то время. Большие двоичные объекты не поддерживаются.

Нет стандартного способа для узла, чтобы найти описание объекта данных, например, чтобы определить, представляет ли значение регистра - значение температуры между 30 и 175 градусами.

Поскольку Modbus является протоколом типа «ведущий/ведомый», для устройства нет возможности «сообщать об исключении» (кроме Ethernet TCP/IP, называемого open-mbus). Главный узел должен регулярно получать данные с дочерних устройств, а также искать изменения в данных. Это нагружает полосу пропускания, увеличивает время подключения к сети в приложениях, где пропускная способность может быть дорогой, например, в каналах с низкой скоростью передачи данных.

Modbus ограничивается адресацией 254 устройств на одной линии передачи данных, что ограничивает число устройств, которые могут быть подключены к мастер-станции (Ethernet TCP/IP является исключением). Передачи должны быть непрерывными, что ограничивает типы удаленных коммуникационных устройств теми, которые могут буферизовать данные, чтобы избежать пробелов в передаче. Сам протокол 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 -коммуникационный протокол, основан на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP (протокол Modbus TCP).

Сообщение Modbus RTU состоит из адреса устройства 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 для получения значения AO аналогового выхода (holding registers) из регистров от #40108 до 40110 с адресом устройства 17.

11 03 006B 0003 7687

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

11 03 06 AE41 5652 4340 49AD

11 Адрес устройства (17 = 11 hex) SlaveID
03 Функциональный код Function Code
06 Количество байт далее (6 байтов идут следом) Byte Count
AE (AE hex) Register value Hi (AO0)
41 (41 hex) Register value Lo (AO0)
56 Значение старшего разряда регистра (56 hex) Register value Hi (AO1)
52 Значение младшего разряда регистра (52 hex) Register value Lo (AO1)
43 Значение старшего разряда регистра (43 hex) Register value Hi (AO2)
40 Значение младшего разряда регистра (40 hex) Register value Lo (AO2)
49 Контрольная сумма CRC value Lo
AD Контрольная сумма CRC value Hi

Регистр аналогового выхода 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 бит значение.

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

Тип представления Диапазон значений Пример в HEX Будет в десятичной форме
16-bit unsigned integer 0 до 65535 AE41 44,609
16-bit signed integer -32768 до 32767 AE41 -20,927
two character ASCII string 2 знака AE41 ® A
discrete on/off value 0 и 1 0001 0001
32-bit unsigned integer 0 до 4,294,967,295 AE41 5652 2,923,517,522
32-bit signed integer -2,147,483,648 до 2,147,483,647 AE41 5652 -1,371,449,774
32-bit single precision IEEE floating point number 1,2·10−38 до 3,4×10+38 AE41 5652 -4.395978 E-11
four character ASCII string 4 знака AE41 5652 ® A V R

Какие бывают команды Modbus RTU?

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

Код функции Что делает функция Тип значения Тип доступа
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 RTU на чтение дискретного вывода? Команда 0x01

Эта команда используется для чтения значений дискретных выходов 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).

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
01 Функциональный код 01 Функциональный код
00 05 Количество байт далее
13 CD Значение регистра DO 27-20 (1100 1101)
00 Количество регистров Hi байт 6B Значение регистра DO 35-28 (0110 1011)
25 Количество регистров Lo байт B2 Значение регистра DO 43-36 (1011 0010)
0E Контрольная сумма CRC 0E Значение регистра DO 51-44 (0000 1110)
84 Контрольная сумма CRC 1B Значение регистра DO 56-52 (0001 1011)
45 Контрольная сумма CRC
E6 Контрольная сумма CRC

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

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

Модули с дискретным выводом: M-7065 , ioLogik R1214 , ADAM-4056S

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
02 Функциональный код 02 Функциональный код
00 Адрес первого регистра Hi байт 03 Количество байт далее
C4 Адрес первого регистра Lo байт AC Значение регистра DI 10204-10197 (1010 1100)
00 Количество регистров Hi байт DB Значение регистра DI 10212-10205 (1101 1011)
16 Количество регистров Lo байт 35 Значение регистра DI 10218-10213 (0011 0101)
BA Контрольная сумма CRC 20 Контрольная сумма CRC
A9 Контрольная сумма CRC 18 Контрольная сумма CRC

Модули с дискретным вводом: M-7053 , ioLogik R1210 , ADAM-4051

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
03 Функциональный код 03 Функциональный код
00 Адрес первого регистра Hi байт 06 Количество байт далее
6B Адрес первого регистра Lo байт AE Значение регистра Hi #40108
00 Количество регистров Hi байт 41 Значение регистра Lo #40108
03 Количество регистров Lo байт 56 Значение регистра Hi #40109
76 Контрольная сумма CRC 52 Значение регистра Lo #40109
87 Контрольная сумма CRC 43 Значение регистра Hi #40110
40 Значение регистра Lo #40110
49 Контрольная сумма CRC
AD Контрольная сумма CRC

Модули с аналоговым выводом: M-7024 , ioLogik R1241 , ADAM-4024

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
04 Функциональный код 04 Функциональный код
00 Адрес первого регистра Hi байт 02 Количество байт далее
08 Адрес первого регистра Lo байт 00 Значение регистра Hi #30009
00 Количество регистров Hi байт 0A Значение регистра Lo #30009
01 Количество регистров Lo байт F8 Контрольная сумма CRC
B2 Контрольная сумма CRC F4 Контрольная сумма CRC
98 Контрольная сумма CRC

Модули с аналоговым вводом: M-7017 , ioLogik R1240 , ADAM-4017+

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

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

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

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

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
05 Функциональный код 05 Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
AC Адрес первого регистра Lo байт AC Адрес первого регистра Lo байт
FF Значение Hi байт FF Значение Hi байт
00 Значение Lo байт 00 Значение Lo байт
4E Контрольная сумма CRC 4E Контрольная сумма CRC
8B Контрольная сумма CRC 8B Контрольная сумма CRC

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

Модули с дискретным выводом: M-7053 , ioLogik R1210 , ADAM-4051

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
06 Функциональный код 06 Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
01 Адрес первого регистра Lo байт 01 Адрес первого регистра Lo байт
00 Значение Hi байт 00 Значение Hi байт
03 Значение Lo байт 03 Значение Lo байт
9A Контрольная сумма CRC 9A Контрольная сумма CRC
9B Контрольная сумма CRC 9B Контрольная сумма CRC

Модули с аналоговым выводом: M-7024 , ioLogik R1241 , ADAM-4024

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
0F Функциональный код 0F Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
13 Адрес первого регистра Lo байт 13 Адрес первого регистра Lo байт
00 Количество регистров Hi байт 00
0A Количество регистров Lo байт 0A
02 Количество байт далее 26 Контрольная сумма CRC
CD Значение байт DO 27-20 (1100 1101) 99 Контрольная сумма CRC
01 Значение байт DO 29-28 (0000 0001)
BF Контрольная сумма CRC
0B Контрольная сумма CRC

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

Модули с дискретным выводом: M-7053 , ioLogik R1210 , ADAM-4051

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

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

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

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
10 Функциональный код 10 Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
01 Адрес первого регистра Lo байт 01 Адрес первого регистра Lo байт
00 Количество регистров Hi байт 00 Кол-во записанных рег. Hi байт
02 Количество регистров Lo байт 02 Кол-во записанных рег. Lo байт
04 Количество байт далее 12 Контрольная сумма CRC
00 Значение Hi 40002 98 Контрольная сумма CRC
0A Значение Lo 40002
01 Значение Hi 40003
02 Значение Lo 40003
C6 Контрольная сумма CRC
F0 Контрольная сумма CRC

В этой статье вы узнаете о протоколе 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.