Из руководства вы связали:
F18A Длинное целое без знака: цифра c данные: от 0 до (2E32 -1)
Итак, мы имеем дело с 32-битное число хранится в двух регистрах. Это означает, что нам нужно подумать о кодировании. стандарт Modbus гласит:
MODBUS использует представление "big-Endian" для адресов и элементов данных.
поэтому порядок байтов в регистре установлен (и это реализовано в вашей функции ReadHoldingRegistersMsg
). Однако в нем не указано, как объединить несколько регистров, чтобы можно было обрабатывать большие числа. Я просмотрел предоставленное вами руководство и, возможно, не увидел упоминаний об этом, но попробовал две опции, указывающие на порядок little-endian (что означает, что второй регистр является старшей частью числа).
Получение данных со скриншота. Зарегистрируйте 0080 = 21210 и зарегистрируйте 0081 = 5. Предполагая, что используется формат с прямым порядком байтов, равный (5 * 65536) + 21210 = 348890 (примечание: это проще визуализировать в шестнадцатеричном формате hi = 0x05 , низкий = 0x52DA, результат = 0x552DA). Поскольку в документации указано, что эта цифра составляет 10 мВ, мы делим ее на 100 000, чтобы получить кв. 488 кВ (ожидаемые 3,5 кВ).
Проверка следующих двух; 0082 = 21789; 0083 = 5 (5 * 65536) + 21789 = 349 469. Преобразование в 3,49469 кВ (ожидаемое 3,5 кВ). Для полноты U C работает как 3.49007 кВ (ожидаемое 3,5 кВ).
Теперь давайте посмотрим на регистр 88 - 6.06 кВ; из ручного формата F1:
Целое число без знака: числовые данные от 0 до 65535
Таким образом, это должны быть прямые напряжения:
0088 - 6351 = 6,351 кВ (ожидаемое 6,06)
0089 - 6358 = 6,358 кВ (ожидаемое 6,07)
0090 - 6343 = 6,343 кВ (ожидаемое 6,06)
Приведенное выше не является точным совпадением с указанными вами значениями, но я подозреваю, что это может быть связано со временем (вам нужно будет провести некоторое тестирование). Надеюсь, это даст вам отправную точку.