Modbus tcp ip функциональный код 03. Сеть приборов, протокол MODBUS

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

Modbus RTU через TCP соединение

Самый простой способ обмена Modbus сообщениями через сеть – просто передавать Modbus RTU пакеты через TCP сокет (соединение). В этом случае формат пакетов такой же, как и для Modbus RTU протокола. В принципе на этом можно и закончить по этому типу протокола.

Modbus TCP

Для обмена Modbsu сообщениями по сети решили использовать модифицированный протокол. Взяли стандартный Modbus RTU и немного его изменили. Во-первых убрали из него последних 2 байта CRC16 . Так как каждый пакет TCP/IP содержит свою контрольную суму, решили что делать проверку еще раз не нужно. Кроме того убрали первый байт Slave ID . В принципе, Как будет видно дальше, Его не убрали, а просто переименовали. Вот эти байты, без Slave ID и CRC16 назвали PDU – Protocol Data Unit .

Например, возьмем запрос Modbus RTU , который читает несколько HOLDING регистров с устройства #17 (Slave ID = 17)

11 03 006B 0003 7687

Теперь убираем первый и последних 2 байта. Получаем PDU !

03 006B 0003

С этим вроде все ясно. Теперь, что бы получить полноценный пакет Modbus TCP нам нужно добавить впереди MBAP Header — Modbus Application Header . Т.е. нам нужно добавить некий заголовок. Этот заголовок включает в себя Transaction ID , Protocol ID , Length и Unit ID .

Transaction ID – 2 байта, которые устанавливаются клиентом, что бы однозначно идентифицировать каждый запрос. Т.е. это просто число от 0 до 65535 уникальное для каждого запроса.

Protocol ID – 2 байта, которые определяют версию протокола. В текущей реализации всегда должны быть равны 0x00 0x00

Length – 2 байта, которые определяют длину пакета (за исключением байтов Protocol ID , Transaction ID и Length )

Unit ID – уникальный адрес устройства, которое опрашивается данной командой. Идентично Slave ID .

Небольшое отступление по поводу адресации. Может показаться что это излишне, так как TCP соединение может быть установлено только на конкретный IP адрес и порт. Т.е. у нас уже есть конкретный адрес сервера, поэтому назначение Unit ID не совсем понятно.

Но на самом деле вполне обычна ситуация, когда есть некий сервер, который просто маршрутизирует Modbus RTU запросы на другие устройства, которые подсоединены к нему по различным каналам (локальная сеть, последовательный порт, CAN интерфейс). Поэтому клиент может использовать Modbus TCP сервер как шлюз (Gateway ) для общения с устройствами за ним.

Пример Modbus TCP сервера, который используется как шлюз для перенаправления запросов на Modbus RTU устройства

Вот пример из жизни. Есть некое устройство основанное на Linux. Это устройство выступает Modbus TCP сервером. Любой клиент может подсоединиться к публичному IP адресу на порт 502 и инициировать Modbus TCP соединение. К данному Linux устройству подключены сенсоры, которые использую последовательный порт RS485. Сенсоров много, они очень простые и не могут быть подключены к Internet, у них есть только порт RS485 и они понимают только Modbus RTU . Поэтому клиенты посылают Modbus TCP запросы с Unit ID сенсоров на Modbus TCP Сервер. Сервер декодирует Modbus TCP запрос и преобразует его в Modbus RTU и отправляет в порт RS485. После того как сенсор отвечает ему, он преобразует Modbus RTU ответ в Modbus TCP ответ и отсылает его назад, к Modbus TCP клиенту, который инициировал запрос. Таким образом, имея всего один публичный IP адрес можно опрашивать онлайн сотню сенсоров, которые даже не могут быть подсоединены к Интернету или локальной сети.

А теперь наглядная схема, чем отличается Modbus RTU запрос от Modbus TCP запроса.

Посмотрим пример байтов для двух запросов:

Modbus RTU: 11 03 006B 0003 7687 Modbus TCP: 0001 0000 0006 11 03 006B 0003

Пример ответа:

Modbus TCP: 0001 0000 0009 11 03 06 AE41 5652 4340 Modbus RTU: 11 03 06 AE41 5652 4340 49AD

Как видите, конвертировать запросы между Modbus RTU и Modbus TCP очень просто. Хотя реализация Modbus RTU через TCP может показаться самым простым способом для маршрутизации запросов, на самом деле в Modbus TCP есть несколько положительных моментов:

  • Не нужно вычислять CRC16
  • Есть возможность идентифицировать пару ответ / запрос используя Transaction ID
  • Можно легко добавлять свои версии протоколов, меняя константу Protocol ID

Данная статья описывает основы работы с протоколом Modbus. В статье вы можете найти:

  • Описание Modbus
  • Пример применения
  • Описание программы Onitex Modbus Terminal

