Работа с Modbus TCP

Добрый день. У меня два вопроса.
Проблемы с работой Modbus TCP. Запустил порт 502 по дефолту. Пытаюсь прочитать


Вот что выдает терминал:

root@wirenboard-AZ6WODNS:~# modbus_client --debug -mtcp -a218 -t0x04 -r44893 -c1 192.168.42.1
Connecting to 192.168.42.1:502
[00][01][00][00][00][06][DA][04][AF][5D][00][01]
Exception response Exception Response(132, 4, IllegalAddress)
Waiting for a confirmation...
<00><01><00><00><00><03><DA><84><02>
ERROR Illegal data address
ERROR occured!

Через mosquitto_sub показывает значения

root@wirenboard-AZ6WODNS:~# mosquitto_sub -t "/devices/power_status/controls/Vin" -v | head -n 10
/devices/power_status/controls/Vin 24.1

В Modbus Poll просто нули
Писал еще скрипты на python для чтения тоже не читает. Вот что пишет:

Ошибка чтения данных: Exception Response(132, 4, IllegalAddress)

До перепрошивки получилось запустить modbus, но тоже непоятно почему он тогда заработал. Как-то нашел в одном из топиков на форуме поменял UnitID на 1 и заработало, потом вернул на тот, что был и тоже работало. Сейчас такой же финт не проходит.

Здравствуйте.

Поскольку два ваших вопроса не относятся друг к другу непосредственно - прошу создать отдельную тему со вторым вопросом.

Касательно первого вопроса, прошу уточнить:

  • К какому устройству подключаетесь?
  • Как сконфигурирован порт?

Благодарю за ответы.

У меня wirenboard 7 + demo kit
Порт запускал python скрпитом:

import asyncio
from pymodbus.server.async_io import ModbusTcpServer
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.server import ServerAsyncStop


store = ModbusSlaveContext(
    di=ModbusSequentialDataBlock(0, [0]*100),  # Дискретные входы
    co=ModbusSequentialDataBlock(0, [0]*100),  # Катушки
    hr=ModbusSequentialDataBlock(0, [0]*100),  # Регистры хранения
    ir=ModbusSequentialDataBlock(0, [0]*100)   # Входные регистры
)
context = ModbusServerContext(slaves=store, single=True)

async def run_server():
    server = ModbusTcpServer(context, address=("192.168.42.1", 502))  # Укажите адрес контроллера
    await server.serve_forever()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run_server())

скрипт запускал через консоль.
вот настройки на веб интрефейсе:

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

приложен диагностический архив, доступен только сотрудникам поддержки
(219.1 KB)
Вот пожалуйста.

Благодарю за ожидание.

  1. Вы следовали данной инструкции?
  2. Не вижу где вы прописали настройки подключения к MQTT брокеру - это важно

Проследовав инструкции я получил:

root@wirenboard-ATY5YNRK:~# modbus_client --debug -mtcp -a95 -t0x04 -r60742 -c1 192.168.0.51
Connecting to 192.168.0.51:502
[00][01][00][00][00][06][5F][04][ED][46][00][01]
Waiting for a confirmation...
<00><01><00><00><00><05><5F><04><02><00><18>
SUCCESS: read 1 of elements:
        Data: 0x0018

Да я следовал инструкции, кроме MQTT брокера,
Было:


Я поменял на (согласно инструкции):

Сейчас я снова сделал все по инструкции, но все по-прежнему

root@wirenboard-AZ6WODNS:~# modbus_client --debug -mtcp -a207 -t0x04 -r8027 -c1 192.168.42.1
Connecting to 192.168.42.1:502
[00][01][00][00][00][06][CF][04][1F][5B][00][01]
Waiting for a confirmation...
Exception response Exception Response(132, 4, IllegalAddress)
<00><01><00><00><00><03><CF><84><02>
ERROR Illegal data address
ERROR occured!

Приложу еще раз диагностический архив
Спасибо
diag_AZ6WODNS_2024-10-28-12.48.31.zip (136.2 KB)

Прощу прощения за мой фейл. Еще раз все заново сделал. Заработало. Остался вопрос как поменять ip-адрес для TCP чтобы можно было конектится по заданному адресу.
Если менять в веб-интрефейсе то не работает


Вот по дефолтному 192.168.42.1 работает, а если я хочу к примеру использовать другой адрес? Спасибо за помощь!

1 Like

В таком случае вам следует:

  1. Прописать ip адрес контроллера статикой. После этого все обращения к контроллеру следует производить на новый адрес.
  2. Указать новый адрес в настройках шлюза Modbus RTU/TCP или ничего не менять, если в поле IP-адрес указано «*»

Спасибо за помощь!