Не получается делать запись в порт

Добрый день. Пытаюсь следовать документации и писать напрямую в порт следующую структуру. Для этого в топик /rpc/v1/wb-mqtt-serial/port/Load/wb я отправляю:

{
  "params": {
    "protocol": "modbus-tcp",
    "ip": "192.168.1.81",
    "port": 502,
    "slave_id": 255,
    "function": "0x10",
    "address": 41001,
    "count": 4,
    "format": "HEX",
    "msg": "0x0180010000000000",
    "response_size": 12,
    "total_timeout": 10000
  }
}

Но получаю ошибку:

{“error”:{“code”:-32000,“data”:“Validation failed.\nError 1\n context: [protocol]\n desc: Failed to match against any enum values.\nError 2\n context: \n desc: Failed to validate against schema associated with property name ‘protocol’.\nError 3\n context: \n desc: Failed to validate against child schema #0.\nError 4\n context: [function]\n desc: Value type not permitted by ‘type’ constraint.\nError 5\n context: \n desc: Failed to validate against schema associated with property name ‘function’.\nError 6\n context: \n desc: Failed to validate against child schema #1.\nError 7\n context: \n desc: Failed to validate against any child schemas allowed by oneOf constraint.\nError 8\n context: \n desc: Failed to validate against child schema #3.\n”,“message”:“Server error”},“id”:null}

Если я просто пишу в топик wb-mqtt-serial/port/Load/wb, как указано в документации, то ничего не просходит. Если я указываю для значения function код 16, то тоже происходит ошибка.

Если я записываю структуру, где отправляется собранный кадр:

{
  "params": {
    "ip": "192.168.1.81",
    "port": 502,
    "response_size": 12,
    "format": "HEX",
    "msg": "92f70000000fff10a0290004080180010000000000",
    "total_timeout": 1000
  }
}

То ошибки нет. Устройство принимает команду. Подскажите, что я делаю не так в первом JSON?

Команда, которую я пытаюсь повторить:
modbus_client_rpc --debug -mtcp -a255 -t0x10 -r41001 -c4 -p502 192.168.1.81 0x0180 0x0100 0x0000 0x0000

Напрямую писать в порт мне нужно, т.к. шаблоны не поддерживают функцию 0x17

Добрый день.
Проверю, пожалуй.
Для этого для начала - проcто hex
Публикую

{"params": {"ip": "10.0.0.71", "port": 502, "response_size": 11, "format": "HEX", "msg": "8c5d000000060b0400800001", "total_timeout": 1000}, "id": 1}

получаю

reply {"error":null,"id":1,"result":{"response":"8c5d000000050b0402000b"}}

Отлично. Проверяю для modbus-tcp.
Получаю (аналогичную) ошибку.
Подебажил, вижу что в схеме

cat /usr/share/wb-mqtt-serial/wb-mqtt-serial-rpc-port-load-request.schema.json
<cut>

    "modbus_request": {
      "properties": {
        "protocol": {
          "type": "string",
          "enum": [ "modbus" ]
        },
<cut>

в перечислении только “modbus”.
“modbus-tcp” нету…

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

"enum": [ "modbus", "modbus-tcp" ]

Тестирую:

mosquitto_pub -t /rpc/v1/wb-mqtt-serial/port/Load/wb   -m '{"params": {"protocol": "modbus-tcp", "ip": "10.0.0.71", "port": 502, "slave_id": 11, "function": 3, "address": 128}, "id": 1}'

И получаю

/rpc/v1/wb-mqtt-serial/port/Load/wb {"params": {"protocol": "modbus-tcp", "ip": "10.0.0.71", "port": 502, "slave_id": 11, "function": 3, "address": 128}, "id": 1}
/rpc/v1/wb-mqtt-serial/port/Load/wb/reply {"error":null,"id":1,"result":{"response":""}}

Без ошибок.
Прошу прощения за долгий ответ - я не программист, к сожалению.
Сообщу разработчикам, описав баг.

UPD: на самом деле бага нет. Функционал в testing.

1 Like

Уточните пожалуйста, какая версия wb-mqtt-serial у вас? Выяснил что в testing, актуальном - оно работает. В stable - нет и не должно.

В testing есть modbus-tcp в схеме

С чтением у меня получилось.

А с записью у Вас тоже получилось?

Я пытаюсь повторить такой запрос:

{
  "params": {
    "protocol": "modbus-tcp",
    "ip": "192.168.1.81",
    "port": 502,
    "slave_id": 255,
    "function": 6,
    "address": 43001,
    "format": "HEX",
    "msg": "0100",
    "response_size": 12,
    "total_timeout": 10000
  },
  "id": 1
}


wb-mqtt-serial 2.225.1 git 84e2f0bd5dbd79ed84c1416be41b1ca3365d96a7

Всё получилось, спасибо

Адрес не может иметь значение 255…

Ну, оно (может) работать - но против стандарта. То есть в неожиданном месте может сломаться.

1 Like

Дополню примером работы с функцией 23 (0x17), возможно будет кто-то искать, т.к. примеров я не нашел.

{
  "params": {
    "protocol": "modbus-tcp",
    "ip": "192.168.1.81",
    "port": 502,
    "slave_id": 254,
    "function": 23,
    "address": 32001,
    "count": 4,
    "write_address": 42001,
    "write_count": 2,
    "format": "HEX",
    "msg": "01010102",
    "response_size": 12,
    "total_timeout": 10000
  }
}

Это запрос состояния первой лампы у DALI контроллера DLC-02.

2 Likes

У DLC-02 он жестко задан как 255 и не может быть изменён.
И смены адреса нет в интерфейсе и описании регистров. Такая вот особенность.

Ну, именно с таким устройством не игрался, не знаю. Но если работает - то и отлично.