Modbus network linking a controller with distributed field devices

Modbus: оригинальный промышленный протокол полевой шины

Modbus remains widely deployed because its data model is simple, not because every implementation is simple. This guide explains frames, register mapping, ti...

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

Существует множество популярных технологий полевых шин, включая Modbus, Profibus, Foundation Fieldbus, ControlNet, DeviceNet и многие другие.

В 1979 году компания Modicon представила новый протокол, задействующий прикладной уровень модели OSI и специально предназначенный для использования с её ПЛК. Этот протокол получил название Modbus и стал первой широко используемой полевой шиной в истории автоматизации.

 

ПЛК, подключённый к полевым устройствам через полевую шину

Рисунок 1. ПЛК, подключённый к полевым устройствам 

 

Введение в Modbus

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

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

Изначально Modbus работал поверх последовательного соединения, то есть RS-232/RS-485. Эти варианты по-прежнему широко используются под названиями Modbus RTU и Modbus ASCII. Впоследствии протокол был адаптирован для работы поверх TCP/IP и Ethernet. Обычно его называют Modbus TCP; это наиболее распространённая реализация Modbus в современных установках.

 

Модель обмена данными

Modbus использует модель «ведущий/ведомый» для обмена данными (клиент/сервер в Modbus TCP). Ведущий Modbus отправляет запрос ведомому Modbus, который выполняет действия и отвечает ведущему. В этом случае ведущим часто выступает ПЛК, а полевые устройства работают как ведомые. 

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

PDU обычно состоит из кода функции и некоторых данных. В ADU они инкапсулируются вместе с адресом и кодом проверки ошибок. Modbus TCP использует заголовок MBAP (Modbus Application Protocol) в ADU.

 

Рисунок 2. ADU и PDU Modbus для Modbus ASCII/RTU (вверху) и Modbus TCP (внизу). Изображение адаптировано из Modbus.org

 

Чтобы PDU оставался независимым от используемого уровня связи, он должен соответствовать ограничениям по размеру, установленным исходной спецификацией последовательной передачи данных. Размер ADU для RS-485 составлял 256 байт. Таким образом, необходимо учесть ADU — 1 байт адреса и 2 байта проверки ошибок, — то есть общий размер PDU ограничен 253 байтами. Обратите внимание, что адрес в ADU фактически является идентификатором ведомого устройства в сети Modbus.

Часть данных PDU содержит поля, специфичные для кода функции, а также фактически передаваемые данные. Эти поля будут подробно рассмотрены далее в статье.

 

Представление данных

Классический Modbus поддерживает два режима передачи: ASCII и RTU.

В режиме ASCII данные передаются в виде ASCII-символов 0–9 и A–F, а в режиме RTU данные представлены в 8-битном двоичном формате. Данные и адреса кодируются в порядке от старшего байта к младшему, поэтому сначала передаётся наиболее значимый байт.

Данные Modbus представлены четырьмя основными типами:

  • Дискретные входы
  • Катушки (выходы)
  • Регистры входов
  • Регистры хранения

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

 

Рисунок 3. Взято из спецификации протокола Modbus

 

Для каждого типа в памяти устройства может находиться не более 2^16 (65536) элементов данных. Для доступа к каждому из различных типов данных предусмотрены определённые коды функций, при этом каждый тип часто имеет собственный выделенный блок памяти.

Для адресации элемента данных ведущий использует диапазон от 0 до 65535. Элемент данных 1 находится по адресу 0x0000. Элемент данных 2 — по адресу 0x0001. Элемент данных 65536 находится по адресу 0xFFFF. Следует учитывать, что устройства не обязаны иметь все 65536 элементов данных; фактически большинство удалённых терминалов ввода-вывода, использующих Modbus, располагают значительно меньшим количеством элементов, чем этот максимальный предел.

 

Транзакции Modbus

Понимая, как представлены данные в Modbus, мы можем подробно рассмотреть транзакции. Мы будем рассматривать их с точки зрения PDU, поскольку PDU не зависит от уровня связи.

В транзакциях Modbus используются инструкции с шестнадцатеричными символами, где один 8-битный байт имеет формат 0x00, а диапазон каждого символа составляет от 0 до F. Таким образом, 16-битный регистр равен двум байтам, представленным в формате 0x0000. 