Основные принципы Modbus

Modbus — коммуникационный протокол, основанный на клиент-серверной архитектуре. В данной статье мы рассмотрим основы протокола и базовые принципы работы. Кроме того, вы можете ознакомиться с конкретными примерами работы протокола Modbus, изучив описания контроллеров, использующих этот протокол, к примеру, OSM-17RA, а так же скачав программу Modbus Terminal, позволяющую удобно работать с различными регистрами Modbus.

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

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

Существует три типа протокола Modbus: Modbus ASCII, Modbus RTU и Modbus TCP. Устройства Onitex поддерживают протокол Modbus RTU, поэтому мы в дальнейшем будем иметь в виду прежде всего этот протокол.

Пакет данных в Modbus выглядит следующим образом:

Адрес | Код функции | Данные | Контрольная сумма.

Адрес - это поле, содержащее номер устройства, которому адресован запрос. Каждое устройство в сети должно иметь уникальный адрес. Устройство отвечает только на те запросы, которые поступают по его адресу, во избежание конфликтов. При этом, ведомое устройство в своем ответе так же посылает поле Адрес , кроме широковещательного запроса (когда ответа от ведомого быть вообще не должно).

Код функции содержит номер функции модбаса (о функциях будет сказано ниже). Функция может запрашивать данные или давать команду на определенные действия. Коды функций являются числами в диапазоне от 1 до 127. Функции с номерами от 128 до являются зарезервированными для пересылки в ответном сообщении информации об ошибках.

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

Поле Контрольная сумма является важным элементом протокола: в нем содержится информация, необходимая для проверки целостности сообщения и отсутствия ошибок передачи.

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

Существует три типа функций:

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

Modbus RTU

При использовании режима Modbus RTU сообщение начинается с так называемого интервала тишины, равного времени передачи 3.5 символов, при заданной скорости обмена. Первым полем передается адрес устройства. Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала. Фрейм сообщения передаётся непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный. Если новое сообщение начнется раньше интервала 3.5 символа, принимающее устройство воспримет его как продолжение предыдущего сообщения. В этом случае устанавливается ошибка CRC (несовпадение контрольной суммы).

Типы данных и стандартные функции Modbus

Типы данных протокола Modbus представлены в таблице:

Для чтения значений из этих выше таблиц данных используются функции с кодами 1—4 (0x01—0x04) :
1 (0x01) — чтение значений из нескольких регистров флагов (Read Coil Status)
2 (0x02) — чтение значений из нескольких дискретных входов (Read Discrete Inputs)
3 (0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers)
4 (0x04) — чтение значений из нескольких регистров ввода (Read Input Registers)

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

Запись одного значения происходит при помощи следующих функций:
5 (0x05) — запись значения одного флага (Force Single Coil)
6 (0x06) — запись значения в один регистр хранения (Preset Single Register)

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

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

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

Пример устройства Modbus

Рассмотрим работу протокола на примере контроллера шагового двигателя. В документации на контроллер описано назначение регистров Modbus, которые в нем использованы. Для управления двигателем необходимо задать параметры контроллера, параметры вращения и непосредственно команду. Вся работа с контроллером при использовании протокола Модбас сводится к работе с регистрами, то есть чтению и записи. Наш контроллер имеет всего один тип регистров: Holding Registers. Этот тип регистров предназначен как для чтения, так и для записи параметров. В контроллере использовано три типа регистров: 8, 16 и 32 бита. Таким образом, для работы с ним нам понадобится использование всего лишь нескольких функций: Read Holding Registers для чтения, Preset Single Register для записи регистров размерностью 8 и 16 бит, и Preset Multiple Registers для записи дначений в регистры длиной 32 бита.

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

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

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

Для отладки устройств с протоколом Modbus нами разработана программа OSM Modbus Terminal. Данная программа позволяет быстро освоить основные принципы управления устройствами OSM MB по протоколу Modbus RTU, проверить корректную работу устройства и быст-рее написать собственное программное обеспечение. Скачать программу можно в разделе Программное обеспечение на нашем сайте.

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

Для начала работы с программой необходимо установить адрес порта ПК и адрес устройства, и нажать кнопку «Connect». После этого можно производить чтение и запись в требуемые регистры. При необходимости можно сохранить названия и адреса используемых регистров кнопкой «Save». Программа написана с использованием OsmModbusDriver_SDK и может служить примером использования SDK.

Все права защищены. Перепечатка материалов с сайта возможно только с разрешения администрации

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 не обеспечивает защиту от несанкционированных команд или перехвата данных. Важно понимать, что в процессе передачи информации возникают логические ошибки, а также связанные с искажениями при обмене.

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

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

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

Введение

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

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

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

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

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

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

  • Modbus ASCII,

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

  • Modbus TCP.

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

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

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

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

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

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

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

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

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

