Структура Modbus RTU сообщения. Сеть приборов, протокол MODBUS

Скачать Viber 24.08.2019
Скачать Viber

В этой статье вы узнаете о протоколе Modbus TCP, который является развитием протокола Modbus RTU. Англоязычная версия статьи доступна на ipc2u.com .

Куда посылать команду Modbus TCP?

В сети Ethernet адресом устройства является его IP-адрес. Обычно устройства находятся в одной подсети, где IP адреса отличаются последними цифрами 192.168.1.20 при использовании самой распространённой маски подсети 255.255.255.0.

Интерфейсом является сеть Ethernet , протоколом передачи данных – TCP/IP .

Используемый TCP-порт: 502 .

Описание протокола Modbus TCP

Команда Modbus TCP состоит из части сообщения Modbus RTU и специального заголовка.

Из сообщения Modbus RTU удаляется SlaveID адрес в начале и CRC контрольная сумма в конце, что образует PDU, Protocol Data Unit.

Ниже приведен пример запроса Modbus RTU для получения значения AO аналогового выхода (holding registers) из регистров от #40108 до 40110 с адресом устройства 17.

11 03 006B 0003 7687

Отбрасываем адрес устройства SlaveID и контрольную сумму CRC и получаем PDU:

03 006B 0003

К началу получившегося сообщения PDU добавляется новый 7-байтовый заголовок, который называется MBAP Header (Modbus Application Header). Этот заголовок имеет следующие данные:

Transaction Identifier (Идентификатор транзакции) : 2 байта устанавливаются Master, чтобы однозначно идентифицировать каждый запрос. Может быть любыми. Эти байты повторятся устройством Slave в ответе, поскольку ответы устройства Slave не всегда могут быть получены в том же порядке, что и запросы.

Protocol Identifier (Идентификатор протокола) : 2 байта устанавливаются Master, всегда будут = 00 00, что соответствует протоколу Modbus.

Length (Длина) : 2 байта устанавливаются Master, идентифицирующие число байтов в сообщении, которые следуют далее. Считается от Unit Identifier до конца сообщения.

Unit Identifier (Идентификатор блока или адрес устройства) : 1 байт устанавливается Master. Повторяется устройством Slave для однозначной идентификации устройства Slave.

Итого получаем:

Modbus RTU Slave ID Запрос CRC
Modbus RTU 11 03 006B 0003 7687
0001 0000 0006 11 03 006B 0003
PDU
ADU, Application Data Unit

В ответе от Modbus TCP Slave устройства мы получим:

0001 0000 0009 11 03 06 022B 0064 007F

0001 Идентификатор транзакции Transaction Identifier
0000 Идентификатор протокола Protocol Identifier
0009 Длина (9 байтов идут следом) Message Length
11 Адрес устройства (17 = 11 hex) Unit Identifier
03 Функциональный код (читаем Analog Output Holding Registers) Function Code
06 Количество байт далее (6 байтов идут следом) Byte Count
02 (02 hex) Register value Hi (AO0)
2B (2B hex) Register value Lo (AO0)
00 Значение старшего разряда регистра (00 hex) Register value Hi (AO1)
64 Значение младшего разряда регистра (64 hex) Register value Lo (AO1)
00 Значение старшего разряда регистра (00 hex) Register value Hi (AO2)
7F Значение младшего разряда регистра (7F hex) Register value Lo (AO2)

Регистр аналогового выхода AO0 имеет значение 02 2B HEX или 555 в десятичной системе.

Регистр аналогового выхода АО1 имеет значение 00 64 HEX или 100 в десятичной системе.

Регистр аналогового выхода АО2 имеет значение 00 7F HEX или 127 в десятичной системе.

Типы команд Modbus TCP

Приведем таблицу с кодами функций чтения и записи регистров Modbus TCP.

Код функции Что делает функция Тип значения Тип доступа
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 TCP на чтение дискретного вывода? Команда 0x01

Эта команда используется для чтения значений дискретных выходов DO.

В запросе PDU задается начальный адрес первого регистра DO и последующее количество необходимых значений DO. В PDU значения DO адресуются, начиная с нуля.

Значения DO в ответе находятся в одном байте и соответствуют значению битов.

Значения битов определяются как 1 = ON и 0 = OFF.

Младший бит первого байта данных содержит значение DO адрес которого указывался в запросе. Остальные значения DO следуют по нарастающей к старшему значению байта. Т.е. справа налево.

Если запрашивалось меньше восьми значений DO, то оставшиеся биты в ответе будут заполнены нулями (в направлении от младшего к старшему байту). Поле Byte Count Количество байт далее указывает количество полных байтов данных в ответе.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 04
01 Адрес устройства 01 Адрес устройства
01 Функциональный код 01 Функциональный код
00 01 Количество байт далее
00 02 Значение регистра DO 0-1
00 Количество регистров Hi байт
02 Количество регистров Lo байт

Состояния выходов DO0-1 показаны как значения байта 02 hex, или в двоичной системе 0000 0010.

Значение DO1 будет вторым справа, а значение DO0 будет первым справа (младший бит).

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

Модули с дискретным выводом: ioLogik E1211 , ET-7060 , ADAM-6060

Как послать команду Modbus TCP на чтение дискретного ввода? Команда 0x02

Эта команда используется для чтения значений дискретных входов DI.

Запрос и ответ для DI похож на запрос для DO.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 04
01 Адрес устройства 01 Адрес устройства
02 Функциональный код 02 Функциональный код
00 Адрес первого регистра Hi байт 01 Количество байт далее
00 Адрес первого регистра Lo байт 03 Значение регистра DI 0-1
00 Количество регистров Hi байт
02 Количество регистров Lo байт