Спецификация Modbus определяет три типа PDU:

  • Запрос Modbus
  • Ответ Modbus
  • Ответ об исключении Modbus

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

Спецификация Modbus определяет ряд кодов функций. Код функции 0x01 соответствует функции чтения катушек.

На рисунке 4 показан пример того, как могут выглядеть запрос и ответ для операции чтения катушек. Ведущее устройство Modbus отправляет запрос с кодом функции 0x01 (чтение катушек), начиная с первого элемента данных (адрес 0x0000) и считывая только одну катушку. Функцию чтения катушек можно использовать для одновременного считывания до 2000 (0x7D0) катушек. 

 

Рисунок 4. Транзакция чтения катушек

 

В случае успеха ведомое устройство отвечает тем же кодом функции и количеством катушек, состояние которых оно передаёт. Состояние катушек занимает n байт, при этом каждый бит указывает, находится ли соответствующая катушка в состоянии ВКЛ (1) или ВЫКЛ (0).

В данном случае катушка по адресу 0x0000 находится в состоянии ВКЛ. Если бы запрос не был выполнен успешно, ответ с исключением содержал бы код функции с установленным старшим битом (0x81), а также код исключения, объясняющий причину ошибки. Код исключения 0x02 означает, что был использован недопустимый адрес данных, то есть в памяти этого ведомого устройства отсутствует катушка по адресу 0x0000. 

В следующем примере показана транзакция записи в один регистр (код функции 0x06). Здесь ведущее устройство запрашивает запись данных 0xA0A0 по адресу 0x00FF. Ответ ведомого устройства представляет собой простое эхо запроса.

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

 

Рисунок 5. Транзакция записи в один регистр 

 

Все коды функций Modbus имеют структуру, аналогичную двум приведённым выше примерам.

На рисунке 6 приведён список распространённых кодов функций, а также кодов исключений для ответов с исключениями. Дополнительную информацию см. в спецификации Modbus. 

 

Рисунок 6. Коды функций и коды исключений

 

Заключение

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

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

 

Исходная статья опубликована в 2019 году

Modbus: оригинальный промышленный протокол полевой шины

Modbus remains widely deployed because its data model is simple, not because every implementation is simple. This guide explains frames, register mapping, timing, diagnostics, and the design limits...

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

Существует множество популярных технологий полевых шин, включая Modbus, Profibus, Foundation Fieldbus, ControlNet, DeviceNet и многие другие.

В 1979 году компания Modicon представила новый протокол, задействующий прикладной уровень модели OSI и специально предназначенный для использования с её ПЛК. Этот протокол получил название Modbus и стал первой широко используемой полевой шиной в истории автоматизации.

 

ПЛК, подключённый к полевым устройствам через полевую шину

Рисунок 1. ПЛК, подключённый к полевым устройствам 

 

Введение в Modbus

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

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

Изначально Modbus работал поверх последовательного соединения, то есть RS-232/RS-485. Эти варианты по-прежнему широко используются под названиями Modbus RTU и Modbus ASCII. Впоследствии протокол был адаптирован для работы поверх TCP/IP и Ethernet. Обычно его называют Modbus TCP; это наиболее распространённая реализация Modbus в современных установках.

 

Модель обмена данными

Modbus использует модель «ведущий/ведомый» для обмена данными (клиент/сервер в Modbus TCP). Ведущий Modbus отправляет запрос ведомому Modbus, который выполняет действия и отвечает ведущему. В этом случае ведущим часто выступает ПЛК, а полевые устройства работают как ведомые. 

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

PDU обычно состоит из кода функции и некоторых данных. В ADU они инкапсулируются вместе с адресом и кодом проверки ошибок. Modbus TCP использует заголовок MBAP (Modbus Application Protocol) в ADU.

 

Рисунок 2. ADU и PDU Modbus для Modbus ASCII/RTU (вверху) и Modbus TCP (внизу). Изображение адаптировано из Modbus.org

 

Чтобы PDU оставался независимым от используемого уровня связи, он должен соответствовать ограничениям по размеру, установленным исходной спецификацией последовательной передачи данных. Размер ADU для RS-485 составлял 256 байт. Таким образом, необходимо учесть ADU — 1 байт адреса и 2 байта проверки ошибок, — то есть общий размер PDU ограничен 253 байтами. Обратите внимание, что адрес в ADU фактически является идентификатором ведомого устройства в сети Modbus.

