Как получить размер данных больше, чем Qt Modbus InputRegisters? - PullRequest
0 голосов
/ 07 мая 2018

Насколько я понимаю, диапазон QModbusDataUnit::InputRegisters - это диапазон 0-65535, который равен unsigned short.

Метод чтения 1 единицы из inputregisters следующий:

QModbusDataUnit readUnit(QModbusDataUnit::InputRegisters, 40006, 1);

Значение этого будет в ответе, т.е.: int value = result.value(0);

Мой вопрос заключается в том, что если мне нужно прочитать значение unsigned int, которое намного больше диапазона 0 to 4,294,967,295.

Как я могу получить это значение?

1 Ответ

0 голосов
/ 08 мая 2018

Как вы сказали, входные регистры Modbus представляют собой 16-битные целые числа без знака. Поэтому без какого-либо преобразования они ограничиваются диапазоном: 0 - 65535. Для 32-разрядных значений без знака обычно (в Modbus) объединяются два регистра.

Например, старшие 16 битов могут быть сохранены в 40006, а младшие 16 битов в 40007.

Итак, если вы читали значение 2271560481 (гекс 0x87654321), вы бы прочитали 34661 (0x8765) с адреса 40006 и 17185 (гекс 0x4321) из местоположения 40007. Затем вы бы объединили их, чтобы получить реальная стоимость.

Я не знаю код Qt Modbus, но, расширив свой пример кода, вы, вероятно, можете прочитать оба значения одновременно, выполнив что-то вроде этого:

readUnit(QModbusDataUnit::InputRegisters, 40006, 2);

и объединить их

quint32 value = result.value(0);
value = (value << 16) | result.value(1);
...