Состояния выходов DI 0-1 показаны как значения байта 03 hex, или в двоичной системе 0000 0011.

Значение DI1 будет вторым справа, а значение DI0 будет первым справа (младший бит).

Шесть остальных битов заполнены нулями.

Модули с дискретным вводом: ioLogik E1210 , ET-7053 , ADAM-6050

Как послать команду Modbus TCP на чтение аналогового вывода? Команда 0x03

Эта команда используется для чтения значений аналоговых выходов AO.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 07
01 Адрес устройства 01 Адрес устройства
03 Функциональный код 03 Функциональный код
00 Адрес первого регистра Hi байт 04 Количество байт далее
00 Адрес первого регистра Lo байт 02 Значение регистра Hi (AO0)
00 Количество регистров Hi байт 2B Значение регистра Lo (AO0)
02 Количество регистров Lo байт 00 Значение регистра Hi (AO1)
64 Значение регистра Lo (AO1)

Состояния выхода AO0 показаны как значения байта 02 2B hex, или в десятичной системе 555.

Состояния выхода AO1 показаны как значения байта 00 64 hex, или в десятичной системе 100.

Модули с дискретным вводом: ioLogik E1210 , ET-7053 , ADAM-6050

Как послать команду Modbus TCP на чтение аналогового ввода? Команда 0x04

Эта команда используется для чтения значений аналоговых входов AI.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 07
01 Адрес устройства 01 Адрес устройства
04 Функциональный код 04 Функциональный код
00 Адрес первого регистра Hi байт 04 Количество байт далее
00 Адрес первого регистра Lo байт 00 Значение регистра Hi (AI0)
00 Количество регистров Hi байт 0A Значение регистра Lo (AI0)
02 Количество регистров Lo байт 00 Значение регистра Hi (AI1)
64 Значение регистра Lo (AI1)

Состояния выхода AI0 показаны как значения байта 00 0A hex, или в десятичной системе 10.

Состояния выхода AI1 показаны как значения байта 00 64 hex, или в десятичной системе 100.

Модули с аналоговым вводом: ioLogik E1240 , ET-7017-10 , ADAM-6217

Как послать команду Modbus TCP на запись дискретного вывода? Команда 0x05

Эта команда используется для записи одного значения дискретного выхода DO.

Значение FF 00 hex устанавливает выход в состояние включен ON.

Значение 00 00 hex устанавливает выход в состояние выключен OFF.

Все остальные значения недопустимы и не будут влиять на состояние выхода.

Нормальный ответ на такой запрос - это эхо (повтор запроса в ответе), возвращается после того, как состояние DO было изменено.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 06
01 Адрес устройства 01 Адрес устройства
05 Функциональный код 05 Функциональный код
00 Адрес регистра Hi байт 00 Адрес регистра Hi байт
01 Адрес регистра Lo байт 01 Адрес регистра Lo байт
FF Значение Hi байт FF Значение Hi байт
00 Значение Lo байт 00 Значение Lo байт

Модули с дискретным выводом: ioLogik E1211 , ET-7060 , ADAM-6060

Как послать команду Modbus TCP на запись аналогового вывода? Команда 0x06

Эта команда используется для записи одного значения аналогового выхода AO.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
06 06
01 Адрес устройства 01 Адрес устройства
06 Функциональный код 06 Функциональный код
00 Адрес регистра Hi байт 00 Адрес регистра Hi байт
01 Адрес регистра Lo байт 01 Адрес регистра Lo байт
55 Значение Hi байт 55 Значение Hi байт
FF Значение Lo байт FF Значение Lo байт

Состояние выхода AO0 поменялось на 55 FF hex, или в десятичной системе 22015.

Модули с аналоговым выводом: ioLogik E1241 , ET-7028 , ADAM-6224

Как послать команду Modbus TCP на запись нескольких дискретных выводов? Команда 0x0F

Эта команда используется для записи нескольких значений дискретного выхода DO.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
08 06
01 Адрес устройства 01 Адрес устройства
0F Функциональный код 0F Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
00 Адрес первого регистра Lo байт 00 Адрес первого регистра Lo байт
00 Количество регистров Hi байт 00
02 Количество регистров Lo байт 02
01 Количество байт далее
02 Значение байт

Состояние выхода DO1 поменялось с выключен OFF на включен ON.

Состояние выхода DO0 осталось выключен OFF.

Модули с дискретным выводом: ioLogik E1211 , ET-7060 , ADAM-6060

Как послать команду Modbus TCP на запись нескольких аналоговых выводов? Команда 0x10

Эта команда используется для записи нескольких значений аналогового выхода AO.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
01 Идентификатор транзакции 01 Идентификатор транзакции
02 02
00 Идентификатор протокола 00 Идентификатор протокола
00 00
00 Длина сообщения 00 Длина сообщения
0B 06
01 Адрес устройства 01 Адрес устройства
10 Функциональный код 10 Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
00 Адрес первого регистра Lo байт 00 Адрес первого регистра Lo байт
00 Количество регистров Hi байт 00 Кол-во записанных рег. Hi байт
02 Количество регистров Lo байт 02 Кол-во записанных рег. Lo байт
04 Количество байт далее
00 Значение Hi AO0 байт
0A Значение Lo AO0 байт
01 Значение Hi AO1 байт
02 Значение Lo AO1 байт

Состояние выхода AO0 поменялось на 00 0A hex, или в десятичной системе 10.


