ModbusModbus — открытый коммуникационный протокол, основанный на архитектуре ведущий — ведомый (англ. master-slave; в стандарте Modbus используются термины client-server). Широко применяется в промышленности для организации связи между электронными устройствами. Может использоваться для передачи данных через последовательные линии связи RS-485, RS-422, RS-232 и сети TCP/IP (Modbus TCP). Также существуют нестандартные реализации, использующие UDP[1][2]. Не следует путать «Modbus» и «Modbus Plus». Modbus Plus — проприетарный протокол, принадлежащий Schneider Electric (физический уровень Modbus Plus уникальный, похож на Ethernet 10BASE-T, полудуплекс по одной витой паре, скорость 2 Мбит/с; транспортный протокол Modbus Plus — HDLC, поверх которого специфицировано расширение для передачи Modbus PDU). JBUS — подмножество протокола Modbus RTU с небольшими отличиями в способе адресации[3]. ИсторияModbus был разработан компанией Modicon (в настоящее время принадлежит Schneider Electric) для использования в своих контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году[4]. Это был открытый стандарт, описывающий формат сообщений и способы их передачи в сети, состоящей из различных электронных устройств. Первоначально контроллеры MODICON использовали последовательный интерфейс RS-232[4]. Позднее стал применяться интерфейс RS-485, так как он обеспечивает более высокую надёжность, позволяет использовать более длинные линии связи и подключать к одной линии несколько устройств. Многие производители электронного оборудования поддержали стандарт, на рынке появились сотни использующих его изделий. Стандарт ModbusВ настоящее время развитием Modbus занимается некоммерческая организация Modbus-IDA[5]. Специфическая терминология
Modbus специфицирует 4 типа данных:
Состав стандартаСтандарты Modbus состоят из 3 частей:
Достоинства стандартаОсновные достоинства стандарта — открытость и массовость. Промышленностью сейчас (2014 г.) выпускается очень много типов и моделей датчиков, исполнительных устройств, модулей обработки и нормализации сигналов и др. Практически все промышленные системы контроля и управления имеют программные драйверы для работы с Modbus-сетями. Недостатки стандартаСтандарт в своей основе был разработан в 1979 году с учётом потребностей и вычислительных возможностей того времени, и многие актуальные для современных промышленных сетей вопросы не были учтены[6]. Отсутствие перечисленных возможностей является следствием простоты протокола, которая облегчает его изучение и ускоряет внедрение.
ВведениеКонтроллеры на шине Modbus взаимодействуют, используя модель ведущий — ведомый, основанную на транзакциях, состоящих из запроса и ответа. Обычно в сети есть только одно ведущее client (по старой терминологии master) устройство, и несколько ведомых server (по старой терминологии slave) устройств. (Терминология верна, несмотря на противоположные значения в типичной клиент-серверной архитектуре.) Ведущее устройство инициирует транзакции (передаёт запросы). Ведущий может адресовать запрос индивидуально любому ведомому или инициировать передачу широковещательного сообщения для всех ведомых устройств. Ведомое устройство, опознав свой адрес, отвечает на запрос, адресованный именно ему. При получении широковещательного запроса ответ ведомыми устройствами не формируется. Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1…127. Диапазон значений 128…255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.
Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи. Существуют три варианта ADU, два для передачи данных через асинхронный интерфейс и один — через TCP/IP сети:
Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):
где
Максимальный размер ADU для последовательных сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт. Для Modbus TCP ADU выглядит следующим образом:
где
Следует обратить внимание, что поле контроля ошибок в Modbus TCP отсутствует, так как целостность данных обеспечивает TCP/IP-стек. Категории кодов функцийВ действующей в настоящее время спецификации протокола определяются три категории кодов функций:
Модель данныхОдно из типичных применений протокола — чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре таблицы данных:
Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы. В этом случае команды, работающие с дискретными данными и с 16-битными регистрами, будут фактически обращаться к одним и тем же данным. Со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения. Справочное руководство от 1996 года https://modbus.org/docs/PI_MBUS_300.pdf, где неявно была принята похожая адресация, помечено как устаревшее ("obsolete" и "FOR LEGACY APPLICATIONS ONLY"), текущая спецификация протокола https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf использует только абсолютную адресацию - 01 (0x01) Read Coils 0x0000 to 0xFFFF, 03 (0x03) Read Holding Registers 0x0000 to 0xFFFF. Стандартные функции протокола Modbus
M()1 и M()0 - соответствующие маски функции 22
Доступ к даннымЧтение данныхДля чтения значений из перечисленных выше таблиц данных используются функции с кодами 1—4 (шестнадцатеричные значения 0x01—0x04):
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым. В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных. Значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым:
Значения флагов и дискретных входов передаются в упакованном виде: по одному биту на флаг. Единица означает включённое состояние, ноль — выключенное. Значения запрошенных флагов заполняют сначала первый байт, начиная с младшего бита, затем следующие байты, также от младшего бита к старшим. Младший бит первого байта данных содержит значение флага, указанного в поле «адрес». Если запрошено количество флагов, не кратное восьми, то значения лишних битов заполняются нулями:
Запись одного значения
Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта). Для регистра хранения значение является просто 16-битным словом. Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы. Если команда выполнена успешно, ведомое устройство возвращает копию запроса. Запись нескольких значений
Команда состоит из адреса элемента, количества изменяемых элементов, количества передаваемых байт устанавливаемых значений и самих устанавливаемых значений. Данные упаковываются так же, как в командах чтения данных. Ответ состоит из начального адреса и количества изменённых элементов. Изменение регистров
Команда состоит из адреса регистра и двух 16-битных чисел, которые используются как маски, с помощью которых можно индивидуально сбросить или установить отдельные биты в регистре. Конечный результат определяется формулой: Результат = (Текущее_значение AND Маска_И) OR (Маска_ИЛИ AND (NOT Маска_И)) Чтение с записью
Этот код функции выполняет комбинацию одной операции чтения и одной операции записи в одной транзакции Modbus. Очереди данных
Функция предназначена для получения 16-битных слов из очереди, организованной по принципу «первым пришёл — первым ушёл» (FIFO). Доступ к файлам
Эти функции используются для доступа к 16-битным регистрам, организованным в файлы, состоящие из записей произвольной длины. В команде указывается номер файла, номер записи и длина записи в 16-битных словах. С помощью одной команды можно записать или прочитать несколько записей, не обязательно соседних. Кроме того, команда содержит однобайтовый код для указания типа ссылки на данные. В действующей версии стандарта определен только один тип (описанный выше) с кодом 0x06. ДиагностикаПеречисленные ниже функции предназначены для устройств на последовательных линиях связи (Modbus RTU и Modbus ASCII).
Функция предназначена для получения информации об индикаторах состояния на удалённом устройстве. Функция возвращает один байт, каждый бит которого соответствует состоянию одного индикатора.
Эти функции предназначены для проверки функционирования последовательной линии связи.
Функция предназначена для получения информации о типе устройства и его состоянии. Формат ответа зависит от устройства. Другие
Функция предназначена для передачи данных в произвольных форматах (определённых другими стандартами) от ведущего (client) к ведомому (server) и обратно. Тип передаваемых данных определяется дополнительным кодом (MEI — Modbus Encapsulated Interface), передаваемым после номера функции. Стандарт определяет MEI 13 (0x0D), предназначенный для инкапсуляции протокола CANopen. MEI 14 (0x0E) используется для получения информации об устройстве и MEI в диапазонах 0—12 и 15—255 зарезервированы. Обработка ошибокВо время обмена данными могут возникать ошибки двух типов:
При передаче по асинхронным линиям связи ошибки первого типа обнаруживаются при помощи проверки соответствия принятого запроса установленному формату ADU и вычисления контрольной суммы. Дополнительно для проверки каждого символа может использоваться бит четности. Если подчинённое устройство обнаруживает искажение данных, принятый запрос игнорируется, ответное сообщение не формируется. Главное устройство может обнаружить ошибку по отсутствию ответа. В Modbus TCP дополнительная проверка целостности данных не предусмотрена. Передача данных без искажений обеспечивается протоколами TCP/IP. При ошибках второго типа подчинённое устройство отсылает сообщение об ошибке (если запрос адресован этому устройству; на широковещательные запросы ответ не отправляется). Признаком того, что ответ содержит сообщение об ошибке, является установленный старший бит номера функции. За номером функции, вместо обычных данных, следует код ошибки и, при необходимости, дополнительные данные об ошибке. Стандартные коды ошибок
ПримерыНиже приведён пример команды ведущего устройства и ответов ведомого (для Modbus RTU).
Примечания
Литература
Ссылки
|