PDA

Просмотр полной версии : Подключение МВ210 по TCP Modbus на C++



Дмитрий из СПб
14.05.2021, 12:08
Добрый день!
Заранее извиняюсь, если тема избита, но я час листал/искал по форуму, гуглил и ничего не нашел, кроме общего описания протокола и мануала.
Пытаюсь подключить МВ210-204 по TCP, по протоколу Modbus, пишу на С++.
Соединение устанавливается, хочу прочитать, допустим, состояние входа i1.
Судя по мануалу это команда 04 – Read Input Registers, адрес регистра 51.
Отправляю (hex) 00 00(номер транзакции) 00 00(id протокола) 00 06(6 байт далее) 01(slave id) 04(команда) 00 33(регистр) 00 01(количество регистров)
Ответ(hex): 00 00 00 00 00 03 01 84 02 - 9 байт. А должно быть 11, т.к. последний 02 это длина данных, ещё 2 байта, которые не приходят.
Замыкаю, размыкаю контакты - в ответе ничего не меняется.
И почему-то Function Code возвращается 03 а не 04.
Пробовал команду 03, то же самое.
Что я делаю не так?

В OWEN Configurator всё прекрасно считывается, устройство рабочее.

Евгений Кислов
14.05.2021, 12:16
Добрый день!
Заранее извиняюсь, если тема избита, но я час листал/искал по форуму, гуглил и ничего не нашел, кроме общего описания протокола и мануала.
Пытаюсь подключить МВ210-204 по TCP, по протоколу Modbus, пишу на С++.
Соединение устанавливается, хочу прочитать, допустим, состояние входа i1.
Судя по мануалу это команда 04 – Read Input Registers, адрес регистра 51.
Отправляю (hex) 00 00(номер транзакции) 00 00(id протокола) 00 06(6 байт далее) 01(slave id) 04(команда) 00 33(регистр) 00 01(количество регистров)
Ответ(hex): 00 00 00 00 00 03 01 84 02 - 9 байт. А должно быть 11, т.к. последний 02 это длина данных, ещё 2 байта, которые не приходят.
Замыкаю, размыкаю контакты - в ответе ничего не меняется.
И почему-то Function Code возвращается 03 а не 04.
Пробовал команду 03, то же самое.
Что я делаю не так?

В OWEN Configurator всё прекрасно считывается, устройство рабочее.

Добрый день.
Вам надо cчитывать не один регистр, а 2.
Нельзя считать только половину параметра (а параметр "Состояние дискретных входов" имеет тип UINT32).
В этом случае модуль возвращает ошибку 02 (00 00 00 00 00 03 01 84 02) - ILLEGAL DATA ADDRESS.

Дмитрий из СПб
14.05.2021, 12:18
Спасибо, заработало!
00 00 00 00 00 07 01 04 04 00 01 00 00 - замкнуто
00 00 00 00 00 07 01 04 04 00 00 00 00 - разомкнуто

melky
14.05.2021, 13:18
00 00 Transaction identifier 0x0000 (0)
00 00 Protocol identifier 0 = MODBUS protocol
00 03 Length 0x0003 (3)
01 Unit identifier 0x01 (1)
84 Error code 0x80 + 0x04 (4) - Read Input Registers
02 Exception code [02] ILLEGAL DATA ADDRESS