Modbus tcp подключение к компьютеру
Задача: стоит задача опроса двух устройств, работающих по протоколу MODBUS и запись полученных значений в базу данных.
Предварительные требования:
- Professional, Enterprise или пробная версия одного из наших логгеров (Advanced Serial Data Logger или Advanced TCP Data Logger).
- Модуль MODBUS RTU, ASCII или TCP. Модуль MODBUS TCP имеет смысл использовать только совместно с Advanced TCP Data Logger.
Подразумевается, что:
- Вы ранее работали с устройствами c MODBUS.
- Вам известны адреса регистров, в которых хранятся необходимые данные.
- Вам известны коммуникационные параметры для связи с устройствами (скорость, количество бит данных и т.п.).
Настройка порта
Необходимо настроить коммуникационные параметры (рис.1). Обычно MODBUS устройства подключаются к компьютеру по интерфейсу RS485 с использованием специального конвертера. В этом случае необходимо дополнительно включить опцию поддержки этого интерфейса "Режим интерфейса RS485".
Рис.1 - Параметры связи
Настройка опроса данных через MODBUS
При опросе и считывание данных через MODBUS компьютер является мастером, а устройство ведомым. Это означает, что программа на компьютере отправляет запросы MODBUS, на которые устройство отвечает. Настроить отправку запросов можно с помощью модуля "MODBUS RTU" (рис. 2). Необходимо выбрать данный модуль на закладке "Запрос Анализ Фильтрация" и нажать на кнопку "Настроить" справа от имени модуля в списке.
Рис. 2 - Выбор модуля запроса и обработки данных
В появившемся окне (рис.3) необходимо добавить один или несколько запросов используя кнопку "Действие → Добавить новый запрос".
Рис. 3 - Добавление запросов в очередь
Назначение опций запроса понятно из их названия. Дополнительную информацию по опциям можно найти в файле справки по этому модулю (Пуск → Программы → Advanced Serial Data Logger → Справка).
Обратите внимание, что необходимо определить элементы ответа устройства и их формат. Без описания элементов ответа программа не сможет разобрать MODBUS пакет на составляющие части. Например, в примере на рис.3 считываются два регистра, расположенных по адресу 8214. Значение каждого регистра состоит из двух байт (16 бит). Итого в примере выше будут считаны 4 байта, начиная с адреса 8214. В зависимости от прошивки MODBUS устройства и карты регистров устройства эти байты можно трактовать по-разному.
Вариант 1 (рис. 3). Оба считываемых регистра имеют одинаковый тип данных. Каждое значение состоит из двух байт (2*8 = 16 бит).
- В поле "Имя" задаем базовое имя для каждого значения: VALUE;
- В поле "Количество" задаем количество значений: 2;
- Выбираем опцию "Добавлять счетчик к имени": программа автоматически добавит порядковый номер 1 и 2 к базовому имени. В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
- В поле "Тип данных" выбираем тип данных, в зависимости от количества бит данных;
- Ставим галочку "Число без знака", если значение беззнаковое.
Вариант 2 (рис. 4). Оба считываемых регистра имеют размер 16 бит, но разный тип данных (одно значение со знаком, другое нет).
- Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
- В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
- В поле "Количество" задаем количество значений: 1;
- Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
- В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
- Ставим/снимаем галочку "Число без знака" для значения.
Рис.4 - Вариант ответа
Вариант 3 (рис. 5). Одно значение имеет размер 16 бит и соответственно занимает один регистра, а другое значение 32 бита и занимает 2 регистра.
- Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
- В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
- В поле "Количество" задаем количество значений: 1;
- Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
- В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
- Ставим/снимаем галочку "Число без знака" для значения.
Рис. 5 - Вариант ответа
Вариант 4 (рис. 6). Необходимо считать два регистра, но они расположены в памяти устройства не по порядку, а между ними есть другие регистры (значения).
Через MODBUS можно за один раз считать около 100 регистров. Если "разрыв" между двумя нужными регистрами в памяти устройства не очень большой, то можно считать весь диапазон значений в одном запросе и потом выбрать из считанного массива данных только нужные значения. Иначе придется разбить запрос на два разных запроса с разными адресами. Ниже приведен пример для одного запроса. В памяти устройства нужные значения имеют адреса 8214 и 8218.
- Добавляем запрос и указываем в свойствах запроса считывать пять регистров, начиная с 8214.
- Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
- В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
- В поле "Количество" задаем количество значений: 1;
- Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
- В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
- Ставим/снимаем галочку "Число без знака" для значения.
У второго элемента ответа указываем смещения в байтах относительно начала массива данных. В данном случае "8" означает, что нужно пропустить 4 регистра, каждый из которых занимает два байта. В предыдущих примерах мы указывали "-1" в качестве смещения. В этом случае программа рассчитывала смещение автоматически в зависимости от количества данных предыдущих элементов ответа.
Рис. 6 - Вариант запроса и ответа
Вариант 5 (рис. 7). Необходимо считать значения аналоговых входов и выходов, согласно карты регистров MODBUS ниже:
Изучая оборудование систем Умный Дом мы постоянно сталкиваемся с упоминанием протокола Modbus и порта RS-485.
Например, у контроллера EasyHomePLC есть два порта RS-485 и два порта RS-232, у контроллера Wiren Board есть два порта RS-485, у контроллера Beckhoff CX-8080 есть порт RS-485 и порт RS-232. У различного оборудования есть возможность управления по протоколу Modbus: кондиционеры, вентустановки, модули ввода-вывода. А ещё программное обеспечение EasyHome связывается с контроллером по протоколу Modbus TCP. Что всё это означает? Значит ли это, что если у контроллера есть интерфейс Modbus, и у устройства есть такой интерфейс, они сразу заработают вместе? Многие так считают, но это неверно. Объясню максимально просто и понятно.
Что такое RS-485
То есть, стандарт подразумевает, что на 2-проводную шину (одну витую пару) можно подключить множество устройств. Он не описывает никакой язык общения оборудования.
Что такое RS-232
Существуют переходники с RS-232 на RS-485 и обратно. Мы получаем возможность подключить на порт RS-232 что-то, что подключается по RS-485 или сделать длинную линию связи для устройств RS-232, поставив в начале линии переходник на 485, а в конце обратно.
Что такое Modbus
И вот мы подошли к главному вопросу. У нас контроллер имеет порт (он же разъём, он же шлюз) RS-485 и в него программно заложена возможность общения по Modbus. Также у нас есть кондиционер, у которого также есть физический разъём RS-485 и в паспорте указана возможность работы по Modbus. Что это для нас значит? Это значит, что устройства теоретически могут работать совместно.
Как люди, имеющие возможность говорить, теоретически могут общаться. Для нас такая возможность подразумевает полноценное управление и контроль обратной связи. Но заставить их работать вместе не так просто. Нужно в контроллере написать драйвер для работы именно с этим устройством. Для этого в инструкции к устройству надо найти карту регистров, то есть, описание возможных команд устройства. Вот пример некоторых регистров для вентмашины:
Чем сложнее устройство, тем вариантов команд больше. В вентмашине или кондиционере их может быть до сотни. Также по протоколу RS-485 мы можем общаться с инфракрасными приёмопередатчиками, генераторами, конвекторами, электрокарнизами, кондиционерами, термостатами, датчиками и различными элементами расширения контроллера на DIN рейку: модулями входов и выходов, диммерами.
Написать драйвер связи теоретически несложно, но это большая работа. Нужно предусмотреть нюансы работы техники, придумать удобный интерфейс управления и получения обратной связи, прописать в драйвере возможные коды ошибок. После подключения реального устройства может потребоваться доналадка, если не всё было учтено в инструкции или в драйвере. Стоимость этой работы может быть достаточно высокой, поэтому стоит обращать внимание на то, какие драйверы уже присутствуют в программном обеспечении, прилагаемом к контроллеру.
Например, в программном обеспечении EasyHome есть поддержка ИК-передатчиков ICPDas и Insyte, модулей связи с кондиционерами Mitsubishi и Daikin, конвекторов Varmann, счётчиков электричества Delta, блоков расширения Овен, Razumdom, Bolid, вентмашин Komfovent и ещё много чего. Нужно смотреть конкретные поддерживаемые модели, у разных моделей разные спецификации команд.
Есть устройства с поддержкой Modbus TCP, там нужно, чтобы оно было включено в локальную сеть, отдельный порт RS-485 контроллера не нужен.
К системам на Z-Wave напрямую ничего по Modbus не подключить, там нет такой возможности. Только используя промежуточный контроллер, который поддерживает и Modbus, и Z-Wave, например, Wiren Board.
Есть важная особенность работы устройств по Modbus. У Modbus есть устройство-мастер (это контроллер) и устройство-слейв (то, что к нему подключается). Слейв не может сам инициировать передачу данных, поэтому мастер постоянно опрашивает все подключенные к нему слейвы на предмет их состояния. Если у нас датчик подключен к дискретному входу устройства Овен МВ, то при изменении состояния датчика меняется состояние входа, но модуль не может сразу же сообщить об этом контроллеру, так как не может сам инициировать связь. Нужно дождаться, пока контроллер опросит этот модуль, тогда модуль отправит ему в ответ своё состояние и контроллер поймёт, что датчик изменил состояние и что-то сделает.
Что произойдёт, если на вход Овен МВ пришёл сигнал о сработке датчика, а потом датчик изменил состояние на первоначальное, а контроллер не успел его опросить? В программе модуля МВ есть счётчики количества сработок каждого входа, вот их-то контроллер и считывает, и видит, что было изменение.
Ещё раз обозначим разницу между версиями связи по ModBus.
Есть ещё несколько разновидностей: Modbus RTU/IP (отличается от TCP наличием контрольной суммы), Modbus over UDP, Modbus Plus (собственный протокол фирмы Schneider Electric, в сети могут быть несколько мастеров).
Ещё небольшая статья про работу устройств по протоколу Modbus в системах Умный Дом: RS-485 Modbus в системах Умного Дома.
Куда посылать команду Modbus TCP?
В сети Ethernet адресом устройства является его IP-адрес. Обычно устройства находятся в одной подсети, где IP адреса отличаются последними цифрами 192.168.1.20 при использовании самой распространённой маски подсети 255.255.255.0.
Интерфейсом является сеть Ethernet, протоколом передачи данных – TCP/IP.
Используемый TCP-порт: 502.
Описание протокола Modbus TCP
О Modbus RTU написано в этой статье.
Отбрасываем адрес устройства SlaveID и контрольную сумму CRC и получаем PDU:
03 006B 0003
Transaction Identifier (Идентификатор транзакции): 2 байта устанавливаются Master, чтобы однозначно идентифицировать каждый запрос. Может быть любыми. Эти байты повторятся устройством Slave в ответе, поскольку ответы устройства Slave не всегда могут быть получены в том же порядке, что и запросы.
Protocol Identifier (Идентификатор протокола): 2 байта устанавливаются Master, всегда будут = 00 00, что соответствует протоколу Modbus.
Unit Identifier (Идентификатор блока или адрес устройства): 1 байт устанавливается Master. Повторяется устройством Slave для однозначной идентификации устройства Slave.
Итого получаем:
Modbus RTU | Slave ID | Запрос | CRC |
---|---|---|---|
Modbus RTU | 11 | 03 006B 0003 | 7687 |
Modbus TCP | 0001 0000 0006 11 | 03 006B 0003 | |
Modbus TCP | MBAP Header | PDU | |
Modbus TCP | 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 следуют по нарастающей к старшему значению байта. Т.е. справа налево.
Состояния выходов DO0-1 показаны как значения байта 02 hex, или в двоичной системе 0000 0010.
Значение DO1 будет вторым справа, а значение DO0 будет первым справа (младший бит).
Шесть остальных битов заполнены нулями до полного байта, т.к. их не запрашивали.
Каналы | - | - | - | - | - | - | DO 1 | DO 0 |
Биты | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Hex | 02 |
Модули с дискретным выводом: ioLogik E1211, ET-7060, ADAM-6060
Как послать команду Modbus TCP на чтение дискретного ввода? Команда 0x02
Эта команда используется для чтения значений дискретных входов DI.
Состояния выходов DI 0-1 показаны как значения байта 03 hex, или в двоичной системе 0000 0011.
Значение DI1 будет вторым справа, а значение DI0 будет первым справа (младший бит).
Шесть остальных битов заполнены нулями.
Модули с дискретным вводом: ioLogik E1210, ET-7053, ADAM-6050
Как послать команду Modbus TCP на чтение аналогового вывода? Команда 0x03
Состояния выхода AO0 показаны как значения байта 02 2B hex, или в десятичной системе 555.
Состояния выхода AO1 показаны как значения байта 00 64 hex, или в десятичной системе 100.
Модули с дискретным вводом: ioLogik E1210, ET-7053, ADAM-6050
Как послать команду Modbus TCP на чтение аналогового ввода? Команда 0x04
Состояния выхода 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.
Все остальные значения недопустимы и не будут влиять на состояние выхода.
Состояние выхода DO1 поменялось с выключен OFF на включен ON.
Модули с дискретным выводом: ioLogik E1211, ET-7060, ADAM-6060
Как послать команду Modbus TCP на запись аналогового вывода? Команда 0x06
Состояние выхода AO0 поменялось на 55 FF hex, или в десятичной системе 22015.
Модули с аналоговым выводом: ioLogik E1241, ET-7028, ADAM-6224
Как послать команду Modbus TCP на запись нескольких дискретных выводов? Команда 0x0F
Состояние выхода DO1 поменялось с выключен OFF на включен ON.
Состояние выхода DO0 осталось выключен OFF.
Модули с дискретным выводом: ioLogik E1211, ET-7060, ADAM-6060
Как послать команду Modbus TCP на запись нескольких аналоговых выводов? Команда 0x10
Состояние выхода AO0 поменялось на 00 0A hex, или в десятичной системе 10.
Состояние выхода AO1 поменялось на 01 02 hex, или в десятичной системе 258.
Модули с аналоговым выводом: ioLogik E1241, ET-7028, ADAM-6224
Ошибки запроса Modbus TCP
Если после получения запроса устройство не может обработать его, то будет отослан ответ с кодом ошибки.
Ответ будет содержать измененный Функциональный код, его старший бит будет равен 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 |
Программы для работы с протоколом Modbus TCP
Ниже представлены программы, которые помогут легко взаимодействовать с устройствами Modbus TCP.
Все клеммы «A» должны быть соединены вместе, также как и все клеммы «B» должны быть соединены вместе соответственно.
Инвертирование соединений «A» и «B» устройства не только препятствует его обмену данными, но также может остановить работу всей системы связи из-за неправильного прямого (поляризационного) напряжения, обнаруженного на клеммах неправильно подключенного устройства.
Чтобы избежать ошибок при подключении большого количества устройств, следует использовать кабели одного цвета для всех подключений к клеммам A, а кабели одного цвета следует использовать для всех подключений к клеммам B различных устройств (например, белый для A и синий для B).
2. Связь между устройствами
В отличие от многих систем распределения энергии, важен способ параллельного подключения устройств. Система RS485, используемая для связи Modbus, обеспечивает основной кабель (шина или магистраль), к которому все устройства должны быть подключены с помощью максимально коротких ответвлений (также называемых шлейфами).
Ветви НЕ должны быть длиннее 1200 м ! Более длинные ответвления могут вызвать отражения сигнала и вызвать помехи и, как следствие, ошибки при приеме данных.
3. Максимальное расстояние и максимальное кол-во устройств
Главный кабель НЕ должен быть длиннее 700 м ! Это расстояние не включает ветви (которые, тем не менее, должны быть короткими). Максимальное количество устройств, которые можно подключить к основному кабелю - 32, включая устройство-мастер.
4. Использование повторителей
Для увеличения протяженности сети Modbus можно использовать повторители, а также устройства усиления и восстановления сигналов, снабженные двумя портами связи, которые передают всем сигнал от предыдущего устройства.
Если расстояние сегмента превышает 1200 м или количество ведущих устройств в сегменте более 32 штук, следует использовать повторитель (репитер), чтобы создать следующий сегмент. Причем каждый сегмент сети должен быть подключен к терминатору.
С помощью репитера основной кабель делится на разные сегменты, каждый из которых может иметь длину до 700 м и соединять 32 устройства (в это количество входят репитеры). Максимальное количество повторителей, которые должны быть подключены последовательно - 3. Большее количество повторителей приводит к чрезмерным задержкам в системе связи.
5. Тип используемого кабеля
Используемый кабель представляет собой экранированную витую пару (телефонного типа). Например, можно указать кабель Belden 3105A, но можно использовать другие типы кабеля с эквивалентными характеристиками. Двойник состоит из двух скрученных между собой проводников.
Такое расположение повышает устойчивость к электромагнитным помехам, поскольку кабель образует серию последовательных катушек, каждая из которых обращена в направлении, противоположном направлению следующей: таким образом, любое магнитное поле в окружающей среде проходит через каждую пару катушек в противоположных направлениях, и его влияние таким образом, очень уменьшается (эффект на каждую катушку прямо противоположен влиянию на следующую, и, таким образом, эффект отменяется).
Экранирование может быть плетеным (образовано сеткой из тонких проводящих проводов) или быть фольгой (состоящей из листа металла, намотанного вокруг проводников): эти два типа эквивалентны.
6. Подключение к клеммам
В некоторых странах разрешается вставлять два кабеля в одну винтовую клемму . В этом случае можно подключить основные входные и выходные клеммы непосредственно к клеммам прибора, не создавая ответвления.
Если, с другой стороны, каждый терминал может принимать только один кабель, необходимо создать соответствующую ветвь с использованием трех вспомогательных терминалов для каждого подключаемого прибора.
7. Заземление экрана
Экран кабеля должен быть заземлен только в одной точке. Обычно это соединение выполняется на одном конце основного кабеля.
8. Конечное сопротивление
Чтобы избежать отражения сигнала, на каждом конце основного кабеля необходимо установить оконечное сопротивление 120 Ом . Конечное сопротивление следует использовать только на концах основного кабеля . Если общая длина основного кабеля меньше 50 м, можно избежать оконечных сопротивлений на концах основного кабеля.
9. Подключение к персональному компьютеру
Если в качестве ведущего используется персональный компьютер, обычно преобразователь последовательного интерфейса RS232 / RS485 обеспечивает соединение с шиной.
Intesis INMBSDAL0640000 Шлюз Modbus RTU(RS232,RS485)/TCP Server - DALI, до 64 балластов
Intesis INMBSDAL0640000 Шлюз Modbus RTU(RS232,RS485)/TCP Server - DALI, до 64 балластов
Intesis Intesisbox BOX-MBS-LON-A Шлюз Modbus RTU(RS232,RS485)/TCP Server - LON
Читайте также: