Регистр формата u64 - различаются данные из modbus и dev[....]

Добрый день

В шаблоне стороннего устройства который я создал есть регистр u64

      {
        "id": "key_number",
        "name": "Key Number",
        "reg_type": "holding",
        "address": 0,
        "group": "general",
        "readonly": true,
        "format": "u64"
      }

С командной строки читается правильно.

>modbus_client_rpc -mrtu -pnone -b57600 -s2 /dev/ttyRS485-2 -o200 -a128 -t3 -r0 -c4
SUCCESS: read 4 elements:
        Data: 0x8601 0x3e64 0x0009 0xb800

В Устройствах отображается правильно

А в скрипте через

var key_id = dev['tractavt-301-003_128/key_number'];

получается тип number со значением 9656067675277343000 - последние цифры не совпадают.

Попытки сделать строку типа dev[...].toString или dev[...]+"" результат не улучшают.

Для разных ключей то 3 последние цифры зануляются, то две.

Похоже на окргуление , но у одного ключа отброшено (через float что-ли где-то конвертируется ?)

4321777056153896448 4321777056153896400 - тут две цифры
10314784504942266624 10314784504942266000 - тут отброшено, а не округлено
3025810019250769152 3025810019250769000
5982130486717159424 5982130486717159000
18302978955533733888 18302978955533734000
9656067675277342720 9656067675277343000
2666426404434275328 2666426404434275300 - тут две цифры

Я в javascript почти ни какой специалист, но выглядит багой.

Добрый день!

Попробую воспроизвести и уточнить у разработчиков. Возможно, это ожидаемое поведение из-за длины числа.

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

1 Like

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

Выглядит так, что внутри где-то через float преобразование происходит.

В Устройствах всё нормально так как там ответ от MQTT напрямую, а он наверняка строка.

А при доступе через dev[...] полученная из MQTT строка приводится к number и вот тут где-то в JS влезает промежуточный float (да, очередной прикол JS) и теряется точность.

Что-то мне говорит что это тогда не лечится нормально и единственный вход это сделать что бы dev[u64] возвращал String.

Совместимости это не сломает вроде - просто чуть позже вылезет потеря точности - в момент первого обращения к переменной как к числу.

А вот если продожить работать с переменной как со строкой то всё “починится”.

Второй вариант это конечно модифицировать мой скрипт который на это налетел и работать с u64 как с u32+u32, но это заметание проблемы под ковёр.

1 Like

Добрый день,
Получил обратную связь от разработчиков, да есть проблема поддержки u64, из коробки рабочего решения нет.

что ж, перейду на u32+u32

надеюсь, сделаете что бы dev[u64] возвращал String.