Структура сообщения протокола Modbus имеет следующий вид:

  1. адрес ведомого устройства – это адрес устройства, которому адресовано данное сообщение протокола Modbus. Устройства отвечают только на те сообщения, которые адресованы именно им. Ответ начинается с адреса ведомого устройства. Адрес изменяется в пределах 1…247. Адрес 0 в сообщении протокола Modbus зарезервирован под широковещательные сообщения, 248..255 – зарезервированные адреса.
  2. номер функции – 1 байт данных.
  3. данные – это поле содержит информацию о функции, которую нужно выполнить, либо данные, которые ведомое устройство посылает мастеру протокола Modbus.
  4. блок обнаружения ошибок (CRC) – контрольная сумма, которая вычисляется со всех предыдущих байт путем алгоритма циклического сдвига и побитового исключения.

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

Рассмотрим основные стандартные функции по их кодам (в десятичном и шестнадцатеричном формате):
1 (0х01) – чтение нескольких дискретных выходов
2 (0х02) - чтение нескольких дискретных входов
3 (0х03) - чтение нескольких промежуточных регистров или аналоговых выходов
4 (0х04) – чтение нескольких аналоговых входов
Если, например, количество дискретных входов, которые сформированы в запросе, не кратно восьми, то количество байт значений округляется в большую сторону и, соответственно, для получения, например, значений 15 дискретных входов, это количество будет равно двум байтам.
Перед данными сообщения Modbus передается один байт, значение которого - количество байт данных.
5 (0x05) - запись значения одного дискретного выхода
6 (0x06) - запись значения одного аналогового выхода или регистра
Команда Modbus состоит из адреса и собственно значения (2 байта). Нормальный ответ – повтор запроса протокола Modbus.
15 (0x0F) - запись значений в нескольких дискретных выходов
16 (0x10) - запись значений нескольких аналоговых выходов или регистров
Ответ состоит из начального адреса регистра и количества измененных значений.
Пример запроса/ответа протокола Modbus:

Ошибки при передаче делятся на 2 типа – искажение при передаче и логические. Искажение отслеживается по времени «тишины». Нормальное время между сообщениями – время, необходимое на передачу 3,5 символов. Если во время передачи сообщения протокола Modbus возникла пауза длинной более 1,5 символа, пакет отбрасывается.

Логические ошибки протокола Modbus возникают, если slave не может принять сообщение вообще, либо принимает его, но выдает ошибку. В таком случае ошибка диагностируется по тайм-ауту. Slave принимает запрос, но не может его обработать (к примеру, обращение к несуществующему адресу) – в таком случае отсылается сообщение об ошибке.

Пример сообщения Modbus об ошибке на запрос:

Стандартные коды ошибок протокола Modbus:
01 -Функция не может быть обработана на slave.
02 - Несуществующий адрес данных.
03 - Значение в поле данных для запроса, является недопустимым для salve.
04 - Произошла необратимая ошибка, пока slave пытался выполнить действие.
05 - Slave принял запрос и начал обрабатывать его, но на это потребуется время. Этот код предохраняет master от выдачи ошибки тайм-аута.
06 - Slave занят обработкой команды.Master должен повторить посылку сообщения позже, когда slave будет свободен.
07 -Slave не может выполнить функцию из запроса. Master должен послать запрос об диагностической информации или получить информацию об ошибках со slave.
08 - Slave пытается считать область памяти, но при этом обнаружена ошибка паритета. Master может повторить запрос, но обычно в таких случаях требуется ремонт.

Структура кадра Modbus TCP:

Где:
ID транзакции - два байта
ID протокола - два байта (четыре нуля)
длина пакета - два байта, размер последующих полей сообщения
адрес ведомого устройства - адрес slave, которому адресован запрос протокола Modbus.
Особенность протокола Modbus TCP – отсутствие контрольной суммы, так как на транспортном уровне протокола TCP происходит проверка CRC. Поэтому проверка контрольной суммы в формате RTU не имеет смысла.

Ну что же, пора рассмотреть, чем протокол Modbus TCP отличается от протокола Modbus RTU . Так как отличий не очень много, то и статья будет не очень большая.
Итак, в предыдущей стать о функциях Modbus RTU можно узнать, какие есть функции и их бинарный формат. Теперь стоит рассказать что такое Modbus TCP , как он применяется и чем отличается от стандартного Modbus RTU .

Modbus RTU через TCP соединение

Самый простой способ обмена Modbus сообщениями через сеть – просто передавать Modbus RTU пакеты через TCP сокет (соединение). В этом случае формат пакетов такой же, как и для Modbus RTU протокола. В принципе на этом можно и закончить по этому типу протокола.

Modbus TCP

Для обмена Modbsu сообщениями по сети решили использовать модифицированный протокол. Взяли стандартный Modbus RTU и немного его изменили. Во-первых убрали из него последних 2 байта CRC16 . Так как каждый пакет TCP/IP содержит свою контрольную суму, решили что делать проверку еще раз не нужно. Кроме того убрали первый байт Slave ID . В принципе, Как будет видно дальше, Его не убрали, а просто переименовали. Вот эти байты, без Slave ID и CRC16 назвали PDU – Protocol Data Unit .

Например, возьмем запрос Modbus RTU , который читает несколько HOLDING регистров с устройства #17 (Slave ID = 17)

11 03 006B 0003 7687

Теперь убираем первый и последних 2 байта. Получаем PDU !

03 006B 0003

С этим вроде все ясно. Теперь, что бы получить полноценный пакет Modbus TCP нам нужно добавить впереди MBAP Header — Modbus Application Header . Т.е. нам нужно добавить некий заголовок. Этот заголовок включает в себя Transaction ID , Protocol ID , Length и Unit ID .

