Modbus -коммуникационный протокол, основан на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP (протокол Modbus TCP).
Сообщение Modbus RTU состоит из адреса устройства SlaveID, кода функции, специальных данных в зависимости от кода функции и CRC контрольной суммы.
Если отбросить SlaveID адрес и CRC контрольную сумму, то получится PDU, Protocol Data Unit.
Совместимость таблиц с кодами классов 2. Некоторые из этих объектов предопределены и зарезервированы, например, имя поставщика и код продукта, но приложения могут определять другие объекты, которые должны быть переданы в виде общих наборов данных. Ведомые используют исключения, чтобы указать количество ошибок, от искаженного запроса до неправильных записей. Однако исключения могут также генерироваться как ответ на уровне приложения для действительного запроса. Рабы не отвечают на запросы, выпущенные за одним исключением.
Вместо этого ведомый игнорирует неполные или измененные запросы и начинает ждать нового входящего сообщения. Во-первых, код функции возвращается мастеру запроса, равному исходному функциональному коду, за исключением его самого значимого битового набора.
SlaveID – это адрес устройства, может принимать значение от 0 до 247, адреса с 248 до 255 зарезервированы.
Данные в модуле хранятся в 4 таблицах.
Две таблицы доступны только для чтения и две для чтения-записи.
В каждой таблице помещается 9999 значений.
Номер регистра | Адрес регистра HEX | Тип | Название | Тип |
---|---|---|---|---|
1-9999 | 0000 до 270E | Чтение-запись | Discrete Output Coils | DO |
10001-19999 | 0000 до 270E | Чтение | Discrete Input Contacts | DI |
30001-39999 | 0000 до 270E | Чтение | Analog Input Registers | AI |
40001-49999 | 0000 до 270E | Чтение-запись | Analog Output Holding Registers | AO |
В сообщении Modbus используется адрес регистра.
Вместо обычных данных, связанных с данным ответом функции, ответы на исключения включают один код исключения. Они показаны в таблице 7 со стандартными значениями для каждой функции. Для большей надежности каждое сообщение включает в себя информацию проверки ошибок. Функциональные коды выше 127 зарезервированы для ответов на исключения. Поскольку человек появляется на земле, людям нужно было общаться между нами и окружающей средой вокруг нас; иногда даже необходимость записать его, чтобы написать его, для многих великое изобретение человека.
Например, первый регистр AO Holding Register, имеет номер 40001, но его адрес равен 0000.
Разница между этими двумя величинами есть смещение offset.
Каждая таблица имеет свое смещение, соответственно: 1, 10001, 30001 и 40001.
Ниже приведен пример запроса Modbus RTU для получения значения AI аналогового выхода (holding registers) из регистров от #40108 до 40110 с адресом устройства 17.
В настоящее время эта потребность в информации не прекращается; Напротив, людям нужно все больше и больше знать, что происходит вокруг нас, поэтому мы можем быть более эффективными в принятии наших решений. Содержит электронику. Кодирование в выводе бинарной информации на электрические сигналы и декодирование в приемнике.
Этот слой имеет два под-уровня. Контролирует, когда канал передачи свободен для отправки информации. Программируемое управление логикой, похоже, устранило огромные затраты на замену системы управления на основе реле на конец года. С этой системой, когда производство необходимо было варьировать, система была разнообразной, и она была готова продолжить работу.
11 03 006B 0003 7687
В ответе от Modbus RTU Slave устройства мы получим:
11 03 06 AE41 5652 4340 49AD
11 | Адрес устройства (17 = 11 hex) | SlaveID |
03 | Функциональный код | Function Code |
06 | Количество байт далее (6 байтов идут следом) | Byte Count |
AE | (AE hex) | Register value Hi (AO0) |
41 | (41 hex) | Register value Lo (AO0) |
56 | Значение старшего разряда регистра (56 hex) | Register value Hi (AO1) |
52 | Значение младшего разряда регистра (52 hex) | Register value Lo (AO1) |
43 | Значение старшего разряда регистра (43 hex) | Register value Hi (AO2) |
40 | Значение младшего разряда регистра (40 hex) | Register value Lo (AO2) |
49 | Контрольная сумма | CRC value Hi |
AD | Контрольная сумма | CRC value Lo |
Регистр аналогового выхода AO0 имеет значение AE 41 HEX или 44609 в десятичной системе.
Последующее промышленное развитие и продвижение в технологиях позволило разработать микропроцессоры, а затем способность общаться между ними примерно в год. Впоследствии была создана серия протоколов, которые принимаются сегодня. Может быть одно передающее и несколько приемных устройств. Сообщение полудуплексное, поэтому команда может отправлять и получать, но не в то же время. Основная проводка состоит из пары витых медных проводов, на которые передается дифференциальный сигнал для отправки битов данных, который невосприимчив к помехам и допускает большие расстояния.
Регистр аналогового выхода AO1 имеет значение 56 52 HEX или 22098 в десятичной системе.
Регистр аналогового выхода AO2 имеет значение 43 40 HEX или 17216 в десятичной системе.
Значение AE 41 HEX - это 16 бит 1010 1110 0100 0001, может принимать различное значение, в зависимости от типа представления.
Значение регистра 40108 при комбинации с регистром 40109 дает 32 бит значение.
В дополнение к витой паре данных для устройств шины питания могут использоваться линии 0В и 5В. Биты передаются через асинхронный кадр. Он используется для обмена информацией между устройствами, а также для контроля и управления ими. Благодаря этой системе информация поступает из помещения.
«Учитель спрашивает, а раб отвечает».
Коммуникатор выполняет интеллектуальное преобразование между последовательным протоколом контроллера и выбранной промышленной сетью. Это позволяет быстро подключить ваше оборудование. Типичные конфигурации доступны для загрузки. Гибкость и высокие промышленные стандарты Коммуникатора делают его пригодным для использования во многих промышленных применениях.
Пример представления.
Тип представления | Диапазон значений | Пример в HEX | Будет в десятичной форме |
---|---|---|---|
16-bit unsigned integer | 0 до 65535 | AE41 | 44,609 |
16-bit signed integer | -32768 до 32767 | AE41 | -20,927 |
two character ASCII string | 2 знака | AE41 | ® A |
discrete on/off value | 0 и 1 | 0001 | 0001 |
32-bit unsigned integer | 0 до 4,294,967,295 | AE41 5652 | 2,923,517,522 |
32-bit signed integer | -2,147,483,648 до 2,147,483,647 | AE41 5652 | -1,371,449,774 |
32-bit single precision IEEE floating point number | 1,2·10−38 до 3,4×10+38 | AE41 5652 | -4.395978 E-11 |
four character ASCII string | 4 знака | AE41 5652 | ® A V R |
Какие бывают команды Modbus RTU?
Приведем таблицу с кодами функций чтения и записи регистров Modbus RTU.
Благодаря этому уникальному методу настройки устройство настроено на выбранную вами сеть всего за 6 шагов. Его простота архитектуры, простота интеграции и высокая надежность оказываются идеальными для дистанционного управления пилотированием или сброса автоматизированного оборудования.
- Простая, но эффективная техническая архитектура.
- Легкая интеграция с установкой.
Код функции | Что делает функция | Тип значения | Тип доступа | |
---|---|---|---|---|
01 (0x01) | Чтение DO | Read Coil Status | Дискретное | Чтение |
02 (0x02) | Чтение DI | Read Input Status | Дискретное | Чтение |
03 (0x03) | Чтение AO | Read Holding Registers | 16 битное | Чтение |
04 (0x04) | Чтение AI | Read Input Registers | 16 битное | Чтение |
05 (0x05) | Запись одного DO | Force Single Coil | Дискретное | Запись |
06 (0x06) | Запись одного AO | Preset Single Register | 16 битное | Запись |
15 (0x0F) | Запись нескольких DO | Force Multiple Coils | Дискретное | Запись |
16 (0x10) | Запись нескольких AO | Preset Multiple Registers | 16 битное | Запись |
Как послать команду Modbus RTU на чтение дискретного вывода? Команда 0x01
Эта команда используется для чтения значений дискретных выходов DO.
В запросе PDU задается начальный адрес первого регистра DO и последующее количество необходимых значений DO. В PDU значения DO адресуются, начиная с нуля.
Значения DO в ответе находятся в одном байте и соответствуют значению битов.
Простой язык программирования позволяет вам обогащать и настраивать приложения.
Таким образом, могут быть получены структуры с несколькими мастерами, в которых каждая станция может связываться как с читателем, так и с писателем. Также возможно создавать приложения для супервизора с поддержкой веб-сервера, доступ к которым через Интернет-клиент можно получить через простой браузер.
Позволяет графически графически отображать время отслеживаемых и записанных переменных. Вы можете просматривать до 10 современных треков, включая переменные разных типов, каждый со своим цветом и масштабом. Существует несколько вариантов отображения как дорожки, фона, так и расположения различных элементов. Вы можете перемещать ось времени вперед или назад или изменять масштаб, масштабировать мышью и отображать значения всех переменных, которые нарисованы путем изменения временной координаты.
Значения битов определяются как 1 = ON и 0 = OFF.
Младший бит первого байта данных содержит значение DO адрес которого указывался в запросе. Остальные значения DO следуют по нарастающей к старшему значению байта. Т.е. справа на лево.
Если запрашивалось меньше восьми значений DO, то оставшиеся биты в ответе будут заполнены нулями (в направлении от младшего к старшему байту). Поле Byte Count Количество байт далее указывает количество полных байтов данных в ответе.
Предусмотрены также аварийные сигналы для немедленной сигнализации в зарезервированной области дисплея. Доступ к онлайновой и исторической информации организован на основе нескольких свободно присваиваемых классов. Для каждого события можно связать в дополнение к дате и времени значение нескольких портов, чтобы обеспечить изображение состояния имплантата во время запуска события.
Рецептами являются наборы характерных значений определенного качества изготовления или конкретной машинной настройки. Можно создать несколько моделей рецептов, каждый из которых состоит из набора переменных процесса, которые могут быть организованы в группы, на которых выполняются общие действия. Для каждой модели рецептов можно определить больше рецептов, каждый из которых состоит из набора значений, назначенных переменным процесса, определенным в модели. Шаблоны рецептов и рецепты могут быть созданы, переименованы или удалены.
Пример запроса DO с 20 по 56 для SlaveID адреса устройства 17. Адрес первого регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса (0014 hex = 20, -1 смещение нуля = получаем 0013 hex = 19).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
01 | Функциональный код | 01 | Функциональный код |
00 | 05 | Количество байт далее | |
13 | CD | Значение регистра DO 27-20 (1100 1101) | |
00 | Количество регистров Hi байт | 6B | Значение регистра DO 35-28 (0110 1011) |
25 | Количество регистров Lo байт | B2 | Значение регистра DO 43-36 (1011 0010) |
0E | Контрольная сумма CRC | 0E | Значение регистра DO 51-44 (0000 1110) |
84 | Контрольная сумма CRC | 1B | Значение регистра DO 56-52 (0001 1011) |
45 | Контрольная сумма CRC | ||
E6 | Контрольная сумма CRC |
Состояния выходов DO 27-20 показаны как значения байта CD hex, или в двоичной системе 1100 1101.
Также можно создавать новые рецепты, импортируя значения непосредственно из процесса. Передача рецепта процессу может быть запрошена оператором, который выполняется автоматически или контролируется программой.
Создание отчета может запрашиваться оператором либо циклически, либо в результате конкретное условие.
Каждый элемент меню, каждый синоптик, каждая переменная может быть защищена путем определения групп с возможностью доступа и редактирования, поэтому вы можете создать неограниченное количество операторов, назначив им имя, пароль и членство или нескольких групп.
В регистре DO 56-52 5 битов справа были запрошены, а остальные биты заполнены нулями до полного байта (000 1 1011).
Как послать команду Modbus RTU на чтение дискретного ввода? Команда 0x02
Эта команда используется для чтения значений дискретных входов DI.
Пример запроса DI с регистров от #10197 до 10218 для SlaveID адреса устройства 17. Адрес первого регистра будет 00C4 hex = 196, т.к. счет ведется с 0 адреса.
Все вмешательства модификации затем записываются в историю с указанием даты, времени, имени оператора и описания вмешательства, гарантируя тем самым возможность отслеживать причину любых нарушений в работе установки.
Служба использует компетентную и квалифицированную команду, чтобы предоставить вам все ответы на ваши вопросы.
Несмотря на то, что изначально задумывались для последовательного обмена данными, за многие годы родилось несколько вариантов, в основном направленных на то, чтобы протокол стал более подходящим для новых каналов связи. В дальнейшем мы сделаем ссылку на эту реальность.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
02 | Функциональный код | 02 | Функциональный код |
00 | Адрес первого регистра Hi байт | 03 | Количество байт далее |
C4 | Адрес первого регистра Lo байт | AC | Значение регистра DI 10204-10197 (1010 1100) |
00 | Количество регистров Hi байт | DB | Значение регистра DI 10212-10205 (1101 1011) |
16 | Количество регистров Lo байт | 35 | Значение регистра DI 10218-10213 (0011 0101) |
BA | Контрольная сумма CRC | 20 | Контрольная сумма CRC |
A9 | Контрольная сумма CRC | 18 | Контрольная сумма CRC |
Как послать команду Modbus RTU на чтение аналогового вывода? Команда 0x03
Эта команда используется для чтения значений аналоговых выходов AO.
Пример запроса AO с регистров от #40108 до 40110 для SlaveID адреса устройства 17. Адрес первого регистра будет 006B hex = 107, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
03 | Функциональный код | 03 | Функциональный код |
00 | Адрес первого регистра Hi байт | 06 | Количество байт далее |
6B | Адрес первого регистра Lo байт | AE | Значение регистра Hi #40108 |
00 | Количество регистров Hi байт | 41 | Значение регистра Lo #40108 |
03 | Количество регистров Lo байт | 56 | Значение регистра Hi #40109 |
76 | Контрольная сумма CRC | 52 | Значение регистра Lo #40109 |
87 | Контрольная сумма CRC | 43 | Значение регистра Hi #40110 |
40 | Значение регистра Lo #40110 | ||
49 | Контрольная сумма CRC | ||
AD | Контрольная сумма CRC |
Как послать команду Modbus RTU на чтение аналогового ввода? Команда 0x04
Эта команда используется для чтения значений аналоговых входов AI.
Протокол определяет, как ведущий и ведомые устройства устанавливают и прерывают связь, поскольку передатчик и приемник должны быть идентифицированы, как следует обмениваться сообщениями и как обнаруживать ошибки. Теоретический предел этого протокола - 247 ведомых и один ведущий в одной строке. Заменив последний компонент линии специальным мостом или биге, вы можете подключить еще 31 ведомый, достигший максимального логического числа разрешенных устройств.
Только мастер может начать транзакцию, а ведомые всегда ждут запроса. В последнем случае сообщение отправляется всем устройствам, подключенным к шине, которые выполняют команду, но не отвечают на отправителя. В частности, фактические данные, требуемые главным узлом, должны содержаться в «оболочке», которая будет содержать дополнительную информацию.
Пример запроса AI с регистра #30009 для SlaveID адреса устройства 17. Адрес первого регистра будет 0008 hex = 8, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
04 | Функциональный код | 04 | Функциональный код |
00 | Адрес первого регистра Hi байт | 02 | Количество байт далее |
08 | Адрес первого регистра Lo байт | 00 | Значение регистра Hi #30009 |
00 | Количество регистров Hi байт | 0A | Значение регистра Lo #30009 |
01 | Количество регистров Lo байт | F8 | Контрольная сумма CRC |
B2 | Контрольная сумма CRC | F4 | Контрольная сумма CRC |
98 | Контрольная сумма CRC |
Как послать команду Modbus RTU на запись дискретного вывода? Команда 0x05
Эта команда используется для записи одного значения дискретного выхода DO.
Объединение всей этой информации будет отправлено на канал связи на целевое устройство. В частности, это должно состоять из. Если получающее устройство обнаруживает ошибку в полученном сообщении, оно считает это недействительным и потеряет его. Ведомое устройство, которое обнаруживает ошибку в сообщении, не выполнит действие и не ответит на команду, а также если адрес не соответствует сетевому устройству.
Параметры подключения устройства. Первый байт пакета, передаваемого в шине, соответствует адресу получателя. Для обеспечения бесперебойной связи каждому подчиненному устройству должен быть назначен уникальный адрес. Только сообщения, которые не требуют ответа для выполнения своей функции, могут транслироваться как широковещательные, так что только назначения.
Значение FF 00 hex устанавливает выход в значение включен ON.
Значение 00 00 hex устанавливает выход в значение выключен OFF.
Все остальные значения недопустимы и не будут влиять значение на выходе.
Нормальный ответ на такой запрос - это эхо (повтор запроса в ответе), возвращается после того, как состояние DO было изменено.
Пример записи в DO с регистром #173 для SlaveID адреса устройства 17. Адрес регистра будет 00AC hex = 172, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
05 | Функциональный код | 05 | Функциональный код |
00 | Адрес первого регистра Hi байт | 00 | Адрес первого регистра Hi байт |
AC | Адрес первого регистра Lo байт | AC | Адрес первого регистра Lo байт |
FF | Значение Hi байт | FF | Значение Hi байт |
00 | Значение Lo байт | 00 | Значение Lo байт |
4E | Контрольная сумма CRC | 4E | Контрольная сумма CRC |
8B | Контрольная сумма CRC | 8B | Контрольная сумма CRC |
Состояние выхода DO173 поменялось с выключен OFF на включен ON.
Как послать команду Modbus RTU на запись аналогового вывода? Команда 0x06
Эта команда используется для записи одного значения аналогового выхода AO.
Пример записи в AO с регистром #40002 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 hex = 1, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
06 | Функциональный код | 06 | Функциональный код |
00 | Адрес первого регистра Hi байт | 00 | Адрес первого регистра Hi байт |
01 | Адрес первого регистра Lo байт | 01 | Адрес первого регистра Lo байт |
00 | Значение Hi байт | 00 | Значение Hi байт |
03 | Значение Lo байт | 03 | Значение Lo байт |
9A | Контрольная сумма CRC | 9A | Контрольная сумма CRC |
9B | Контрольная сумма CRC | 9B | Контрольная сумма CRC |
Как послать команду Modbus RTU на запись нескольких дискретных выводов? Команда 0x0F
Эта команда используется для записи нескольких значений дискретного выхода DO.
Пример записи в несколько DO с регистрами от #20 до #29 для SlaveID адреса устройства 17. Адрес регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
0F | Функциональный код | 0F | Функциональный код |
00 | Адрес первого регистра Hi байт | 00 | Адрес первого регистра Hi байт |
13 | Адрес первого регистра Lo байт | 13 | Адрес первого регистра Lo байт |
00 | Количество регистров Hi байт | 00 | |
0A | Количество регистров Lo байт | 0A | |
02 | Количество байт далее | 26 | Контрольная сумма CRC |
CD | Значение байт DO 27-20 (1100 1101) | 99 | Контрольная сумма CRC |
01 | Значение байт DO 29-28 (0000 0001) | ||
BF | Контрольная сумма CRC | ||
0B | Контрольная сумма CRC |
В ответе возвращается количество записанных регистров.
Как послать команду Modbus RTU на запись нескольких аналоговых выводов? Команда 0x10
Эта команда используется для записи нескольких значений аналогового выхода AO.
Пример записи в несколько AO с регистрами #40002 и #40003 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 hex = 1, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
10 | Функциональный код | 10 | Функциональный код |
00 | Адрес первого регистра Hi байт | 00 | Адрес первого регистра Hi байт |
01 | Адрес первого регистра Lo байт | 01 | Адрес первого регистра Lo байт |
00 | Количество регистров Hi байт | 00 | Кол-во записанных рег. Hi байт |
02 | Количество регистров Lo байт | 02 | Кол-во записанных рег. Lo байт |
04 | Количество байт далее | 12 | Контрольная сумма CRC |
00 | Значение Hi 40002 | 98 | Контрольная сумма CRC |
0A | Значение Lo 40002 | ||
01 | Значение Hi 40003 | ||
02 | Значение Lo 40003 | ||
C6 | Контрольная сумма CRC | ||
F0 | Контрольная сумма CRC |
Какие бывают ошибки запроса Modbus?
Если устройство получило запрос, но запрос не может быть обработан, то устройство ответит кодом ошибки.
Ответ будет содержать измененный Функциональный код, старший бит будет равен 1.
Было | Стало |
---|---|
Функциональный код в запросе | Функциональный код ошибки в ответе |
01 (01 hex) 0000 0001 | 129 (81 hex) 1000 0001 |
02 (02 hex) 0000 0010 | 130 (82 hex) 1000 0010 |
03 (03 hex) 0000 0011 | 131 (83 hex) 1000 0011 |
04 (04 hex) 0000 0100 | 132 (84 hex) 1000 0100 |
05 (05 hex) 0000 0101 | 133 (85 hex) 1000 0101 |
06 (06 hex) 0000 0110 | 134 (86 hex) 1000 0110 |
15 (0F hex) 0000 1111 | 143 (8F hex) 1000 1111 |
16 (10 hex) 0001 0000 | 144 (90 hex) 1001 0000 |
Пример запроса и ответ с ошибкой:
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
0A | Адрес устройства | 0A | Адрес устройства |
01 | Функциональный код | 81 | Функциональный код с измененным битом |
04 | Адрес первого регистра Hi байт | 02 | Код ошибки |
A1 | Адрес первого регистра Lo байт | B0 | Контрольная сумма CRC |
00 | Количество регистров Hi байт | 53 | Контрольная сумма CRC |
01 | Количество регистров Lo байт | ||
AC | Контрольная сумма CRC | ||
63 | Контрольная сумма CRC |
Расшифровка кодов ошибок
01 | Принятый код функции не может быть обработан. |
02 | Адрес данных, указанный в запросе, недоступен. |
03 | Значение, содержащееся в поле данных запроса, является недопустимой величиной. |
04 | Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие. |
05 | Ведомое устройство приняло запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет ведущее устройство от генерации ошибки тайм-аута. |
06 | Ведомое устройство занято обработкой команды. Ведущее устройство должно повторить сообщение позже, когда ведомое освободится. |
07 | Ведомое устройство не может выполнить программную функцию, заданную в запросе. Этот код возвращается для неуспешного программного запроса, использующего функции с номерами 13 или 14. Ведущее устройство должно запросить диагностическую информацию или информацию об ошибках от ведомого. |
08 | Ведомое устройство при чтении расширенной памяти обнаружило ошибку паритета. Ведущее устройство может повторить запрос, но обычно в таких случаях требуется ремонт. |
Программы для работы с протоколом Modbus RTU
Ниже перечислены программы, которые облегчают работу с Modbus.
DCON Utility Pro с поддержкой Modbus RTU, ASCII, DCON. Скачать
Modbus Master Tool с поддержкой Modbus RTU, ASCII, TCP. Скачать
Введение
Modbus относится к протоколам прикладного уровня сетевой модели OSI . Контроллеры на шине Modbus взаимодействуют, используя клиент-серверную модель, основанную на транзакциях , состоящих из запроса и ответа.
Обычно в сети есть только один клиент, так называемое, «главное» (англ. master ) устройство, и несколько серверов - «подчиненных» (slaves ) устройств. Главное устройство инициирует транзакции (передаёт запросы). Подчиненные устройства передают запрашиваемые главным устройством данные, или производят запрашиваемые действия. Главный может адресоваться индивидуально к подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчиненное устройство формирует сообщение и возвращает его в ответ на запрос, адресованный именно ему. При получении широковещательного запроса ответное сообщение не формируется.
Спецификация Modbus описывает структуру запросов и ответов. Их основа - элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1...127. Диапазон значений 128...255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.
номер функции | данные |
---|---|
1 байт | N < 253 (байт) |
Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи.
Существуют три основных реализации протокола Modbus, две для передачи данных по последовательным линиям связи, как медным EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так и оптическим и радио:
- Modbus ASCII,
и для передачи данных по сетям Ethernet поверх TCP/IP :
- Modbus TCP.
Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):
- адрес ведомого устройства - адрес подчинённого устройства, к которому адресован запрос. Ведомые устройства отвечают только на запросы, поступившие в их адрес. Ответ также начинается с адреса отвечающего ведомого устройства, который может изменяться от 1 до 247. Адрес 0 используется для широковещательной передачи, его распознаёт каждое устройство, адреса в диапазоне 248...255 - зарезервированы;
- номер функции - это следующее однобайтное поле кадра. Оно говорит ведомому устройству, какие данные или выполнение какого действия требует от него ведущее устройство;
- данные - поле содержит информацию, необходимую ведомому устройству для выполнения заданной мастером функции или содержит данные, передаваемые ведомым устройством в ответ на запрос ведущего. Длина и формат поля зависит от номера функции;
- блок обнаружения ошибок - контрольная сумма для проверки отсутствия ошибок в кадре.
Максимальный размер ADU для последовательных сетей RS232/RS485 - 256 байт, для сетей TCP - 260 байт.
Для Modbus TCP ADU выглядит следующим образом:
- ид транзакции - два байта, обычно нули
- ид протокола - два байта, нули
- длина пакета - два байта, старший затем младший, длина следующей за этим полем части пакета
- адрес ведомого устройства - адрес подчинённого устройства, к которому адресован запрос. Обычно игнорируется, если соединение установлено с конкретным устройством. Может использоваться, если соединение установлено с бриджом, который выводит нас, например, в сеть RS485.
Поле контрольной суммы в Modbus TCP отсутствует.
Категории кодов функций
В действующей в настоящее время спецификации протокола определяются три категории кодов функций:
Стандартные команды Их описание должно быть опубликовано и утверждено Modbus-IDA. Эта категория включает в себя как уже определенные, так и свободные в настоящее время коды. Пользовательские команды Два диапазона кодов (от 65 до 72 и от 100 до 110), для которых пользователь может реализовать произвольную функцию. При этом не гарантируется, что какое-то другое устройство не будет использовать тот же самый код для выполнения другой функции. Зарезервированные В эту категорию входят коды функций, не являющиеся стандартными, но уже используемые в устройствах, производимых различными компаниями. Это коды 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.
Модель данных
Одно из типичных применений протокола - чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре таблицы данных:
Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы, В этом случае команды работающие с дискретными данными и с 16-битными регистрами будут фактически обращаться к одним и тем же данным.
Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения - 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.
Стандартные функции протокола Modbus
номер функции |
запрос/ответ | |||||
---|---|---|---|---|---|---|
1 (0x01) | A 1 | A 0 | Q 1 | Q 0 | ||
N | D (N байт) | |||||
2 (0x02) | A 1 | A 0 | Q 1 | Q 0 | ||
N | D (N байт) | |||||
3 (0x03) | A 1 | A 0 | Q 1 | Q 0 | ||
N | D (N байт) | |||||
4 (0x04) | A 1 | A 0 | Q 1 | Q 0 | ||
N | D (N байт) | |||||
5 (0x05) | A 1 | A 0 | D 1 | D 0 | ||
A 1 | A 0 | D 1 | D 0 | |||
6 (0x06) | A 1 | A 0 | D 1 | D 0 | ||
A 1 | A 0 | D 1 | D 0 | |||
15 (0x0F) | A 1 | A 0 | Q 1 | Q 0 | N | D (N байт) |
A 1 | A 0 | Q 1 | Q 0 | |||
16 (0x10) | A 1 | A 0 | Q 1 | Q 0 | N | D (N байт) |
A 1 | A 0 | Q 1 | Q 0 |
- A 1 и A 0 - адрес элемента,
- Q 1 и Q 0 - количество элементов,
- N - количество байт данных
- D - данные
Чтение данных
Для чтения значений из перечисленных выше таблиц данных используются функции с кодами 1-4 (шестнадцатеричные значения 0x01-0x04):
- 1 (0x01) - чтение значений из нескольких регистров флагов (Read Coil Status)
- 2 (0x02) - чтение значений из нескольких дискретных регистров (Read Discrete Inputs)
- 3 (0x03) - чтение значений из нескольких регистров хранения (Read Holding Registers)
- 4 (0x04) - чтение значений из нескольких регистров ввода (Read Input Registers)
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым.
В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.
Значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым:
байт 1 | байт 2 | байт 3 | байт 4 | ... | байт N-1 | байт N |
---|---|---|---|---|---|---|
R A,1 | R A,0 | R A+1,1 | R A+1,0 | ... | R A+Q-1,1 | R A+Q-1,0 |
Значения флагов и дискретных входов передаются в упакованном виде: по одному биту на флаг. Единица означает включённое состояние, ноль - выключенное. Значения запрошенных флагов заполняют сначала первый байт, начиная с младшего бита, затем следующие байты, также от младшего бита к старшим. Младший бит первого байта данных содержит значение флага, указанного в поле «адрес». Если запрошено количество флагов, не кратное восьми, то значения лишних битов заполняются нулями.