Модель данных

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

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

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

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

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

Чтение данных

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

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

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

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

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

байт 1 байт 2 байт 3 байт 4 ... байт N-1 байт N
R A,1 R A,0 R A+1,1 R A+1,0 ... R A+Q-1,1 R A+Q-1,0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

RTU фрейм

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

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

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

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

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

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

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

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

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

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

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

Таблица 2-1. Кадр ответа (Slave→Master) при возникновении ошибки modbus RTU
Направление передачи адрес подчинённого устройства номер функции данные (или код ошибки) CRC


Структура сообщения протокола Modbus имеет следующий вид:

  1. адрес ведомого устройства – это адрес устройства, которому адресовано данное сообщение протокола Modbus. Устройства отвечают только на те сообщения, которые адресованы именно им. Ответ начинается с адреса ведомого устройства. Адрес изменяется в пределах 1…247. Адрес 0 в сообщении протокола Modbus зарезервирован под широковещательные сообщения, 248..255 – зарезервированные адреса.
  2. номер функции – 1 байт данных.
  3. данные – это поле содержит информацию о функции, которую нужно выполнить, либо данные, которые ведомое устройство посылает мастеру протокола Modbus.
  4. блок обнаружения ошибок (CRC) – контрольная сумма, которая вычисляется со всех предыдущих байт путем алгоритма циклического сдвига и побитового исключения.

Необходимо обратить внимание, что при чтении по протоколу Modbus в одном сообщении можно считывать значение дискретных или аналоговых входов и выходов, расположенных подряд, то есть задать адрес первого значения и их количество.

Рассмотрим основные стандартные функции по их кодам (в десятичном и шестнадцатеричном формате):
1 (0х01) – чтение нескольких дискретных выходов
2 (0х02) - чтение нескольких дискретных входов
3 (0х03) - чтение нескольких промежуточных регистров или аналоговых выходов
4 (0х04) – чтение нескольких аналоговых входов
Если, например, количество дискретных входов, которые сформированы в запросе, не кратно восьми, то количество байт значений округляется в большую сторону и, соответственно, для получения, например, значений 15 дискретных входов, это количество будет равно двум байтам.
Перед данными сообщения Modbus передается один байт, значение которого - количество байт данных.
5 (0x05) - запись значения одного дискретного выхода
6 (0x06) - запись значения одного аналогового выхода или регистра
Команда Modbus состоит из адреса и собственно значения (2 байта). Нормальный ответ – повтор запроса протокола Modbus.
15 (0x0F) - запись значений в нескольких дискретных выходов
16 (0x10) - запись значений нескольких аналоговых выходов или регистров
Ответ состоит из начального адреса регистра и количества измененных значений.
Пример запроса/ответа протокола Modbus:

Ошибки при передаче делятся на 2 типа – искажение при передаче и логические. Искажение отслеживается по времени «тишины». Нормальное время между сообщениями – время, необходимое на передачу 3,5 символов. Если во время передачи сообщения протокола Modbus возникла пауза длинной более 1,5 символа, пакет отбрасывается.

Логические ошибки протокола Modbus возникают, если slave не может принять сообщение вообще, либо принимает его, но выдает ошибку. В таком случае ошибка диагностируется по тайм-ауту. Slave принимает запрос, но не может его обработать (к примеру, обращение к несуществующему адресу) – в таком случае отсылается сообщение об ошибке.

Пример сообщения Modbus об ошибке на запрос:

Стандартные коды ошибок протокола Modbus:
01 -Функция не может быть обработана на slave.
02 - Несуществующий адрес данных.
03 - Значение в поле данных для запроса, является недопустимым для salve.
04 - Произошла необратимая ошибка, пока slave пытался выполнить действие.
05 - Slave принял запрос и начал обрабатывать его, но на это потребуется время. Этот код предохраняет master от выдачи ошибки тайм-аута.
06 - Slave занят обработкой команды.Master должен повторить посылку сообщения позже, когда slave будет свободен.
07 -Slave не может выполнить функцию из запроса. Master должен послать запрос об диагностической информации или получить информацию об ошибках со slave.
08 - Slave пытается считать область памяти, но при этом обнаружена ошибка паритета. Master может повторить запрос, но обычно в таких случаях требуется ремонт.

Структура кадра Modbus TCP:

Где:
ID транзакции - два байта
ID протокола - два байта (четыре нуля)
длина пакета - два байта, размер последующих полей сообщения
адрес ведомого устройства - адрес slave, которому адресован запрос протокола Modbus.
Особенность протокола Modbus TCP – отсутствие контрольной суммы, так как на транспортном уровне протокола TCP происходит проверка CRC. Поэтому проверка контрольной суммы в формате RTU не имеет смысла.




Top