Transaction ID – 2 байта, которые устанавливаются клиентом, что бы однозначно идентифицировать каждый запрос. Т.е. это просто число от 0 до 65535 уникальное для каждого запроса.

Protocol ID – 2 байта, которые определяют версию протокола. В текущей реализации всегда должны быть равны 0x00 0x00

Length – 2 байта, которые определяют длину пакета (за исключением байтов Protocol ID , Transaction ID и Length )

Unit ID – уникальный адрес устройства, которое опрашивается данной командой. Идентично Slave ID .

Небольшое отступление по поводу адресации. Может показаться что это излишне, так как TCP соединение может быть установлено только на конкретный IP адрес и порт. Т.е. у нас уже есть конкретный адрес сервера, поэтому назначение Unit ID не совсем понятно.

Но на самом деле вполне обычна ситуация, когда есть некий сервер, который просто маршрутизирует Modbus RTU запросы на другие устройства, которые подсоединены к нему по различным каналам (локальная сеть, последовательный порт, CAN интерфейс). Поэтому клиент может использовать Modbus TCP сервер как шлюз (Gateway ) для общения с устройствами за ним.

Пример Modbus TCP сервера, который используется как шлюз для перенаправления запросов на Modbus RTU устройства

Вот пример из жизни. Есть некое устройство основанное на Linux. Это устройство выступает Modbus TCP сервером. Любой клиент может подсоединиться к публичному IP адресу на порт 502 и инициировать Modbus TCP соединение. К данному Linux устройству подключены сенсоры, которые использую последовательный порт RS485. Сенсоров много, они очень простые и не могут быть подключены к Internet, у них есть только порт RS485 и они понимают только Modbus RTU . Поэтому клиенты посылают Modbus TCP запросы с Unit ID сенсоров на Modbus TCP Сервер. Сервер декодирует Modbus TCP запрос и преобразует его в Modbus RTU и отправляет в порт RS485. После того как сенсор отвечает ему, он преобразует Modbus RTU ответ в Modbus TCP ответ и отсылает его назад, к Modbus TCP клиенту, который инициировал запрос. Таким образом, имея всего один публичный IP адрес можно опрашивать онлайн сотню сенсоров, которые даже не могут быть подсоединены к Интернету или локальной сети.

А теперь наглядная схема, чем отличается Modbus RTU запрос от Modbus TCP запроса.

Посмотрим пример байтов для двух запросов:

Modbus RTU: 11 03 006B 0003 7687 Modbus TCP: 0001 0000 0006 11 03 006B 0003

Пример ответа:

Modbus TCP: 0001 0000 0009 11 03 06 AE41 5652 4340 Modbus RTU: 11 03 06 AE41 5652 4340 49AD

Как видите, конвертировать запросы между Modbus RTU и Modbus TCP очень просто. Хотя реализация Modbus RTU через TCP может показаться самым простым способом для маршрутизации запросов, на самом деле в Modbus TCP есть несколько положительных моментов:

  • Не нужно вычислять CRC16
  • Есть возможность идентифицировать пару ответ / запрос используя Transaction ID
  • Можно легко добавлять свои версии протоколов, меняя константу Protocol ID

Modbus -коммуникационный протокол, основан на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP (протокол Modbus TCP).

Сообщение Modbus RTU состоит из адреса устройства SlaveID, кода функции, специальных данных в зависимости от кода функции и CRC контрольной суммы.

Если отбросить SlaveID адрес и CRC контрольную сумму, то получится PDU, Protocol Data Unit.

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 используется адрес регистра.

Например, первый регистр AO Holding Register, имеет номер 40001, но его адрес равен 0000.

Разница между этими двумя величинами есть смещение offset.

Каждая таблица имеет свое смещение, соответственно: 1, 10001, 30001 и 40001.

Ниже приведен пример запроса Modbus RTU для получения значения AO аналогового выхода (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 Lo
AD Контрольная сумма CRC value Hi

Регистр аналогового выхода 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 бит значение.

Пример представления.

Тип представления Диапазон значений Пример в 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.

Код функции Что делает функция Тип значения Тип доступа
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 в ответе находятся в одном байте и соответствуют значению битов.

Значения битов определяются как 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).

Модули с дискретным выводом: M-7065 , ioLogik R1214 , ADAM-4056S

Как послать команду 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

Модули с дискретным вводом: M-7053 , ioLogik R1210 , ADAM-4051

Как послать команду 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

Модули с аналоговым выводом: M-7024 , ioLogik R1241 , ADAM-4024

Как послать команду Modbus RTU на чтение аналогового ввода? Команда 0x04

Эта команда используется для чтения значений аналоговых входов AI.

Пример запроса 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

Модули с аналоговым вводом: M-7017 , ioLogik R1240 , ADAM-4017+

Как послать команду 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.

Модули с дискретным выводом: M-7053 , ioLogik R1210 , ADAM-4051

Как послать команду 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

Модули с аналоговым выводом: M-7024 , ioLogik R1241 , ADAM-4024

Как послать команду 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

В ответе возвращается количество записанных регистров.

Модули с дискретным выводом: M-7053 , ioLogik R1210 , ADAM-4051

Как послать команду 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

6.3. MODBUS Serial

Первые сети MODBUS базировались на асинхронных последовательных линиях связи и получили название MODBUS RTU и MODBUS ASCII . На физическом уровне они используют стандартные последовательные интерфейсы с символьным режимом передачи (см. рис.6.1).

В настоящее время в MODBUS-IDA эти сети получили название MODBUS over Serial Line и описаны в соответствующем стандарте. В нем указываются правила и рекомендации использования на канальном и физическом уровне.

