В данной статье будут рассматриваться основные характеристики протокола Modbus.
Рассмотрим некоторые особенности из широкого спектра различий между протоколами Modbus RTU и Modbus TCP, реализуемыми через последовательный интерфейс и через Ethernet.
Мы также обсудим различные стандарты соединения для последовательной передачи данных.
Далее мы рассмотрим прохождение пакетов Modbus в качестве Мастера и Слейва сети через последовательный интерфейс и в качестве Клиента и Сервера через Ethernet.
Углубимся в особенности адресации данных в протоколе Modbus.
Также мы затронем тему о том, как плавающие и двойные целочисленые значения обрабатываются протоколом Modbus.
Для начала немного истории.
Modbus представляет собой последовательный коммуникационный протокол, разработанный компанией Modicon в 1979 (Schneider Electric) .
Он был создан специально для использования в ПЛК, производимых этой компанией для промышленного применения.
На сегодняшний день Modbus является распространенным открытым протоколом, используемым для широкого спектра средств автоматизации.
Modbus может использоваться как для передачи данных через Ethernet, так и через последовательный интерфейс.
Существуют три основных разновидности протокола Modbus: Modbus ASCII, Modbus RTU и Modbus TCP/IP.
Первоначально Modbus был разработан с использованием ASCII-символов для кодирования сообщений и эта версия протокола все еще используется.
Modbus RTU является самой распространенной реализацией данного протокола, использующей двоичное кодирование и CRC проверку ошибок.
Эти два режима – ASCII и RTU – несовместимы. Поэтому устройство, сконфигурированное для режима ASCII, не может взаимодействовать с другим устройством при помощи Modbus RTU.
Устройства, поддерживающие Modbus RTU, обычно используют один из трех интерфейсов: RS232, RS485, и RS422.
Топология сети «точка – точка» используется для подключения устройств по Интерфейсу RS232.
Если вам требуется подключить друг к другу только два устройства, и расстояние между этими ними составляет менее 15 метров, то стоит использовать RS232.
Для подключения до 32 устройств на одной линии и/или на расстояние большее, чем 100 метров, необходимо использовать RS485 или RS422.
Для Мастера, сообщающегося с несколькими Слейвами, на сегодняшний день наиболее популярным интерфейсом является RS485.
Этот стандарт может поддерживать до 32 узлов в диапазоне до 4000 футов или примерно 1200 метров без повторителей.
Единицей измерения передачи сообщений через Modbus является скорость передачи бит в секунду.
Все устройства в сети RTU должны использовать одинаковую скорость передачи данных.
Различные устройства поддерживают различные скорости передачи, но диапазон между 9600 и 19200 битами является типичным.
Через протокол Modbus модули ввода-вывода могут иметь количество сигналов более 10 000.
В последовательной сети Modbus есть одно устройство-Мастер, который передает команды подчиненным устройствам-Слейвам.
Сами Слейвы информацию не передают, за исключением случаев, когда они получают такую команду от Мастера.
Допустимое максимальное количество Слейв-устройств на одной шине Modbus в последовательной сети составляет 247 единиц, каждое из которых имеет свой уникальный ID-адрес от 1 до 247.
Однако интерфейс RS485 не может управлять более чем 32 узлами в одном сегменте; поэтому если в сети более 32 узлов, то потребуется повторитель.
Мастер может выдавать команды Слейв-устройствам, а также считывать с них данные.
СКАДА-система/человеко-машинный интерфейс обычно являются Мастерами, взаимодействующими с несколькими Слейв-устройствами. Устройства должны быть подключены последовательным соединением; они не могут быть соединены по топологии «звезда».
Modbus через Ethernet работает следующим образом: для связи друг с другом устройства Modbus используют постоянные кабели Ethernet и сетевые свитчи.
Главной отличительной особенностью Modbus TCP/IP является то, что протокол прикладного уровня (MBAP) добавляет сообщение для каждого устройства, подключенного по сети.
ID Слейв-устройства в начале сообщения удаляется так же, как циклический контроль конца сообщения.
Протокол прикладного уровня содержит всю информацию, необходимую для маршрутизации данных в адрес устройства по умолчанию.
Modbus использует порт 502 для связи через TCP/IP.
Это важно, если данные должны пройти через систему сетевой защиты.
Большое количество пользователей использует этот порт для передачи данных через протокол прикладного уровня (MBAP).
Последовательные сообщения Modbus также могут быть отправлены как обычные сообщения RTU в рамках передачи данных внутри и пакета Ethernet TCP/IP (инкапсуляция).
Такие инкапсулированные сообщения могут использовать любой порт, но средства автоматизации настроены на использование порта 2000 по умолчанию.
Обращаем внимание, что инкапсуляция протокола прикладного уровня (MBAP) и RTU не допустима; устройства должны быть настроены на использование либо одного, либо другого протокола.
Сообщения протокола прикладного уровня (MBAP) на сегодняшний день являются самым популярным способом связи через Modbus TCP/IP.
В данной статье мы сделаем упор на рассмотрение Modbus RTU и Modbus TCP/IP с использованием протокола прикладного уровня (MBAP).
Modbus TCP/IP использует понятия «Клиент» и «Сервер» вместо «Мастер» и «Слейв».
Сеть TCP/IP состоит из Клиента, подключенного к сетевому коммутатору (коммутаторам), к которому также подключены все Серверы в сети.
Устройства, поддерживающие Modbus TCP/IP, используют межсетевой протокол для сети Интернет и требуют маску подсети.
IP-адрес и маска подсети представлены упорядоченным набором из 8 бит или иначе – октетом.
IP-адреса местоположения конкретного устройства в сети и Серверов маски подсети упрощают задачу маршрутизации трафика в сети.
Если вы не знаете свой IP-адрес, то IT-группа или администратор сети позволят вам узнать IP-адреса и маску подсети, которые будут необходимы вашим устройствам.
Шлюз по умолчанию является необязательным и не требуется для сетей, которые его не используют.
По этому вопросу вы также сможете проконсультироваться у вашей IT-группы или администратора сети.
А теперь давайте поговорим о нецентровой системе адресации Modbus и разнице между строками в данной таблице.
Здесь представлены 4 строки, в которых хранится информация.
Две строки хранят простые дискретные значения, называемые ячейками, и цифровые 16-битные значения, известные как регистры.
Для каждого типа данных имеется одна строка только для чтения и одна строка для чтения и записи.
Там нет строк для 32-битных типов данных, потому что в то время, когда Modbus был определен и зафиксирован, двойные целые числа и значения с плавающей точкой не были доступны в ПЛК.
Существует способ, чтобы использовать эти типы данных, мы вернемся к этому вопросу чуть позже.
Каждая строка имеет максимум 9999 адресов.
Адреса от 1 до 9999 предназначены для чтения и записи, адреса с 10001 по 19999 предназначены только для чтения для дискретных входов.
Адреса от 30001 до39 999 предназначены только для чтения входных регистров, адреса от 40 001 до 49 999 используются для чтения и записи для регистров временного хранения.
На данный момент эта информация пригодится, чтобы объяснить термины, используемые для типов данных в Modbus.
Ячейки в дискретных входах Modbus, как правило, используются для передачи 1-битных данных или булевых данных. Состояние бита: либо поднят, либо опущен.
Регистром обозначается 1 слово (word) или 16 бит или 2 байта или переменная INTEGER.
Нет регистров для плавающих и двойных целочисленых значений, хотя они могут быть посланы, разделившись при этом на два регистра (WORD).
Значение плавающей переменной выражается в любом числе с десятичной точкой, которое представлено 32-битовым регистром.
Двойные целые числа, или DINTы являются просто двумя 16-битными значениями, сложенными вместе. Также представлены 32 битами.
Это представляется небольшой проблемой, поскольку Modbus не имеет плавающих и двойных целочисленых типов значений.
Решение данной проблемы представляется очевидным: 32 + -битовое значение разбивается на 2 отдельных 16-битных регистра, а затем преобразовывается в 32-битное реальное значение (REAL).
Это достигается путем копирования двух 16-битных регистров в 1 переменную типа REAL. Функциональные коды Modbus представляют собой простые цифровые коды, которые указывают слейв-устройствам на то, какие таблицы данных используются для доступа и какую функцию необходимо выполнить в этой таблице – чтение или запись.
Каждая функция кода относится к определенному диапазону адресов таблицы данных.
Например, функциональный код 1 является это кодом для чтения и индивидуальным битом состояния.
Функциональный код 16 предназначен для записи нескольких регистров временного хранения.
Вот некоторые из наиболее часто используемых функциональных кодов.
Modbus не определяет, как именно данные должны храниться в регистрах.
Различные производители средств автоматизации используют разные способы хранения и передачи данных.
Некоторые устройства будут передавать первым старший байт, а затем младший байт.
Другие же устройства будут делать это с точностью до наоборот.
К тому же, когда регистры объединяются, чтобы представлять 32 + – реальные битовый значения, некоторые устройства будут передавать более высокий 16-бит в первом регистре и младшие 16-бит во втором регистре.
Другие производители делают это с точностью до наоборот.
Последовательность, в которой посылают байты или слова, не имеет значения до тех пор, пока приемное устройство знает, в каком порядке они следуют.
Данные отображаются некорректно, если байт или слово неверные; в этом случае средства автоматизации имеют функцию подкачки байт и слов, которая будет выставлять их в обратный порядок, в котором данные хранятся и отправляются, обеспечивая, тем самым, быстрое решение вопроса.
И в завершении рассмотрим сообщения по Modbus RTU, которые отправляются от Мастера к Слейв-устройствам.
Сообщение содержит ID-адрес Слейв-устройства, которому предназначается команда, функциональный код для чтения или записи данных и сами данные сообщения.
После того, как Слейв-устройство получает команду, оно возвращает запрашиваемые данные к Мастеру в случае, если командой было чтение, или записывает данные в собственную базу данных, а затем посылает обратно к Мастеру исходное сообщение, чтобы подтвердить, что сообщение было получено.
Мы надеемся, что эта статья даст лучшее понимание Modbus и TCP/IP.
#Modbus, #protocol, #features, #модбас, #особенности, #протокола
Если Вы не нашли то, что искали, сообщите об этом в комментарии
lapshinvr.ru
Modbus — открытый коммуникационный протокол, основанный на архитектуре «клиент-сервер». Широко применяется в промышленности для организации связи между электронными устройствами. Может использоваться для передачи данных через последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (Modbus TCP).
Не следует путать MODBUS и MODBUS Plus. MODBUS Plus — проприетарный протокол принадлежащий Schneider Electric. Физический уровень уникальный, похож на Ethernet 10BASE-T, полудуплекс по одной витой паре, скорость 1Мбит/с. Транспортный протокол — HDLC, поверх которого специфицировано расширение для передачи MODBUS PDU.
Modbus был разработан компанией Modicon (в настоящее время принадлежит Schneider Electric) для использования в её контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году.[1] Это был открытый стандарт, описывающий формат сообщений и способы их передачи в сети, состоящей из различных электронных устройств.
Первоначально контроллеры MODICON использовали последовательный интерфейс RS-232.[1] Позднее стал применяться интерфейс RS-485, так как он обеспечивает более высокую надёжность, позволяет использовать более длинные линии связи и подключать к одной линии несколько устройств.
Многие производители электронного оборудования поддержали стандарт, на рынке появились сотни использующих его изделий.
В настоящее время развитием Modbus занимается некоммерческая организация Modbus-IDA[2].
MODBUS специфицирует 4 типа данных:
Стандарты MODBUS состоят из 3 частей:
Основные достоинства стандарта — открытость и массовость. Огромное количество датчиков и исполнительных устройств выпущено промышленностью. Практически все промышленные системы контроля и управления имеют программные драйвера для работы с MODBUS сетями.
Стандарт в своей основе был разработан в 1979 году компанией Modicon (в данное время владелец Schneider Electric) [3], с учетом потребностей и вычислительных возможностей того времени, и многие актуальные для современных промышленных сетей вопросы не были учтены [источник не указан 203 дня].
Необходимо отметить, что отсутствие данных возможностей упрощает протокол и делает его более простым для изучения, что ускоряет его внедрение. Данные особенности, в какой-то мере, являются и достоинствами стандарта.
Контроллеры на шине Modbus взаимодействуют, используя клиент-серверную модель, основанную на транзакциях, состоящих из запроса и ответа.
Обычно в сети есть только один клиент, так называемое, «главное» (англ. master) устройство, и несколько серверов — «подчиненных» (slaves) устройств. Главное устройство инициирует транзакции (передаёт запросы). Главный может адресоваться индивидуально к подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчиненное устройство отвечает на запрос, адресованный именно ему. При получении широковещательного запроса ответ не формируется.
Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1…127. Диапазон значений 128…255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.
код функции | данные |
---|---|
1 байт | N < 253 (байт) |
Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи. Существуют три варианта ADU, два для передачи данных через асинхронный интерфейс и один — через TCP/IP сети:
Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):
адрес ведомого устройства | код функции | данные | блок обнаружения ошибок |
---|
где
Максимальный размер ADU для последовательных сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт.
Для Modbus TCP ADU выглядит следующим образом:
ID транзакции | ID протокола | длина пакета | адрес ведомого устройства | код функции | данные |
---|
где
Поле контроля целостности в Modbus TCP отсутствует, т.к. целостность данных обеспечивает TCP/IP стек.
В действующей в настоящее время спецификации протокола определяются три категории кодов функций:
Одно из типичных применений протокола — чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре таблицы данных:
Таблица | Тип элемента | Тип доступа |
---|---|---|
Дискретные входы (Discrete Inputs) | один бит | только чтение |
Регистры флагов (Coils) | один бит | чтение и запись |
Регистры ввода (Input Registers) | 16-битное слово | только чтение |
Регистры хранения (Holding Registers) | 16-битное слово | чтение и запись |
Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы. В этом случае команды работающие с дискретными данными и с 16-битными регистрами будут фактически обращаться к одним и тем же данным.
Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.
номер функции | запрос/ответ | |||||
---|---|---|---|---|---|---|
1 (0x01) | A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | |||||
2 (0x02) | A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | |||||
3 (0x03) | A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | |||||
4 (0x04) | A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | |||||
5 (0x05) | A1 | A0 | D1 | D0 | ||
A1 | A0 | D1 | D0 | |||
6 (0x06) | A1 | A0 | D1 | D0 | ||
A1 | A0 | D1 | D0 | |||
15 (0x0F) | A1 | A0 | Q1 | Q0 | N | D (N байт) |
A1 | A0 | Q1 | Q0 | |||
16 (0x10) | A1 | A0 | Q1 | Q0 | N | D (N байт) |
A1 | A0 | Q1 | Q0 |
Для чтения значений из перечисленных выше таблиц данных используются функции с кодами 1—4 (шестнадцатеричные значения 0x01—0x04):
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым.
В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.
Значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым:
байт 1 | байт 2 | байт 3 | байт 4 | … | байт N-1 | байт N |
---|---|---|---|---|---|---|
RA,1 | RA,0 | RA+1,1 | RA+1,0 | … | RA+Q-1,1 | RA+Q-1,0 |
Значения флагов и дискретных входов передаются в упакованном виде: по одному биту на флаг. Единица означает включённое состояние, ноль — выключенное. Значения запрошенных флагов заполняют сначала первый байт, начиная с младшего бита, затем следующие байты, также от младшего бита к старшим. Младший бит первого байта данных содержит значение флага, указанного в поле «адрес». Если запрошено количество флагов, не кратное восьми, то значения лишних битов заполняются нулями:
байт 1 | … | байт N | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
FA+7 | FA+6 | FA+5 | FA+4 | FA+3 | FA+2 | FA+1 | FA | … | 0 | … | 0 | FA+Q-1 | FA+Q-2 | … |
Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта).
Для регистра хранения значение является просто 16-битным словом.
Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы.
Если команда выполнена успешно, ведомое устройство возвращает копию запроса.
Команда состоит из адреса элемента, количества изменяемых элементов, количества передаваемых байт устанавливаемых значений и самих устанавливаемых значений. Данные упаковываются так же, как в командах чтения данных.
Ответ состоит из начального адреса и количества изменённых элементов.
Ниже приведён пример команды ведущего устройства и ответа ведомого (для Modbus RTU).
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Количество флагов ст. байт | 05 Количество флагов мл. байт | 06 Количество байт данных | 07 Данные ст. байт | 08 Данные мл. байт | 09 CRC мл. байт | 0A CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Master→Slave | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0xCB | 0x72 |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Количество флагов ст. байт | 05 Количество флагов мл. байт | 05 CRC мл. байт | 06 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x09 | 0x24 |
Во время обмена данными могут возникать ошибки двух типов:
Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001). При этом младший байт передается первым, в отличие от байтов адреса и значения регистра в PDU
В 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 принимает запрос, но не может его обработать (обращение к несуществующему регистру и т. д.), отправляется ответ содержащий в себе данные об ошибке.
Направление передачи | адрес подчинённого устройства | номер функции | данные (или код ошибки) | CRC |
---|---|---|---|---|
Запрос (Master→Slave) | 0x01 | 0x77 | 0xDD | 0xC7 0xA9 |
Ответ (Slave→Master) | 0x01 | 0xF7 | 0xEE | 0xE6 0x7C |
dic.academic.ru
Данная статья описывает основы работы с протоколом 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 байт.
Существует три типа функций:
При использовании режима Modbus RTU сообщение начинается с так называемого интервала тишины, равного времени передачи 3.5 символов, при заданной скорости обмена. Первым полем передается адрес устройства. Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала. Фрейм сообщения передаётся непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный. Если новое сообщение начнется раньше интервала 3.5 символа, принимающее устройство воспримет его как продолжение предыдущего сообщения. В этом случае устанавливается ошибка CRC (несовпадение контрольной суммы).
Типы данных протокола Modbus представлены в таблице:
Тип данных | Тип доступа | |
Дискретные входы (Discrete Inputs) | один бит | только чтение |
Регистры флагов (Coils) | один бит | чтение и запись |
Регистры ввода (Input Registers) | 16-битное слово | только чтение |
Регистры хранения (Holding Registers) | 16-битное слово | чтение и запись |
Для чтения значений из этих выше таблиц данных используются функции с кодами 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, которые в нем использованы. Для управления двигателем необходимо задать параметры контроллера, параметры вращения и непосредственно команду. Вся работа с контроллером при использовании протокола Модбас сводится к работе с регистрами, то есть чтению и записи. Наш контроллер имеет всего один тип регистров: 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.
Все права защищены. Перепечатка материалов с сайта возможно только с разрешения администрации
onitex.ru
Modbus — открытый коммуникационный протокол, основанный на архитектуре ведущий — ведомый (master-slave). Широко применяется в промышленности для организации связи между электронными устройствами. Может использоваться для передачи данных через последовательные линии связи RS-485, RS-422, RS-232, и сети TCP/IP (Modbus TCP). Также существуют нестандартные реализации, использующие UDP[1][2].
Не следует путать MODBUS и MODBUS Plus. MODBUS Plus — проприетарный протокол, принадлежащий Schneider Electric. Физический уровень уникальный, похож на Ethernet 10BASE-T, полудуплекс по одной витой паре, скорость 1 Мбит/с. Транспортный протокол — HDLC, поверх которого специфицировано расширение для передачи MODBUS PDU.
JBUS — подмножество протокола Modbus RTU с небольшими отличиями в способе адресации[3].
Modbus был разработан компанией Modicon (в настоящее время принадлежит Schneider Electric) для использования в её контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году[4]. Это был открытый стандарт, описывающий формат сообщений и способы их передачи в сети, состоящей из различных электронных устройств.
Первоначально контроллеры MODICON использовали последовательный интерфейс RS-232[4]. Позднее стал применяться интерфейс RS-485, так как он обеспечивает более высокую надёжность, позволяет использовать более длинные линии связи и подключать к одной линии несколько устройств.
Многие производители электронного оборудования поддержали стандарт, на рынке появились сотни использующих его изделий.
В настоящее время развитием Modbus занимается некоммерческая организация Modbus-IDA[5].
ru-wiki.ru
Если в качестве инструмента у Вас имеется лишь молоток, каждая проблема начинает напоминать гвоздь.Абрахам Маслоу
Популярность данного протокола обусловлена его открытостью и простотой. Сфера применимости достаточно широка: от профессиональных промышленных систем автоматизации до любительских DIY-проектов распределенных управляющих систем, «умных» домов и так далее. Данный протокол был выбран и мной, когда моя команда занималась создание ПО тренажера электропоезда. Протокол Modbus RTU на физическом интерфейсе RS485 используется на данном тренажере для обеспечения ввода в управляющий компьютер данных с органов управления, смонтированных на пульте машиниста (не стоит думать что Modbus используется на настоящем подвижном составе!).
Не стоит говорить с какими трудностями сопряжена наладка ПО, взаимодействующего с сетью контроллеров, управляющих оборудованием. Особенно когда часть устройств уже существует в железе, а другая часть находится в процессе разработки и изготовления. При этом ПО верхнего уровня требуется писать с учетом его взаимодействия с эти железом. И желательно писать его так, чтобы создавать рабочий вариант системы сразу, без использования «костылей» которые всегда трудно вычищать из кода.
«Надо писать ПО, когда готовы рабочие прототипы всего железа» — скажете вы и будете правы, но… ха-ха-ха, в реальном мире такое случается редко. И вот тут нам на помощь приходят программные эмуляторы.
Нас будет интересовать именно RS485, который является полудуплексным интерфейсом, что допускает лишь одно передающее данные устройство в каждый момент времени. Арбитраж шины в Modbus осуществляется за счет выдержки обязательного интервала тишины длиной 3,5 символа при данной скорости передачи. Каждое сообщение должно начинаться и завершаться интервалом тишины. В сети существует одно ведущее устройство (master) и несколько ведомых устройств (slave) (до 31 в одном сегменте сети, без применения репитеров). Каждое ведомое устройство имеет уникальный идентификатор ID (от 1 до 31). Передача данных ведомым осуществляется лишь в том случае, если мастер послал запрос на получение данных с этого устройства.
Типичный запрос мастера выглядит так
ID | Код функции | Адрес данных | Количество данных (2 байта) | Данные | CRC16 |
ID | Код функции | Количество данных в байтах | Данные | CRC16 |
Как говорится, простенько, но со вкусом. Подробнее обо всем этом можно прочитать в официальной спецификации протокола. О методах реализации протокола на последовательном интерфейсе читаем здесь. Собрались мы здесь не за этим.
Разрабатывая ПО верхнего уровня (master реализуемый на базе ПК, например) для подобной сети, хорошо бы иметь набор программных средств, позволяющих реализовать такую концепцию
Один из адаптеров используется для подключения ПО разрабатываемого мастера. Другой — для подключения эмулятора будущей сети слейвов. К отводу с белым коннектором подключаем ту часть сети, которая уже реализована аппаратно. Таким образом мы получаем возможность спокойно работать со штатным протоколом связи, постепенно вводя в работу реальную аппаратуру. К тому же, отдав объект заказчику мы не лишаемся возможность модифицировать его ПО в комфортной обстановке лаборатории без доступа к объекту. QSlave на схеме как раз таки часть сети, эмулируемая программно. Естественно, придется написать соответствующий софт, что и было сделано автором.
Приложение разработано на C++ с использованием фреймворка Qt. Qt, вообще говоря, имеет библиотеки для работы с Modbus, но специфика задачи — имитация сети слейвов а не одного слейва, привела к тому, что встроенные библиотеки Qt для Modbus тут не использовались. Для обработки данных, принимаемых с виртуального последовательного порта была создана самописная библиотека modbus. Код этой библиотеки реализован в виде отдельного проекта, совершенно не зависит от интерфейса пользователя и может быть использован для сознания программных имитаций с более продвинутым функционалом. Из-за того, что эмуляция Modbus отвязана от UI, конфигурирование сети происходит с применением конфигурационных файлов. Был выбран формат XML (мы часто его используем в своих проектах). Пример конфигурации доступен в коде проекта. Комплект конфигов состоит из главного файла с расширением *.net, который выглядит так
example.net
<?xml version="1.0" encoding="UTF-8" ?>
<Config>
<Slave>
<!-- Описание слейва, отображаемое в списке устройств -->
<Description>Traffic light</Description>
<!-- Идентификатор слейва -->
<id>1</id>
<!-- Имя XML-файла конфигурации (без расширения *.xml) -->
<config>traffic-light</config>
</Slave>
</Config>
traffic-light.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Config>
<!-- Дискретные выходы -->
<Coil>
<address>16</address>
<description>Red signal</description>
<value>0</value>
</Coil>
<Coil>
<address>17</address>
<description>Yellow signal</description>
<value>0</value>
</Coil>
<Coil>
<address>18</address>
<description>Green signal</description>
<value>0</value>
</Coil>
<!-- Дискретные входы -->
<DiscreteInput>
<address>0</address>
<description>Ready</description>
<value>1</value>
</DiscreteInput>
<!-- Регистры вывода -->
<HoldingRegister>
<address>5</address>
<description>Signal activity time</description>
<value>15</value>
</HoldingRegister>
<!-- Регистры ввода -->
<InputRegister>
<address>2</address>
<description>Signals count</description>
<value>3</value>
</InputRegister>
</Config>
Естественно, данный симулятор никак не имитирует внутреннюю логику работы устройства. Он позволяет лишь задавать значения ячеек памяти, доступных ведущему устройству. Любое из значений можно задать по своему усмотрению, отредактировав соответствующую ячейку таблицы.
При всей своей простоте, данный софт помогает нам работать над ПО тренажера (который уже сдан в эксплуатацию) не выходя из лаборатории.
Но никто не говорит, что нельзя создать более продвинутый эмулятор, имитирующий работу устройств виртуальной сети. Для его создания можно использовать код библиотеки modbus, доступный в комплекте поставки QSlave.
Благодарю за внимание!
habr.com
Протокол Modbus широко используется при автоматизации производства, многие устройства поддерживают протокол передачи данных Modbus RTU, использующий последовательный интерфейс. Обычно устройства имеют интерфейс RS-232 или RS-485 с разъемом DB-9 или клеммной колодкой. Устройства Modbus RTU легко внедрять и недорого обслуживать. Именно поэтому протокол Modbus RTU стал настолько популярным. Сегодня все больше и больше промышленных устройств начинают поддерживать стандарт Ethernet, т.к. сложность и масштабы сетей повышаются. Многие системы уже работают через Modbus TCP с использованием Ethernet, например, SCADA. В результате, возникают проблемы сопряжения между протоколами Modbus RTU и Modbus TCP. Приведенные ниже часто задаваемые вопросы и ответы на них призваны помочь вам выявить и предотвратить частые проблемы преобразования протокола Modbus.
Перечень часто задаваемых вопросов:
Прежде всего необходимо определить, какой драйвер Modbus на хосте SCADA вы хотите использовать. Существует четыре возможных варианта:
Для данного варианта необходим преобразователь протоколов. Вы можете использовать протокол Modbus TCP для связи с устройствами Modbus RTU через шлюз.
На рынке устройств автоматизации доступно много «шлюзов Modbus», которые обеспечивают подключение через Modbus TCP для ведомых устройств Modbus TCP. Когда шлюз получает запрос Modbus TCP, он преобразует пакет в Modbus RTU и немедленно посылает его к устройствам Modbus RTU.
Этот вариант подходит, если необходимо просто подключить существующий хост SCADA и устройства Modbus RTU к сети Ethernet. Если ваш хост SCADA оборудован последовательным портом, то с помощью пары шлюзов можно решить данную проблему.
Как показано на схеме сети, шлюз может преобразовывать пакет Modbus RTU в Modbus TCP и обратно. Если встроенный последовательный порт отсутствует, данное решение вам не подходит, воспользуйтесь вариантом 3.
Если вы хотите пользоваться имеющимися программами и устройствами SCADA, но ваш хост SCADA не оснащен последовательным портом, используйте сервер последовательных устройств для создания виртуального COM-порта. Так вы сможете получить доступ к удаленным последовательным устройствам через сервер, причем функциональность будет соответствовать реальному COM-порту.
Для создания «виртуального COM-порта» сервер последовательных устройств установит драйвер виртуального COM-порта на ваш хост SCADA. Чтобы активировать этот порт, установите сервер последовательных устройств в режим виртуального COM-порта. Все данные, передаваемые через него, будут отправляться на удаленный последовательный порт сервера последовательных устройств. Так как с точки зрения ОС и SCADA виртуальный COM идентичен реальному, вы можете отправить запрос Modbus RTU на него напрямую.
Если ваш хост SCADA не оснащен последовательным портом, а вы не хотите устанавливать драйвер виртуального COM-порта, то вместо этого вы можете использовать драйвер «Инкапсуляция Ethernet». Обратите внимание, что программное обеспечение SCADA должно поддерживать тип соединения «Инкапсуляция Ethernet». Использование драйверов «Инкапсуляция Ethernet» рекомендуется при наличии углубленных знаний о последовательных протоколах и протоколах TCP/IP.
Сервер последовательных устройств необходимо перевести в режим «Raw Socket» или «туннелирования», в котором при отправке SCADA пакетов Modbus RTU на устройства соединение между хостом и сервером последовательных устройств осуществляется через прозрачный канал TCP/IP или UDP без преобразования протокола. Сервер последовательных устройств необходимо корректно настроить, т.к. протокол Modbus RTU определяет конец пакета на основе пауз в передаче. Если пакет Modbus RTU будет разделён на два или более пакетов TCP/IP или UDP, вы можете столкнуться с некоторыми проблемами. Если вы не можете правильно настроить передачу пакетов между последовательными каналами и сетями Ethernet, рекомендуется использовать вариант со шлюзом (2) или виртуальным COM-портом (3).
Хотя серверы последовательных устройств можно использовать для подключения устройств Modbus RTU к сети Ethernet, вариант со шлюзом (2) наиболее предпочтителен и удовлетворяет практически всем требованиям системы. Ваш хост должен поддерживать протокол Modbus TCP, но это редко вызывает проблемы, т.к. этот протокол очень популярен и широко распространен. Ниже описаны несколько ситуаций, в которых необходимо использовать представленный вариант со шлюзом:
Несколько ведущих устройств или резервирование сети
Подключение через Ethernet позволяет не только пользоваться удаленным доступом, но также поддерживает несколько соединений. Большинство шлюзов поддерживают до 32 соединений, т.е. 32 хоста SCADA могут одновременно запрашивать данные у устройств Modbus RTU. В данной ситуации обеспечить резервирование сети с помощью сервера последовательных устройств довольно сложно, т.к. большинство серверов не поддерживает несколько ведущих устройств, с другой стороны, использование шлюзов не вызовет никаких проблем.
Одно соединение для нескольких устройств Modbus RTU
Иногда необходимо использовать одно соединение на хосте SCADA для опроса нескольких устройств Modbus RTU, подключенных к разным последовательным портам. Шлюз является единственным решением, которое может воплотить такой механизм маршрутизации. Шлюзы с несколькими последовательными портами можно настроить, чтобы они отправляли запрос Modbus на соответствующий последовательный порт с учетом уникальных идентификаторов ведомых устройств.
Север последовательных устройств не может справиться с такой сложной задачей.
Одновременный доступ к устройству со старого контроллера Modbus RTU и новой Modbus TCP SCADA
Хотя протокол Ethernet позволяет легко настроить удаленный доступ, иногда бывает необходимо сохранить существующие локальные соединения с контроллером или HMI. Проблема состоит в том, последовательный порт на устройстве уже подключен к шлюзу, поэтому последовательный порт для подключения HMI отсутствует. Для решения этой проблемы некоторые шлюзы оборудованы функцией «Serial Redirector». Эта система очень похожа на маршрутизатор тем, что шлюз может передавать запрос между различными последовательными портами на основе идентификатора ведомого устройства.
Существует много вариантов преобразования Modbus между последовательным интерфейсом и Ethernet. Хотя в этом случае может использоваться такой простой вариант как прозрачная передача данных между последовательными и Ethernet портами, при работе с промышленными протоколами, например, Modbus, специальный шлюз подходит гораздо лучше. Использование такого шлюза может потребовать больших первоначальных инвестиций, но он обеспечивает более стабильную связь в долгосрочной перспективе и способен распознавать пакеты Modbus для правильной обработки.
К списку вопросов
Большинство шлюзов обеспечивают гибкие настройки подключения TCP для доступа к нескольким устройствам Modbus RTU, подключенных к разным последовательным портам шлюза. Существует три различных метода, основанных на механизме маршрутизации:
Наиболее популярный метод планирования топологии шлюза. В конфигурации шлюза каждый последовательный порт будет подключен к отдельному TCP-порту. Например, 4001 — последовательный порт 1, 4002 — последовательный порт 2 и т.д. Если вы хотите подключить устройства Modbus RTU к последовательному порту 1, установите соединение Modbus TCP с 4001. Шлюз будет передавать пакеты Modbus TCP между TCP-портом 4001 и последовательным портом 1.
В этой топологии драйвер SCADA должен создать несколько соединений Modbus TCP.
Этот вариант очень похож на вариант 1, но для идентификации последовательных портов шлюз использует различные IP-адреса.
Например, 192.168.2.1 — к последовательному порту 1, 192.168.2.2 — к последовательному порту 2 и т.д. Если вы хотите подключить устройства Modbus RTU к последовательному порту 1, установите соединение Modbus TCP с 502. Шлюз будет передавать пакеты Modbus TCP между 192.168.2.1:502 и последовательным портом 1. В этой топологии драйвер SCADA также должен создать несколько соединений Modbus TCP. Хотя для топологии требуется несколько IP-адресов, некоторые клиенты Modbus TCP позволяют использовать только TCP-порт 502. В этом случае вариант 1 вам не подойдет, и придется использовать вариант 2.
В данной топологии для связи с несколькими устройствами используется маршрутизация. Чтобы запрос передавался к правильному последовательному порту, необходимо правильно настроить шлюз и направление маршрутизации. Например, последовательный порт 1 обрабатывает все пакеты Modbus, которые имеют идентификаторы ведомых устройств от 1 до 10, последовательный порт 2 — идентификаторы от 11 до 20 и т.д.
Т.к. в топологии используется только одно соединение, связь будет медленнее, чем варианты 1 и 2. Тем не менее, при наличии бюджетных и технических ограничений одно соединение может оказаться подходящим вариантом, если обеспечивается достаточная производительность.
Примечание:
Если вы подключите несколько устройств к одному последовательному порту или привяжете несколько последовательных портов к одному TCP-соединению, время опроса Modbus увеличится. Для увеличения скорости опроса требуется больше TCP-соединений, поэтому необходимо учитывать возможности SCADA.
К списку вопросов
Хотя шлюз может справиться с такой задачей, помните, что пропускная способность последовательного порта остается неизменной. Если через один последовательный порт поступает несколько запросов, может возникнуть задержка, т.к. шлюз обрабатывает более ранние запросы первыми. Поэтому если вы хотите разрешить нескольким ведущим устройствам одновременный доступ к устройству Modbus RTU, сначала необходимо подобрать подходящее время опроса.
Тем не менее, описанное выше решение не является единственным. Некоторые шлюзы поддерживают режим «агента», активно и постоянно получающего данные от подключенных устройств.
Обновляющиеся данные хранятся во внутренней памяти, которая используется для ответа на запросы хоста. Хотя это решение является более быстрым и эффективным, полученные данные не будут самыми актуальными.
Например, если один запрос занимает 100 мс, то 5 подключений вызовут задержку не менее 100 мс х (5-1) = 400 мс перед отправкой следующего запроса. Это означает, что цикл опроса каждого хоста SCADA должен составлять 400 мс (плюс некоторый допуск).
К списку вопросов
Для обмена данными между двумя ведущими устройствами Modbus необходим шлюз, который может поддерживать режим ведущее устройство–ведущее устройство (master-master). В этом режиме шлюз будет работать в качестве ведомого устройства для обеих сторон. Одно ведущее устройство может записывать данные во внутреннюю память шлюза, а другое — получать их, тем самым обеспечивая обмен. В зависимости от используемого шлюза вы можете обеспечить поддержку Modbus RTU и Modbus TCP для обеих сторон или поддержку Modbus RTU для одной и Modbus TCP — для другой.
К списку вопросов
Для того, чтобы шлюз активно получал данные от нескольких устройств Modbus RTU и помещал их в единый регистр, шлюз-агент должен сохранять данные во внутренней памяти. Шлюз также должен по очереди опросить каждое устройство Modbus RTU. Все данные будут расположены в одном блоке во внутренней памяти шлюза, поэтому вы сможете получить их с помощью одной команды чтения.
К списку вопросов
Сервер последовательных устройств — это автономное устройство, оснащенное, как минимум, одним портом Ethernet и одним или несколькими последовательными портами. Серверы последовательных устройств оснащаются встроенной сетевой операционной системой и позволяют компьютерам получить доступ к последовательным устройствам в сети. Они могут прозрачно передавать данные между последовательным интерфейсом и Ethernet, при этом соответственно преобразовывая их.
Современные серверы последовательных устройств также поддерживают функцию «виртуального COM-порта» для компьютеров, у которых нет дополнительного последовательного порта, преобразуя Ethernet-соединение в СОМ-порт. Помимо этих основных функций, более сложные серверы могут даже поддерживать протокол PPP по последовательным линиям связи или Telnet — в сетях Ethernet. Сервер последовательных устройств можно использовать для консольного управления сетевым и серверным оборудованием (поэтому некоторые производители называют его «консольным») или управления удаленными терминалами в старых банковских системах (поэтому иногда его называют «терминальным»).
Виртуальный COM-порт — это не реальный (т.е., не физический) COM-порт на компьютере. Вместо этого на компьютер под устанавливается драйвер виртуального COM-порта, полностью эмулирующий поведение локального COM-порта. Драйвер управляет портами на сервере последовательных устройств, который подключен по сети TCP/IP. Последовательный порт на удаленном сервере последовательных устройств будет функционировать так же, как локальный COM-порт. Виртуальный COM-порт привязывается к конкретному порту конкретного сервера последовательных устройств. Например, COM3 — это последовательный порт 1 на удаленном сервере последовательных устройств с IP-адресом 192.168.2.1. Поэтому при прохождении данных через этот порт они будут отправлены драйвером на «192.168.2.1@serial port 1» (192.168.2.1 на последовательный порт 1). Все запросы на этот виртуальный COM-порт будут перенаправлены на «192.168.2.1@serial port 1». Т.к. новые хост-компьютеры часто имеют недостаточное количество встроенных последовательных портов, виртуальные COM-порты являются бесценным инструментом для подключения существующего оборудования промышленной автоматизации.
Прозрачный шлюз — это основной метод использования шлюза Modbus. Т.к. протоколы Modbus RTU и Modbus TCP имеют тот же PDU (блок данных), а разница заключается только в заголовке, шлюз может с легкостью передавать данные между такими устройствами. Таким образом, когда шлюз получает пакет Modbus TCP из сети Ethernet, он может просто заменить поле адреса в соответствии с требованиями Modbus RTU и сразу же отправить пакет на последовательный порт. Когда шлюз получает ответ от устройства Modbus RTU, он ответит клиенту Modbus TCP.
Шлюз-агент — это другой метод использования шлюза Modbus для передачи данных между устройствами Modbus TCP и Modbus RTU. Шлюз-агент оснащен собственной внутренней памятью для временного хранения данных и непрерывно опрашивает подключенные устройства. При получении запроса от драйвера SCADA шлюз использует хранящиеся во внутренней памяти данные для ответа. Поэтому шлюз работает в качестве агента для активного опроса устройств. Эта функция может быть использована для преобразования протоколов, если:
ipc2u.ru
Modbus — коммуникационный протокол, основанный на клиент-серверной архитектуре. Разработан фирмой Modicon для использования в контроллерах с программируемой логикой (PLC). Стал стандартом де-факто в промышленности и широко применяется для организации связи промышленного электронного оборудования. Использует для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP. В настоящее время поддерживается некоммерческой организацией Modbus-IDA.
Протокол Modbus описывает единый простой формат передачи данных PDU, который в свою очередь входит в полный пакет ADU. Формат ADU меняется в зависимости от типа линии связи. Существуют три режима протокола: Modbus RTU, Modbus ASCII, Modbus TCP. Первые два используют последовательные линии связи (в основном RS-485, реже RS-422/RS-232), последний использует для передачи данных по сетям TCP/IP.
Протокол Modbus RTU предполагает одно ведущее (запрашивающее) устройство в линии (master), которое может передавать команды одному или нескольким ведомым устройствам (slave), обращаясь к ним по уникальному в линии адресу. Синтаксис команд протокола позволяет адресовать 247 устройств на одной линии связи стандарта RS-485 (реже RS-422 или RS-232).
Инициатива проведения обмена всегда исходит от ведущего устройства. Ведомые устройства прослушивают линию связи. Мастер подаёт запрос (посылка, последовательность байт) в линию и переходит в состояние прослушивания линии связи. Ведомое устройство отвечает на запрос, пришедший в его адрес. Окончание ответной посылки мастер определяет, по временному интервалу между окончанием приёма предыдущего байта и началом приёма следующего. Если этот интервал превысил время, необходимое для приёма двух байт на заданной скорости передачи, приём кадра ответа считается завершённым. Кадры запроса и ответа по протоколу modbus имеют фиксированный формат, приведённый в (Таблица 1-1).
адрес ведомого устройства | номер функции | данные | CRC |
---|---|---|---|
1 байт | 1 байт | N < 253 (байт) | 2 байта |
где:
Следует отметить, что поле CRC записывается младшим байтом вперёд. Алгоритм расчёта CRC может отличаться для разных устройств.
Все операции с данными привязаны к нулю, каждый вид данных (регистр, выходное/входное значение) начинаются с адреса 0000. Адресация к ячейке начинается с 1.
Например: Флаг номер 1 программируемого контроллера имеет адрес 0000 (указывается в поле «Адрес»).
Флаг номер 127 (DEC) имеет адрес 0x007E hex (126 dec) (указывается в поле «Адрес»).
Запоминающий регистр 40001 будет иметь адрес 0000 в поле «Адрес» команды. Потому что код операции уже содержит в себе необходимую информацию об адресе. Операции с этими регистрами имеют смещение Адрес_регистра — 40000 = Значение Используемое В Поле «Адрес». Тип адресации команд в дальнейшем будем помечать т.о.
смещение | обозначение |
-40000 | 4x |
-10000 | 1x |
Запоминающий регистр 40108 будет иметь адрес 006B hex (107 dec)
Во время обмена данными могут возникать ошибки двух типов:
Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001).
В RTU режиме сообщение начинается с интервала тишины равного времени передачи 3.5 символов при данной скорости передачи в сети. Первым полем затем передается адрес устройства.
Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала.
Фрейм сообщения передается непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство заканчивает прием сообщения и следующий байт будет воспринят как начало следующего сообщения.
Таким образом, если новое сообщение начнется раньше 3.5 интервала, принимающее устройство воспримет его как продолжение предыдущего сообщения. В этом случае устанавливается ошибка, так как будет несовпадение контрольных сумм.
Для сообщений об ошибках второго типа протокол Modbus RTU предусматривает, что устройства могут отсылать ответы, свидетельствующие об ошибочной ситуации. Признаком того, что ответ содержит сообщение об ошибке, является установленный старший бит кода команды. Пример кадра при выявлении ошибки ведомым устройством, в ответ на запрос приведён в (Таблица 2-1).
1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.
2. Если Slave не принимает какого либо значения, никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
4. Если Slave принимает запрос, но не может его обработать (обращение к несуществующему регистру и т.д.), отправляется ответ содержащий в себе данные об ошибке.
Направление передачи | адрес подчинённого устройства | номер функции | данные (или код ошибки) | CRC |
---|---|---|---|---|
Запрос (Master→Slave) | 0x01 | 0x77 | 0xDD | 0xC7 0xA9 |
Ответ (Slave→Master) | 0x01 | 0xF7 | 0xEE | 0xE6 0x7C |
01 Принятый код функции не может быть обработан на подчиненном. 02 Адрес данных указанный в запросе не доступен данному подчиненному. 03 Величина содержащаяся в поле данных запроса является не допустимой величиной для подчиненного. 04 Невосстанавливаемая ошибка имела место пока подчиненный пытался выполнить затребованное действие. 05 Подчиненный принял запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет главного от генерации ошибки таймаута. 06 Подчиненный занят обработкой команды. Главный должен повторить сообщение позже, когда подчиненный освободится. 07 Подчиненный не может выполнить программную функцию, принятую в запросе. Этот код возвращается для неудачного программного запроса, использующего функции с номерами 13 или 14. Главный должен запросить диагностическую информацию или информацию об ошибках с подчиненного. 08 Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. Главный может повторить запрос, но обычно в таких случаях требуется ремонт.
В протокол Modbus можно выделить несколько подмножеств команд ( Таблица 3-1).
Подмножество команд | Диапазон кодов команд |
---|---|
Стандартные команды | 1-21 |
Резерв для расширенных функций | 22-64 |
Пользовательские | 65-119 |
Резерв для внутренних нужд | 120-255 |
Тип адресации 4x
Значения регистров передаются в линию начиная с указанного адреса, следующие значения регистров передаются после него (см. поле «Данные»). Ниже приведены примеры команда ведущего устройства (таблица 3-2) и ответ ведомого (таблица 3-3):
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Кол. регистров ст. байт | 05 Кол. регистров мл. байт | 06 Кол. байт | 07 Данные ст. байт | 08 Данные мл. байт | 09 CRC мл. байт | 10 CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Master→Slave | 0x01 | 0x10 | 0x00 | 0x01 | 0x00 | 0x01 | 0x02 | 0xFF | 0xFF | 0xA6 | 0x31 |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Кол. регистров ст. байт | 05 Кол. регистров мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master | 0x01 | 0x10 | 0x00 | 0x01 | 0x00 | 0x01 | 0x50 | 0x09 |
Тип адресации 4x
Ниже приведены примеры команда ведущего устройства (таблица 3-4) и ответ ведомого (таблица 3-5):
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Кол. регистров ст. байт | 05 Кол. регистров мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Master→Slave | 0x01 | 0x03 | 0x00 | 0x01 | 0x00 | 0x01 | 0xD5 | 0xCA |
Значения регистров передаются в линию начиная с указанного адреса, следующие значения регистров передаются после него (см. поле «Данные»).
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Кол. Байт | 03 Данные ст. байт | 04 Данные мл. байт | 05 CRC мл. байт | 06 CRC ст. байт |
---|---|---|---|---|---|---|---|
Slave→Master | 0x01 | 0x03 | 0x02 | 0xFF | 0xFF | 0xB9 | 0xF4 |
Тип адресации 4x
Ниже приведены примеры команда ведущего устройства (таблица 3-2) и ответ ведомого (таблица 3-3):
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Данные ст. байт | 05 Данные мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Master→Slave | 0x01 | 0x06 | 0x00 | 0x01 | 0xFF | 0xFF | 0xD9 | 0xBA |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Данные ст. байт | 05 Данные мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master | 0x01 | 0x06 | 0x00 | 0x01 | 0xFF | 0xFF | 0xD9 | 0xBA |
Тип адресации 0x
Запрос:
Состоит из адреса флага и количества считываемых флагов. Адресация флагов начинается с 0, количество флагов с 1.
Ответ:
Значение флагов передается в одном бите в поле «Данные». Трактовка флагов: 1 = ON; 0 = OFF. 0-й бит первого байта данных содержит значение флага указанного в поле «Адрес». Если запросить состояние одного флага, то в младшем бите будет возвращено значение флага, а все остальные старшие биты заполнены нулями.
Ниже приведены примеры запроса ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7). В примере запрашивается состояние 9 флагов с адреса 1. В ответе содержится 2 байта данных, для большей ясности будем считать что все запрашиваемые флаги находятся в состоянии ON, а все остальные в состоянии OFF.
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Кол. флагов ст. байт | 05 Кол. флагов мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Master→Slave | 0x01 | 0x01 | 0x00 | 0x01 | 0x00 | 0x09 | 0x | 0x |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Количество байт | 03 Данные (флаги 0-7) | 04 Данные (флаги 8-15) | 05 CRC мл. байт | 06 CRC ст. байт |
---|---|---|---|---|---|---|---|
Slave→Master | 0x01 | 0x01 | 0x02 | 0xFF | 0x01 | 0x | 0x |
Тип адресации 0x
Команда:
Состоит из адреса флага, количества изменяемых флагов, количества передаваемых байт устанавливаемых значений. Адресация флагов начинается с 0, количество флагов с 1. Устанавливаемые значения передаются начиная с байта, в котором находится младшим битом значение, устанавливаемое по адресу указываемому в поле «00 адрес подчиненного устройства».
Ответ:
Состоит из начального адреса флага и количества записанных флагов. Адресация флагов начинается с 0, количество флагов с 1.
Ниже приведены примеры команды ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7).
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Количество флагов ст. байт | 05 Количество флагов мл. байт | 06 Количество байт данных | 07 Данные (значения для флагов биты 0-7) | 08 Данные (значения для флагов биты 8-15) | 09 CRC мл. байт | 0A CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Master→Slave | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Количество флагов ст. байт | 05 Количество флагов мл. байт | 05 CRC мл. байт | 06 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 |
Команда:
Состоит из адреса флага и устанавливаемого значения. Поле «Значение флага мл. байт» всегда равно нулю (0x00), поле «Значение флага ст. байт» принимает значения 0xFF если флаг устанавливается в «1»(ON) или 0x00 если флаг устанавливается в «0»(OFF), другие значения недопустимы и не влияют на значение флага. Адресация флагов начинается с 0.
Ответ:
Состоит из начального адреса флага и количества записанных флагов. Адресация флагов начинается с 0, количество флагов с 1.
Ниже приведены примеры команды ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7).
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Значение флага ст. байт | 05 Значение флага мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Master→Slave | 0x01 | 0x05 | 0x00 | 0x13 | 0xFF | 0x00 | 0x7D | 0xFF |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Значение флага ст. байт | 05 Значение флага мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master | 0x01 | 0x05 | 0x00 | 0x13 | 0xFF | 0x00 | 0x7D | 0xFF |
Ниже приведены примеры команда ведущего устройства (таблица 5-4) и ответ ведомого (таблица 5-5):
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Час [0..23] | 03 Минута [0..59] | 04 Секунды [0..59] | 05 День [1..31] | 06 Месяц [1..12] | 07 Год [0..99] | 08 Столетие [19-20] | 09 CRC мл. байт | 10 CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Master→Slave | 0x01 | 0x50 | 0x0A | 0x01 | 0x00 | 0x01 | 0x0A | 0x02 | 0x14 | 0x89 | 0x1C |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Час [0..23] | 03 Минута [0..59] | 04 Секунды [0..59] | 05 День [1..31] | 06 Месяц [1..12] | 07 Год [0..99] | 08 Столетие [19-20] | 09 CRC мл. байт | 10 CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Slave→Master | 0x01 | 0x50 | 0x0A | 0x01 | 0x00 | 0x01 | 0x0A | 0x02 | 0x14 | 0x89 | 0x1C |
traditio.wiki