Бага! modbus/tcp modbus_client

Так.
Я правильно понимаю, что описание в виде стандартной рыбы (template) пока не парсится?

wb-mqtt-serial -d1 -c ./wb-mqtt-serial.conf

ERROR: [serial] Validation failed.
Error 1
context: [device][channels][0]
desc: Object contains a property that could not be validated using ‘properties’ or ‘additionalProperties’ constraints: ‘channel_readonly’.
Error 2
context: [device][channels][0]
desc: Failed to validate against child schema #0.
Error 3
context: [device][channels][0]
desc: Object contains a property that could not be validated using ‘properties’ or ‘additionalProperties’ constraints: ‘address’.
Error 4
context: [device][channels][0]
desc: Failed to validate against child schema #1.
Error 5
context: [device][channels][0]
desc: Failed to validate against any child schemas allowed by oneOf constraint.
Error 6
context: [device][channels]
desc: Failed to validate item #0 in array.
Error 7
context: [device][channels][1]
desc: Object contains a property that could not be validated using ‘properties’ or ‘additionalProperties’ constraints: ‘channel_readonly’.
Error 8
context: [device][channels][1]
desc: Failed to validate against child schema #0.
Error 9
context: [device][channels][1]
desc: Object contains a property that could not be validated using ‘properties’ or ‘additionalProperties’ constraints: ‘address’.
Error 10
context: [device][channels][1]
desc: Failed to validate against child schema #1.
Error 11
context: [device][channels][1]
desc: Failed to validate against any child schemas allowed by oneOf constraint.
Error 12
context: [device][channels]
desc: Failed to validate item #1 in array.
Error 13
context: [device]
desc: Failed to validate against schema associated with property name ‘channels’.
Error 14
context:
desc: Failed to validate against schema associated with property name ‘device’.

Вы лучше пишите прямо в тему Поддержка MODBUS TCP в wb-mqtt-serial - там отвечает сразу разработчик.

Благодарю.

Пришлите, пожалуйста, wb-mqtt-serial.conf, который вызвал эту ошибку. Тут парсер ругается на неизвестный параметр ‘channel_readonly’ и неверный формат параметра ‘address’.

Добрый день, я уже переделал, не включением template в конфиг, а внесением напрямую заработало:

    {
        "address": "10.112.31.11",
        "port": 502,
        "port_type": "modbus tcp",
        "devices": [
            {
                "slave_id": 502,
                "name": "burgess",
                "enabled": true,
                "poll_interval": 512,
                "id": "saia2",
                "channels": [
                    {
                        "name": "UFO1STAT",
                        "reg_type": "discrete",
                        "address": "14"
                    },
                    {
                        "name": "UFO2STAT",
                        "reg_type": "discrete",
                        "address": "13"
                    }
                ],
                "guard_interval_us": 2000,
                "device_timeout_ms": 500
            }
        ],
        "poll_interval": 1000,
        "enabled": true,
        "type": null,
        "response_timeout_ms": 500
    }

Всё таки интересно посмотреть на конфиг, который не заработал, чтобы мы починили его разбор.

А так и не решился вопрос, кстати… Сейчас возюкаюсь с другим дивайсом, фаберже идентичные…

А версия wb-mqtt-serial какая? сейчас кардиналтно переработана.

Да с ним-то норм, работает. Надо таймауты овна отдебажить, а _client по-прежнему не фунциклирует с tcp.

С modbus TCP - работает, и работал.

modbus_client --debug -mtcp -p 550 127.0.0.1 -a11 -t0x03 -r128 -c1
0x007f Connecting to 0.0.0.0
[00][01][00][00][00][06][0B][03][00][80][00][01]
Waiting for a confirmation...
<00><01><00><00><00><05><0B><03><02><00><0B>
SUCCESS: read 1 of elements:
	Data: 0x000b 

Вот в Modbus over TCP - нет. Но тут проще “порт” создать с помощью soсat так:
https://wirenboard.com/wiki/Доступ_к_порту_RS-485_контроллера_Wiren_Board_с_компьютера

У меня не работает и никогда не работал. Версия 1.4 емнип. Вывод - как в первом посте, не может найти 0.0.0.0…
Попробуйте НЕ локалхост.

modbus_client --debug -mtcp -p 502 192.168.1.93 -a11 -t0x03 -r128 -c1
Connecting to 192.168.1.93
[00][01][00][00][00][06][0B][03][00][80][00][01]
Waiting for a confirmation...
<00><01><00><00><00><05><0B><03><02><00><0B>
SUCCESS: read 1 of elements:
	Data: 0x000b 

То же устройство, только напрямую.

На wb-mqtt-serial 1.57.0 еще настраивал Modbus TCP. Все работало. Не могу сказать, что всегда были корректные значения, но скорее всего виноват мост USR-W600.
Так же использовал socat c modbus_client. Вроде проблем небыло.

1 лайк

0x000a Connecting to 0.0.0.0 Connection failed: Connection refused

что бы я ни делал. Фильтра нет, отвечающее устройство в локалке. Через wb-mqtt-serial работает без проблем. Шайтан?

А что за устройство?

Wb6.2 с одной стороны, апдейт до последних версий всего сразу из коробки. С другого конца - на одном узле saia burgess (см. начало топика), на другом вот овён 160й. Оба отлично дуплят по wb-mqtt-serial, на обоих утилитка modbus_client не работает с tcp вообще.

Вообще - сделаем возможность вызывать (вставлять в очередь wb-mqtt-serial) “свои запросы”. В планах есть. То есть можно будет даже не останавливать.

Ну для начала утилитку бы починить: у меня нет идей, почему она работает у вас.
Придется натягивать тулчейн еще и под этот проц… :slight_smile:

Да такую мелкую GitHub - wirenboard/modbus-utils: Modbus client and server command line tools based on libmodbus. - можно и на контроллере править.
Но “тулчейн” уже есть - wbdev.

Святый Ганеша, что за адские шудры вычесывали этот “код” из шелудивых подмышек… :scream_cat: Я такого даже у китайских первокуров не видел…

Патч:

--- mbu-common.h.orig        2021-05-14 16:36:50.404155964 +0000
+++ mbu-common.h            2019-03-20 17:57:22.000000000 +0000
@@ -14,8 +14,11 @@
 int getInt(const char str[], int *ok) {
     int value;
     int ret = sscanf(str, "0x%x", &value);
-    if (0 >= ret) {//couldn't convert from hex, try dec
-        ret = sscanf(str, "%d", &value);
+    if (0 >= ret) {                    // couldn't convert from hex, try dec
+       if (strstr(str, "."))           // dotted ip address
+               ret = 0;
+       else
+               ret = sscanf(str, "%d", &value);
     }

     if (0 != ok) {
1 лайк