Поскольку сеть MODBUS RTU/ASCII может иметь шинную топологию, определен метод доступа к шине - это модель Ведущий/Ведомый. В сетях MODBUS RTU и MODBUS ASCII Процесс Ведущего всегда является Клиентом, а Процессы Ведомых - Серверами. Это значит, что Ведущий отсылает запросы, а Ведомые их обрабатывают. Этот запрос может быть адресован как индивидуальному узлу так и всем Ведомым на шине (broadcast).

На канальном уровне MODBUS RTU/ASCII используется адресация, ориентированная на идентификаторы узлов. Каждый Ведомый должен иметь свой уникальный адрес (1-247), Ведущий не адресуется. При индивидуальных запросах, Ведущий (с клиентским Процессом) формирует кадр с сообщением-запросом и отправляет его по указанному адресу. Ведомый (с серверным Процессом) получает этот кадр и обрабатывает сообщение. После его обработки, Ведомый формирует кадр с сообщением-ответом, и отправляет его обратно Ведущему. Кадр с сообщением-ответом носит также функции кадра подтверждения, которого Ведущий будет ждать от Ведомого течение времени, определенного тайм-аутом.

При широковещательных запросах (broadcast) используется 0-вой адрес. Широковещательные запросы не требуют подтверждения, поэтому после отправки широковещательного кадра, Ведущий не ожидает ответного кадра.

6.3.1. Канальный уровень

На рис.6.11 показан общий вид кадра MODBUS Serial. Обратите внимание, что разграничение между кадрами и тип контрольной суммы здесь не указаны, поскольку это зависит от режима передачи ASCII или RTU. В поле адреса устройства Ведущий (при запросе) указывает адрес получателя, а Ведомый (при ответе) - свой адрес. Поля MODBUS PDU описаны выше.

На временной диаграмме рис.6.12 показаны три типичные ситуации работы модели Ведущий-Ведомый на MODBUS Serial. Первая ситуация - типичный обмен в одноадресном режиме, вторая - в широковещательном, третья - реакция Ведомого на коммуникационную ошибку.

6.3.2. MODBUS RTU

Данный режим предусматривает использование 8 бит данных в 11-битном символе, который позволяет передавать по байту на символ. Формат символа в RTU режиме: 1 стартовый бит, 8 бит данных (младший бит передается первым), 1 бит паритета + 1 стоповый бит или без паритета + 2 стоповых бита.

Формат кадра MODBUS RTU приведен на рисунке 6.13. Разграничение между кадрами производится с помощью пауз между символами. Новый кадр не должен появляться на шине раньше, чем 3.5 * Тс от предыдущего, где Тс - время передачи одного символа. Если отсутствие сигнала на линии (интервал тишины) будет больше чем 1.5 * Тс приемник идентифицирует окончание кадра. С другой стороны, появление нового кадра ранее 3.5 * Тс, тоже приведет к ошибке.

Поле адреса и кода функции в RTU режиме занимают по одному байту, поскольку каждый байт передается одним символом. В качестве контрольной суммы используется два байта, посчитанные по алгоритму CRC16.


6.3.3. MODBUS ASCII

В данном режиме каждый байт сообщения передается как два ASCII символа их шестнадцатеричного представления, т.е. значение байта 03 16 будет передаваться как ASCII-код символов "0" и "3" (0110000 0110011) Таким образом, байты данных, код функции и байт поля проверки будет передаваться кодами символов 0-9, A-F. Формат символа в ASCII-режиме: 1 стартовый бит, 7 битов данных (младший бит передается первым); 1 бит паритета + 1 стоповый бит или без паритета + 2 стоповых бита.

Формат кадра приведен на рис.6.14. Как видим, для разграничения между кадрами используются стартовый символ ":" и стоповая последовательность "CR LF". Приемники на шине непрерывно отслеживают символ ":" который однозначно указывает на начало кадра. Когда он принят, приемники отлавливают поле адреса и т.д. Это очень простой способ синхронизации, который позволяет некритически относиться к паузам между символами (до 1 сек.). Адрес Ведомого и код функции занимают по два символа, согласно значению одного байта. Далее идут n * 2 символов данных, где n количество байт данных. В ASCII режиме для подсчета контрольной суммы используется алгоритм LRC. Причем контрольная сумма проводится над всеми байтами кадра, кроме стартовой и стоповой последовательности символов.

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

Пример 6.4. MODBUS. Расчет времени опроса ведомых на MODBUS-RTU.

Задача . Построить кадры форматов сообщений запросов и ответов для MODBUS RTU и рассчитать общее время опроса 10-ти аналоговых 16-битных переменных для 4-х ведомых (рис.6.15). Битовая скорость передачи данных - 19200 бит/с. Клиентский Процесс Ведущего (TSX Premium) и серверные Процессы ведомых (ПЛК TSX Micro) принимают сообщения в начале цикла, а отправляют - в конце цикла. Время цикла Ведущего = 10 мс, Ведомого - 5с .

Выполнения задания. Доступ к внутренним аналоговым переменным TSX Micro проводится через 03 или 04 функцию, поэтому формат кадров будет выглядеть как на рис.6.16.

Учитывая, что структура других кадров - аналогичная, приводить их формат нет смысла.
Аналогично рис.6.12 построим временную диаграмму обмена (рис.6.17).

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

В TSX Micro MODBUS-сервер реализован на уровне операционной системы. Специфика реализации заключается в том, что прием MODBUS-запросов из коммуникационного порта системой проводится в начале цикла, а отправка сообщений-ответов – в конце.

