Modbus или MODBUS — это протокол передачи данных клиент/сервер на прикладном уровне . [1] Первоначально он был опубликован компанией Modicon (ныне Schneider Electric ) в 1979 году для использования с ее программируемыми логическими контроллерами (ПЛК). [2] Modbus стал де-факто стандартным протоколом связи для связи между промышленными электронными устройствами в широком диапазоне шин и сетей. [3] [1]
Modbus популярен в промышленных средах, поскольку он публикуется открыто и не требует лицензионных отчислений . Он был разработан для промышленных приложений, относительно прост в развертывании и обслуживании по сравнению с другими стандартами и накладывает мало ограничений на формат передаваемых данных.
Протокол Modbus использует последовательные линии связи , Ethernet или набор интернет-протоколов в качестве транспортного уровня. [1] Modbus поддерживает связь между несколькими устройствами, подключенными к одному кабелю или сети Ethernet. Например, может быть устройство, которое измеряет температуру, и другое устройство для измерения влажности, подключенное к одному и тому же кабелю, и оба передают результаты измерений на один и тот же компьютер через Modbus.
Modbus часто используется для соединения компьютера управления предприятием/системой с удаленным терминальным устройством (RTU) в системах диспетчерского управления и сбора данных ( SCADA ). Многие типы данных названы в честь промышленного управления заводскими устройствами, например, релейная логика, из-за ее использования в управляющих реле: однобитовый физический выход называется катушкой , а однобитовый физический вход называется дискретным входом или дискретным входом . контакт . _
Разработкой и обновлением протоколов Modbus занимается организация Modbus [4] с апреля 2004 года, когда Schneider Electric передала права этой организации. [5] Организация Modbus — это ассоциация пользователей и поставщиков устройств, совместимых с Modbus, которая выступает за дальнейшее использование этой технологии. [6] Modbus Organization, Inc. — торговая ассоциация , занимающаяся продвижением и развитием протокола Modbus. [4]
Стандарты связи или шины, используемые для связи Modbus: [1]
Для поддержки связи Modbus в сети многие модемы и шлюзы разработаны собственной разработкой (Ссылка на рисунок: Архитектура сети для связи Modbus ). В различных реализациях используется проводная или беспроводная связь, например, в радиодиапазоне ISM и даже служба коротких сообщений (SMS) или служба пакетной радиосвязи общего пользования (GPRS).
Modbus определяет клиента , который является объектом, который инициирует транзакцию для запроса какой-либо конкретной задачи у своего «получателя запроса». [7] «Получатель запроса» клиента, с которым клиент инициировал транзакцию, затем называется сервером . [7] Например, когда MCU подключается к датчику для считывания его данных по Modbus в проводной сети, например, по шине RS485, MCU в этом контексте является клиентом, а датчик — сервером.
Modbus определяет блок данных протокола ( PDU ) независимо от протоколов нижнего уровня в своем стеке протоколов. Для сопоставления протокола MODBUS с конкретными шинами или сетью требуются некоторые дополнительные поля, которые определяются как блок данных приложения ( ADU ). ADU формируется клиентом внутри сети Modbus, когда клиент инициирует транзакцию. Содержание: [8]
Организация Modbus официально называет ADU кадром Modbus [8] , хотя кадр используется в качестве единицы данных на канальном уровне в моделях OSI и TCP/IP (в то время как Modbus является протоколом прикладного уровня).
Максимальный размер PDU — 253 байта. Максимальный размер ADU в сети RS232/RS485 составляет 256 байт, а в TCP — 260 байт. [9]
Для кодирования данных Modbus использует представление адресов и полей данных с обратным порядком байтов. Таким образом, для 16-битного значения первым отправляется старший байт. Например, если 16-битный регистр имеет значение 0x1234, байт 0x12 отправляется перед байтом 0x34. [9]
Код функции составляет 1 байт, который дает код функции для выполнения. Коды функций представляют собой целочисленные значения в диапазоне от 1 до 255, а диапазон от 128 до 255 предназначен для ответов об исключениях.
Поле данных PDU имеет адрес от 0 до 65535 (не путать с адресом поля Дополнительный адрес ADU). [10] Поле данных PDU может быть пустым и тогда иметь размер 0. В этом случае сервер не будет запрашивать какую-либо информацию, а код функции определяет функцию, которая должна быть выполнена. Если в процессе выполнения не возникло ошибок, поле данных ответа ADU от сервера клиенту будет включать запрошенные данные, т.е. данные, которые клиент ранее получил. В случае возникновения какой-либо ошибки сервер ответит кодом исключения. [7]
Транзакция Modbus между клиентом и сервером включает в себя: [7] [11]
Исходя из этого, Modbus определяет 3 типа PDU: [9]
mb_req_pdu = код функции (1 байт) + данные запроса (n байт)
Размер поля данных запроса зависит от кода функции и обычно включает в себя такие значения, как значение переменной, смещение данных, коды подфункций...
mb_rsp_pdu = код функции (1 байт) + данные ответа (n байт)
Как и в mb_req_pdu, размер поля данных ответа зависит от кода функции и обычно включает в себя такие значения, как значение переменной, смещение данных, коды подфункций...
mb_excep_rsp_pdu = Код функции исключения (1 байт) + код исключения (1 байт)
Исключение Код функции = Код функции (1 байт) + 0x80
В этом случае старший бит кода функции будет равен 1, а его левый бит равен коду функции.
Код исключения (1 байт) mb_excep_rsp_pdu определен в таблице «Коды исключений MODBUS».
Modbus определяет свою модель данных на основе серии таблиц с четырьмя основными таблицами: [12]
Modbus определяет три типа функциональных кодов: общедоступные, определяемые пользователем и зарезервированные. [14]
Примечание . В некоторых источниках используется терминология, отличная от стандартной; например , Force Single Coil вместо Write Single Coil . [15]
Код функции 01 (чтение катушек) позволяет считывать состояние катушек от 1 до 2000 удаленного устройства. Тогда mb_req_pdu (PDU запроса) будет иметь 2 байта для указания адреса первой катушки для чтения (от 0x0000 до 0xFFFF) и 2 байта для указания количества катушек для чтения. mb_req_pdu определяет адрес катушки по индексу 0, т.е. 1-я катушка (самая первая катушка) имеет адрес 0x0. mb_rsp_pdu (ответный PDU) - в случае успешного чтения - имеет 1 байт для указания количества байтов, которое представляет собой количество катушек, требуемых mb_req_pdu , а левые байты хранят состояние (значение включения/выключения) этих запрошенных катушек. [16] В частности, mb_rsp_pdu и mb_rsp_pdu функционального кода 01: [16]
mb_req_pdu :
mb_rsp_pdu
Например, mb_req_pdu и mb_rsp_pdu для чтения статуса катушек от 20 до 38 будут такими: [17]
mb_req_pdu :
Начальный адрес (2 байта) — 0x0013 (или 19 в десятичном формате), что соответствует 20-й катушке.
Количество выходов (2 байта) равно 0x0013 (или 19 в десятичном формате), что соответствует 19 значениям состояния катушек с 20-й по 38-ю.
mb_rsp_pdu :
Поскольку требуется 19 катушек (20-38), для индикации состояния катушки используется 3 байта. Итак, количество байт равно 0x03. Состояния катушки с 20 по 27 — это 0xCD, что равно 1100 1101 в двоичном формате. Таким образом, катушка 27 — это старший бит, а катушка 20 — младший бит. То же самое для катушек с 28 по 35. Для катушек с 36 по 38 состояние будет 0x05, что равно 0000 0101. Состояние катушки 38 — это 3-й бит (отсчет справа), т.е. 1, катушка 37 — 0, а катушка 36. состояние — это младший бит, т.е. 1. Все 5 левых битов равны 0.
Коды функций, определяемые пользователем, — это коды функций, определяемые пользователями. Modbus предоставляет два диапазона значений для кодов функций, определяемых пользователем: от 65 до 72 и от 100 до 110. Очевидно, что коды функций, определяемые пользователем, не уникальны. [14]
Зарезервированные функциональные коды — это функциональные коды, используемые некоторыми компаниями для устаревших продуктов и недоступные для публичного использования. [14]
Когда клиент отправляет запрос на сервер, для этого запроса может быть четыре возможных события: [18]
Ответное сообщение об исключении включает в себя два других поля по сравнению с обычным ответным сообщением: [18]
Все коды исключений Modbus: [19]
Стандарт Modbus также определяет Modbus over Serial Line , протокол уровня канала передачи данных модели OSI для протокола прикладного уровня Modbus, который должен передаваться по последовательной шине . [20] Протокол последовательной линии Modbus — это протокол «ведущий-подчиненный» , который поддерживает одного ведущего и несколько ведомых устройств на последовательной шине. [21] При использовании протокола Modbus на прикладном уровне для устройств на канале связи используется модель клиент/сервер. При использовании Modbus через последовательную линию роль клиента реализуется ведущим устройством , а роль сервера — ведомым устройством . [21] [22]
Соглашение об именах организации меняет общепринятое использование нескольких клиентов и только одного сервера. Чтобы избежать этой путаницы, на транспортном уровне RS-485 используются термины «узел» или «устройство» вместо «сервер», а «клиент» не является «узлом». [22]
(Организация Modbus) использует термин «клиент-сервер» для описания связи Modbus, характеризующейся связью между [клиентскими устройствами, которые инициируют связь и отправляют запросы серверному устройству(ам), которые обрабатывают запросы и возвращают соответствующий ответ ( или сообщение об ошибке).
Последовательная шина для Modbus over Serial Line может иметь максимум 247 ведомых устройств , обменивающихся данными с 1 ведущим устройством . Эти ведомые устройства имеют уникальный адрес в диапазоне от 1 до 247 (десятичное значение). [23] Мастеру не обязательно иметь адрес. [23] Процесс связи инициируется ведущим устройством, поскольку только оно может инициировать транзакцию Modbus. Подчиненное устройство никогда не будет передавать какие-либо данные или выполнять какое-либо действие без запроса от ведущего, и подчиненные не могут взаимодействовать друг с другом. [24]
В Modbus по последовательной линии ведущий инициирует запросы к ведомым устройствам в одноадресном или широковещательном режиме. В одноадресном режиме ведущий инициирует запрос к одному ведомому устройству с определенным адресом. После получения и завершения запроса ведомое устройство ответит сообщением ведущему. [23] В этом режиме транзакция Modbus включает два сообщения: один запрос от ведущего устройства и один ответ от ведомого устройства. Каждое ведомое устройство должно иметь уникальный адрес (от 1 до 247), к которому можно обращаться независимо для связи. [23] В режиме широковещания ведущий может отправить запрос всем ведомым устройствам, используя широковещательный адрес 0 , [23] который является адресом, зарезервированным для широковещательного обмена (а не адресом ведущего). Подчиненные устройства должны принимать широковещательные обмены, но не должны отвечать. [24] Сопоставление PDU Modbus с последовательной шиной Modbus по протоколу последовательной линии приводит к созданию PDU последовательной линии Modbus. [23]
PDU последовательной линии Modbus = адрес + PDU + CRC (или LRC)
С PDU = код функции + данные
На физическом уровне MODBUS по последовательной линии осуществляет побитовую связь по RS485 или RS232 , наиболее популярным способом является двухпроводной интерфейс TIA/EIA-485. Также используется четырехпроводный интерфейс RS485. TIA/EIA-232-E (RS232) также может использоваться, но ограничено двухточечной связью малого радиуса действия. [21] MODBUS по последовательной линии имеет два режима передачи : RTU и ASCII , которые соответствуют двум версиям протокола, известным как Modbus RTU и Modbus ASCII . [25]
Modbus RTU ( удаленный терминальный модуль ), который является наиболее распространенной реализацией, доступной для Modbus, использует компактное двоичное представление данных для протокольной связи. Формат RTU следует за командами/данными с помощью контрольной суммы циклического избыточного кода в качестве механизма проверки ошибок, обеспечивающего надежность данных. Сообщение Modbus RTU должно передаваться непрерывно, без задержек между символами. Сообщения Modbus формируются (разделяются) периодами простоя (молчания). Каждый 1 байт (8 бит) данных/сообщения Modbus RTU должен иметь еще 3 бита, чтобы сформировать общие 11 бит: [3] [25]
Тогда кадр Modbus RTU будет: [26]
Расчет CRC широко известен как CRC-16-MODBUS, полином которого равен x 16 + x 15 + x 2 + 1 (обычный шестнадцатеричный алгебраический многочлен 8005
и перевернутый A001
). [27]
Пример кадра Modbus RTU в шестнадцатеричном формате : 01 04 02 FF FF B8 80
(вычисление CRC-16-MODBUS для 5 байт от 01
до FF
дает 80B8
, который передается первым младший байт).
Для обеспечения целостности кадра Modbus при передаче интервал времени между двумя кадрами должен быть не менее времени передачи 3,5 символов, а интервал времени между двумя последовательными символами должен быть не более времени передачи 1,5 символа. [26]
Например, при скорости передачи по умолчанию 19200 бит/с время передачи 3,5 (t3.5) и 1,5 (t1.5) символов составляет (обратите внимание, что для передачи каждого 8-битного символа требуется 3 дополнительных бита кадрирования):
Для более высоких скоростей передачи данных Modbus RTU рекомендует использовать фиксированные значения 750 мкс для t1.5 и 1,750 мс для t3.5. [26]
Modbus ASCII использует символы ASCII для связи по протоколу. Формат ASCII использует контрольную сумму продольного избыточного кода . Сообщения Modbus ASCII выделяются двоеточием (":") и завершающим символом новой строки (CR/LF).
Кадр Modbus ASCII включает в себя: [28]
Адрес, функция, данные и LRC представляют собой значения в шестнадцатеричной кодировке ASCII, при этом 8-битные значения (0–255) кодируются как два удобочитаемых символа ASCII из диапазонов 0–9 и A–F. Например, значение 122 (7A 16 ) кодируется как два символа ASCII, «7» и «A», и передается как два байта: 55
(37 16 , значение ASCII для «7») и 65
(41 16 , значение ASCII). для").
LRC рассчитывается как сумма 8-битных значений (исключая начальный и конечный символы), инвертируется ( дополнение до двух ) и кодируется как 8-битное значение. Например, если адрес, функция и данные равны 247, 3, 19, 137, 0 и 10, дополнение до двух их суммы (416) равно -416; это сокращение до 8 бит равно 96 (256 × 2 − 416 = 60 16 ), что дает следующий кадр из 17 символов ASCII: :F7031389000A60␍␊
. LRC указан для использования только в качестве контрольной суммы: поскольку она рассчитывается на основе закодированных данных, а не переданных символов, ее «продольная» характеристика недоступна для использования с битами четности для обнаружения однобитовых ошибок.
Modbus TCP или Modbus TCP/IP — это вариант Modbus, используемый для связи по сетям TCP/IP , подключающийся через порт 502 . [29] Он не требует расчета контрольной суммы, поскольку нижние уровни уже обеспечивают защиту контрольной суммы.
Номенклатура Modbus TCP такая же, как и для протокола Modbus over Serial, поскольку любое устройство, отправляющее команду Modbus, является «клиентом», а ответ приходит от «сервера». [30]
ADU для Modbus TCP официально называется MODBUS TCP/IP ADU (или Modbus TCP/IP ADU) организацией Modbus [31] , а другие стороны также называют его кадром Modbus TCP . [3]
MODBUS TCP/IP ADU = заголовок MBAP + код функции + данные
Где MBAP , который обозначает заголовок протокола приложения MODBUS , представляет собой специальный заголовок, используемый в TCP/IP для идентификации блока данных приложения MODBUS.
Заголовок MBAP содержит следующие поля: [32]
Идентификатор устройства используется с устройствами Modbus TCP, которые являются составными частями нескольких устройств Modbus, например, шлюзами Modbus TCP и Modbus RTU. В таком случае идентификатором устройства является адрес сервера устройства за шлюзом.
Тогда формат кадра MODBUS TCP/IP ADU/Modbus TCP будет следующим: [32] [31]
Пример кадра Modbus TCP/IP ADU/Modbus TCP в шестнадцатеричном формате :
12 34 00 00 00 06 01 03 00 01 00 01
0x12
и 0x34
: с идентификатором транзакции = 0x1234 (2 байта) в качестве «уникального номера», который должен идентифицироваться между клиентом/сервером Modbus TCP, старший байт идентификатора транзакции равен 0x12, а младший байт идентификатора транзакции — 0x34.0x00
и 0x00
: старший и младший байт идентификатора протокола.0x00
и 0x06
: Длина старшего и младшего байта. Длина составляет 6 байт, включая: идентификатор устройства (адрес ведомого устройства) (1 байт), код функции (1 байт), старший байт адреса регистра для чтения (1 байт), младший байт адреса регистра для чтения (1 байт). ) и данные (2 байта = старший байт и младший байт количества регистров для чтения)0x01
: Идентификатор устройства (адрес подчиненного устройства)0x03
: Код функции (чтение нескольких регистров временного хранения)0x00
и 0x01
: старший и младший байт адреса регистра для чтения. Адрес регистра для чтения в этом случае — 0x0001
.0x00
и 0x01
: старший и младший байт количества регистров для чтения. Число регистров для чтения в этом случае равно 0x0001
. (т.е. 1 регистр)Помимо широко используемых Modbus RTU, Modbus ASCII и Modbus TCP, существует множество вариантов протоколов Modbus:
Модели данных и вызовы функций идентичны для первых четырех вариантов, перечисленных выше; только инкапсуляция другая. Однако эти варианты и форматы кадров несовместимы.
Другой фактический протокол, тесно связанный с Modbus, появился позже и был определен производителем ПЛК April Automate в результате совместных усилий французских компаний Renault Automation и Merlin Gerin et Cie в 1985 году: JBUS . Различия между Modbus и JBUS того времени (количество объектов, серверных станций) теперь не имеют значения, поскольку этот протокол почти исчез с появлением апрельской серии ПЛК, которую AEG Schneider Automation купила в 1994 году, а затем сделала устаревшей. Однако название JBUS в некоторой степени сохранилось.
JBUS поддерживает функциональные коды 1, 2, 3, 4, 5, 6, 15 и 16 и, следовательно, все объекты, описанные выше, хотя нумерация другая:
{{cite web}}
: CS1 maint: постскриптум ( ссылка )Технические характеристики
Другой