Часть данных PDU содержит поля, специфичные для кода функции, а также фактически передаваемые данные. Эти поля будут подробно рассмотрены далее в статье.

 

Представление данных

Классический Modbus поддерживает два режима передачи: ASCII и RTU.

В режиме ASCII данные передаются в виде ASCII-символов 0–9 и A–F, а в режиме RTU данные представлены в 8-битном двоичном формате. Данные и адреса кодируются в порядке от старшего байта к младшему, поэтому сначала передаётся наиболее значимый байт.

Данные Modbus представлены четырьмя основными типами:

  • Дискретные входы
  • Катушки (выходы)
  • Регистры входов
  • Регистры хранения

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

 

Рисунок 3. Взято из спецификации протокола Modbus

 

Для каждого типа в памяти устройства может находиться не более 2^16 (65536) элементов данных. Для доступа к каждому из различных типов данных предусмотрены определённые коды функций, при этом каждый тип часто имеет собственный выделенный блок памяти.

Для адресации элемента данных ведущий использует диапазон от 0 до 65535. Элемент данных 1 находится по адресу 0x0000. Элемент данных 2 — по адресу 0x0001. Элемент данных 65536 находится по адресу 0xFFFF. Следует учитывать, что устройства не обязаны иметь все 65536 элементов данных; фактически большинство удалённых терминалов ввода-вывода, использующих Modbus, располагают значительно меньшим количеством элементов, чем этот максимальный предел.

 

Транзакции Modbus

Понимая, как представлены данные в Modbus, мы можем подробно рассмотреть транзакции. Мы будем рассматривать их с точки зрения PDU, поскольку PDU не зависит от уровня связи.

В транзакциях Modbus используются инструкции с шестнадцатеричными символами, где один 8-битный байт имеет формат 0x00, а диапазон каждого символа составляет от 0 до F. Таким образом, 16-битный регистр равен двум байтам, представленным в формате 0x0000. 

Спецификация Modbus определяет три типа PDU:

  • Запрос Modbus
  • Ответ Modbus
  • Ответ об исключении Modbus

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

Спецификация Modbus определяет ряд кодов функций. Код функции 0x01 соответствует функции чтения катушек.

На рисунке 4 показан пример того, как могут выглядеть запрос и ответ для операции чтения катушек. Ведущее устройство Modbus отправляет запрос с кодом функции 0x01 (чтение катушек), начиная с первого элемента данных (адрес 0x0000) и считывая только одну катушку. Функцию чтения катушек можно использовать для одновременного считывания до 2000 (0x7D0) катушек. 

 

Рисунок 4. Транзакция чтения катушек

 

В случае успеха ведомое устройство отвечает тем же кодом функции и количеством катушек, состояние которых оно передаёт. Состояние катушек занимает n байт, при этом каждый бит указывает, находится ли соответствующая катушка в состоянии ВКЛ (1) или ВЫКЛ (0).

В данном случае катушка по адресу 0x0000 находится в состоянии ВКЛ. Если бы запрос не был выполнен успешно, ответ с исключением содержал бы код функции с установленным старшим битом (0x81), а также код исключения, объясняющий причину ошибки. Код исключения 0x02 означает, что был использован недопустимый адрес данных, то есть в памяти этого ведомого устройства отсутствует катушка по адресу 0x0000. 

В следующем примере показана транзакция записи в один регистр (код функции 0x06). Здесь ведущее устройство запрашивает запись данных 0xA0A0 по адресу 0x00FF. Ответ ведомого устройства представляет собой простое эхо запроса.

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

 

Рисунок 5. Транзакция записи в один регистр 

 

Все коды функций Modbus имеют структуру, аналогичную двум приведённым выше примерам.

На рисунке 6 приведён список распространённых кодов функций, а также кодов исключений для ответов с исключениями. Дополнительную информацию см. в спецификации Modbus. 

 

Рисунок 6. Коды функций и коды исключений

 

Заключение

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

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

 

Исходная статья опубликована в 2019 году

Оставить комментарий

Обратите внимание, комментарии должны быть одобрены перед публикацией.