Следует отметить, что реализация MODBUS-сервера может быть поддержана на уровне коммуникационного модуля, а обмен данными с памятью самого устройства производится через коммуникационные буферы. В этом случае реакция MODBUS-сервера будет значительно быстрее и не зависеть от цикла программы. Для расчета времени транзакции для других типов систем необходимо ознакомиться с деталями их реализации.

На рис.6.17 показано, что поступления кадра приходит где-то внутри цикла. Это значит, что их обработка и генерация ответа пройдет примерно через 1,5 цикла. Следует понимать, что это усредненное значение, для наихудшей оценки лучше резервировать 2 времени цикла (т.е. когда кадр пришел сразу после опроса коммуникационного порта). Таким образом время транзакции для одного ПЛК, например PLC1 (ТТ1), будет равна:

ТТ1=С5+T1.req+2*C1+T1.res+C5*2 (6.1)

ТТ1 рассчитан с учетом 2-х циклов затраченных Ведомым на генерацию ответа на сообщение-запрос. Если бы транзакция проводилась не периодически, как по условию задачи, а по возникновению события, то во время транзакции необходимо было бы включить также еще один цикл Ведущего. Несложно вывести время опроса всех ведомых:

ТТall=C5*9+C1*2+C2*2+C3*2+C4*2+T1.req+T1.res+ T2.req+T2.res+ T3.req+T3.res+ T4.req+T4.res (6.2)

Учитывая, что циклы Ведомых одинаковы, а кадры запросов и кадры ответов для всех ведомых имеют одинаковую структуру, общая формула будет иметь следующий вид:

ТТall= C5*9 + C1*8 + (T1.req+T2.req)*4(6.3)

Рассчитаем время T1.req и T2.req.

Время передачи кадра (Тframe) можно ориентировочно рассчитать по количеству символов (Nsymb) в кадре и времени передачи одного символа (Tsymb):

Tframe=Nsymb*Tsymb (6.4)

Время передачи одного символа рассчитывается:

время передачи одного символа = количество бит в символе/битовая скорость;
Время передачи кадров будет равна (див.рис.6.16 и рис.6.17):

T1.req=8*(11/19200)=4,58 мс

T1.res=25*(11/19200)=14,33 мс

TTall=90+40+ (4,58+14,33)*4= 206 мс.

Таким образом, для опроса 10-ти переменных из 4-х Ведомых со скоростью 19200 бит/с необходимо затратить примерно 206 мс. Если необходим периодический опрос, желательно зарезервировать определенное время, например еще дополнительно 100 мс.

В ряде случаев, реализация функций MODBUS-Клиента ложится на операционную систему, а доступ к ним в программе ПЛК происходит через интерфейсные коммуникационные функции. В частности, это характерно для большинства ПЛК от Scneider Electric (Momentum, Quantum, TSX Micro, TSX Premium, M340). В ряде других систем - клиентскую сторону на прикладном уровне необходимо полностью прописывать в программе ПЛК, а интерфейс предоставляется только для обмена с коммуникационным портом. В этом случае система предоставляет сервисы отправки и получения сообщений (которые формирует и анализирует сама программа пользователя), и генерации и проверки контрольной суммы. Рассмотрим пример .

Пример 6.5. MODBUS. Реализация MODBUS-клиента на TSX Twido.

Задача . Записать фрагмент программы в ПЛК Twido для считывания 3-х регистров с Ведомого с адресом 1 (рис.6.18).

Решение . В Twido клиентскую сторону MODBUS необходимо реализовывать через универсальную функцию EXCHx, которая отправляет и/или получает данные через коммуникационный порт с номером x. Параметрами функции являются таблица слов (%MW), в которых размещаются данные управления функцией, данные для отправки и буфер для приема. Если обмен будет проходить через коммуникационный порт 2, то вызов функции будет иметь следующий формат :

EXCH2 %MWy:n,

где y - номер первой переменной выделенной таблицы, n - количество слов в таблице.

Формат таблицы, то есть данных, которые необходимо заполнить, и область данных для приема одинаков для всех типов коммуникаций. Для функций 03/04 (чтение N слов) по MODBUS-RTU эта таблица будет иметь вид, приведенный в табл.6.2).

Таблица параметров состоит из 3-х частей-подтаблиц. В таблице управления функцией задаются параметры самой функции. Так в старшем байте 0-го слова указывается, что эта функция работает в обе стороны, т.е. после отправки данных, необходимо ждать ответа. Младший байт этого же слова указывает на длину таблицы передачи (в данном случае 6 байт), для того чтобы система знала о байтах которые необходимо передать (со 2-го слова по 4-е) и откуда начинается буфер приема (с 5-го слова) . Смещение в передаче и приеме необходимо для выравнивания данных в буферах по словам.

Таблица передачи содержит непосредственно сам запрос, т.е. кадр без кода CRC. Таблица приема - это буфер, который система заполнит кадром ответа, при положительном результате. Таким образом, перед использованием этой функции необходимо построить кадр запроса и ответа за исключением поля CRC (рис.6.19)

Таблица 6.2

Таблица параметров

Индекс в таблице

Старший байт

Младший байт

Таблица управления комм. функцией

01 (тип ф-ции отправка+приём)

06 (длина таблицы передачи)

03 (смещение в приёме)

00 (смещение в передаче)

Таблица передачи

адрес Ведомого

03 (номер функции)

адрес начального регистра

количество регистров

Таблица приёма (сообщение-ответ)

адреса Ведомого

03 (номер функции)

00 (байт для смещения)

счнтчик байт

первый регистр

второй регистр

...

N+6

N-ный регистр

Как видим, в запросе 6 байт. Это количество необходимо вписать в младший байт 0-го слова таблицы. В ответе ожидается 9-байт. Если байты кадра ответа разместить в последовательности слов (в ПЛК Schneider Electric память адресуется словами), то старший байт первого принятого регистра (согласно условию это %MW100) будет находиться на младшем байте 2-го слова буфера, а младший байт принятого регистра придется на старший байт 3-го слова в буфере. Таким образом, все принятые слова будут смещены, и прочитать их будет проблематично. Для устранения этой проблемы в таблице параметров функции есть поле смещения приема, в котором указывается номер байта в буфере приема, который будет сдвигать всю последовательность.

Фрагмент программы будет выглядеть как на рис.6.20.
Верхняя цепочка LD предназначена для заполнения таблицы управления функцией и заполнения таблицы передачи.

Во второй цепочке производится непосредственно вызов функции. Переменная %MSG2.D возвращает логическую "1", когда функция EXCH2 обработана и результат получен. Ее использование не дает "затопить" сеть чрезмерным количеством кадров, ведь пока нет ответа на предыдущий запрос или не прошло время тайм-аута, новый запрос отправлять нельзя.

Последний цепочка предназначена для записи результата чтения в переменные %MW0:3 (таблица с 3-х слов начиная с %MW0). Переменная %MSG2.E будет равной 1-це тогда, когда есть место ошибки в вызове функции.

6.3.4. Реализация физического уровня для MODBUS Serial

В отличие от начальной спецификации, которая ограничивалась описанием кадра, в стандарте MODBUS-IDA описываются также правила для реализации сети на физическом уровне. MODBUS over Serial Line базируется на использовании последовательных интерфейсов RS-485, RS-422 и RS-232.

Для RS-485 определена топология - это шина, в которой предусмотрено три способа подключения устройств (рис.6.21):

- Непосредственно к магистральному (trunk) кабелю, без ответвлений;

- Через пассивную коробку подключения и кабель ответвления (Derivation);

- Через активную коробку и специфический кабель ответвления.

Интерфейсы между кабелями и элементами сети имеют следующие обозначения (см. рис.6.21): ITr - интерфейс к магистральному кабелю; IDv - интерфейс между устройством и пассивной коробкой; AUI - интерфейс между устройством и активной коробкой; LT - терминаторы линии.
Битовые скорости определены равными 9600 бит/с и 19200 бит/с (по умолчанию). Другие скорости являются опциональными. Используется метод кодирования NRZ.

При использовании RS-485 стандарт определяет правила подключения устройств по 2-х проводной и 4-х проводной схеме, а также правила совместимости 2-х проводных и 4-х проводных интерфейсов на единственной линии. Ниже рассмотрено только 2-х проводное подключение, поддержка которого является обязательным.

По сути, 2-х проводное подключение на самом деле является 3-х проводным, так как кроме линий A-(D0 ) и B+(D1 ) используется также общая линия C(Common ), которая является обязательной (рис.6.22) .

Общее количество устройств ограничено: 32 устройства на одном сегменте RS-485 без репитеров (использование репитеров разрешается). Максимальная длина кабеля зависит от скорости, типа кабеля, количества нагрузок и конфигурации сети (2-х проводная или 4-х проводная). Для битовой скорости 9600 и кабеля AWG26 максимальная длина ограничена 1000м. Кабель ответвления должен быть короче 20 м. Если используются мультипортовые коробки с n портами, то каждый кабель ответвления ограничен длиной 40/n м.

Общий сигнальный провод (Common) обязательно соединяется с экраном в одной точке шины, как правило возле узла Ведущего, либо его коробки ответвления.

Для погашения отражения волн на концах линии между D1 и D0 выставляется терминаторы линии (LT). Терминаторы разрешается выставлять только на магистральном кабеле. В качестве терминаторов можно использовать:

- Резистор номиналом 150 Ом и мощностью 0.5 Вт;

- Последовательно соединенные конденсатор (1 нФ, 10 В минимум) и резистор номиналом 120 Ом (0.25 Вт) при использовании поляризации линии

В стандарте MODBUS Serial определены правила реализации защитного смещения (поляризации), которые предусматривают подключение питания номиналом 5 В между D1 и D0 через PullUp и PullDown резисторы для поддержания логической "1" на линии при отсутствии передачи. Номинал резисторов выбирается от 450 Ом до 650 Ом в зависимости от количества устройств (650 Ом при большом количестве). Защитное смещение проводится только в одной точке линии, как правило на стороне Ведущего. Максимальное количество устройств с реализованной поляризацией уменьшается на 4 по сравнению с системой без поляризации. Поляризация является необязательной. Однако коммуникации на устройствах могут давать сбой при отсутствии логического сигнала. Если это так, то поляризацию необходимо реализовывать самостоятельно, или использовать существующие схемы, если таковые предусмотрены устройствами.

Стандарт определяет также механический интерфейс, т.е. типы разъемов, вилок и соответствие сигналов на контактах. В качестве механического терминала можно использовать клемную колодку, экранированный RJ-45 (рис.6.23) или экранированный SUB-D9 разъем (рис.6.24).

В таблице 6.3 указано назначение контактов для коннекторов при 2-х проводном подключением по RS-485, а в таблице 6.4 по RS-232

Таблица 6.3

Предназначение контактов конекторов при подключении по RS-485

номера контактов

требования к наличию

цепь IDv

цепь ITr

название RS-485

комментарий

(см. раздел 3)

RJ45

SUB-D9

опционально

PMC

управление режимом ком. порта

обязательно

D1

B/B"

напряж V1, V1>V0 для лог. "1"

обязательно

D0

A/A"

напряж V0, V0>V1 для лог. "0"

желательно

Питание 5…24 VDC

обязательно

Common

Common

C/C"

Питание и сигнальная земля

Таблица 6.4

Предназначение контактов конекторов при подключении по RS-232

DCE (модем)

контур

DTE

номера контактов

требования к наличию

название

комментарий

(см. раздел 3)

источник

RS-232

требования к наличию

номера

контактов

RJ45

SUB-D9

RJ45

SUB-D9

обязательно

TxD

Transmitted Data

<< DTE

обязательно

обязательно

RxD

Received Data

DCE >>

обязательно

опционально

CTS

Clear to Send

DCE >>

опционально

опционально

RTS

Request to Send

<< DTE

опционально

обязательно

Common

Signal Common

обязательно

В качестве кабелей для 2-х проводного типа соединения стандарт определяет двойную экранированную витую пару категорий 4 (до 600м) или 5 (до 1000м), где в одной паре идут сбалансированные сигналы D0 и D1, а во второй - сигнальная земля Common. Рекомендуемые цвета кабелей: D1 желтый; D0 коричновий; Common серый.

Пример 6.6. MODBUS. Схема сетевых соединений MODBUS RTU.

Задача . Нарисовать схему сетевых соединений для 2-х проводной реализации шины MODBUS RTU со следующими узлами:

- PLC1: VIPA CPU 115SER 6BL32 (Ведущий) через встроенный последовательный порт процессорного модуля;

- PLC2: TSX Twido TWDLMDA40DTK (Ведомый) через коммуникационный модуль TWD NOZ 485T

- PLC3: TSX Twido TWDLMDA40DTK (Ведомый) через коммуникационный модуль TWD NOZ 485T

Решение . На рис.6.25 показана схема сетевых соединений для поставленной задачи. Спецификация сетевых средств дана в таб.6.5.

Как видно из рис.6.25, PLC1 подключается к шине через пассивную коробку, а вернее через клеммную колодку, что в принципе равнозначно. Это вызвано тем, что на ПЛК подключения идет с использованием 9-штекерного SUB-D разъема, что требует разработку собственного кабеля, схема подключения (спая) которого к коннектору и к клеммной колодке показан ниже основной схемы.

Таким образом к вилке КК1 провода кабеля КМ2 необходимо припаять. Назначение пинов розетки SER не совпадает со стандартной. Пины 8 и 3 (соответственно А (D0) и В (D1)) идут в одну пару, затем подключаются к ХТ1:1 и ХТ1:2; 5 и 6 (соответственно M5V (-5В) и P5V (+5 В)) идут в другую витую пару кабеля КМ2. Питания 5В необходимо для того, чтобы реализовать защитное смещение (асимметрию) в соответствии со стандартом. Кроме того M5V является сигнальной землей (Common).

Кабель КМ2 подключается к ХТ1 согласно схеме, показанной на рис.6.25. Экран кабеля соединяется с сигнальной землей в соответствии с требованиями стандарта. Следует напомнить, что ПЛК VIPA в этой системе является Ведущим, следовательно и защитное смещение и соединения экрана с землей необходимо реализовывать именно в этом месте. Защитное смещение производится с помощью питания 5В, которое берется из порта SER и двух резисторов.

Таблица 6.5.

Спецификация сетевых средств

Обозначение

Наименование

Референс

Колич

Примечание

PLC1

ПЛК VIPA 100

VIPA CPU 115SER 6BL32

1 шт.

VIPA

PLC2, PLC3

ПЛК Twido

TWDLMDA40DTK

2 шт.

Schneider Electric

MK1, MK2

коммуникационный модуль для реализации интерфейса RS-485, подключение под винт

TWD NOZ 485T

2 шт.

Schneider Electric

KK1

9-пиновий SUB-D коннектор типа вилка

1 шт.

XT1

клеммная колодка на 4 клеммы

1 шт.

TL1,TL2

терминаторы линии

2 шт

изготовляются с поз. 7 и 8

Резистор 120 Ом (0.25 Вт)

2 шт.

в составе поз.6

Конденсатор 1 нФ (>10 В)

2 шт.

в составе поз поз.6

Ru,Rd

Резистор 500 Ом (0.25 Вт)

2 шт

КМ1

AWG26

300 м

КМ2

кабель двойная экранированная витая пара 5-й категории AWG26

2 м

КМ3

кабель двойная экранированная витая пара 5-й категории AWG26

300 м

PLC2 и PLC3 соединяются с шиной с помощью коммуникационного модуля с клеммной колодкой. Это позволяет реализовать подключение без ответвлений. Однако на колодке не предусмотрено место подключения экрана, поэтому кабель экранируется отдельно.

Терминаторы линий реализованы последовательным соединением резисторов и конденсаторов, поскольку на шине задействовано защитное смещение.

В настоящее время MODBUS Serial используется как на уровне контроллеров так и на уровне датчиков (для распределенной периферии). Его использование проблематично при наличии на шине нескольких устройств SCADA / HMI , которые в клиент-серверной архитектуре должны быть Клиентами, ведь на MODBUS RTU/ASCII только Ведущий может быть Клиентом. Но даже в такой ситуации есть возможность организовать доставку данных всем нуждающимся узлам, если они поддерживают такой режим.

Исходя из указанного, на шине MODBUS Serial можно остановить свой выбор в случае, если:

- все устройства-Серверы поддерживают MODBUS RTU / ASCII в режиме Ведомого;

- необходимо только одно устройство-Клиент, которому необходимо инициировать обмены на шине, поддерживающий MODBUS RTU/ASCII как Ведущий;

- скорость восстановления данных - удовлетворяет условию задачи;
нет необходимости в



Рекомендуем почитать

Наверх