BaselAla Ответов: 1

Как я могу считывать отрицательные переменные из modbus ?


привет ,
я использую Qt для создания некоторого интерфейса Modbus Master , при чтении переменных с устройства все положительные переменные истинны , но отрицательные переменные-это worong .
например : когда я посылаю -1 С устройства , я получаю большое число , например 6582.
как я могу получить правильные отрицательные числа?

Что я уже пробовал:

if (reply->error() == QModbusDevice::NoError) {
       const QModbusDataUnit unit = reply->result();
          // here is  variables reading
           const QString entry_hs_in_temp = QString::number(unit.value(0));
           const QString entry_hs_out_temp = QString::number(unit.value(1));

1 Ответов

Рейтинг:
8

Jochen Arndt

Данные являются двоичными, и они передаются по шине. Как интерпретировать эти данные и что они представляют, зависит от спецификаций. Для знакового значения, например, он является общим для использования Дополнение двух - Википедия[^].

То QModbusDataUnit::value() возвращает функция quint16 Это 16-битное беззнаковое двоичное значение, содержащее содержимое запрошенного регистра. Как интерпретировать этот контент, зависит от устройства.

Если он использует дополнение two для подписанных 16-битных значений, то он отправит 0xFFFF для -1. Преобразование этого в строку с помощью QString::number() результат-65535. Чтобы получить его как отрицательное число, вы должны привести значение к qint16 во-первых, чтобы функция знала, что у вас есть знаковое значение:

const QString entry_hs_in_temp = QString::number(static_cast<qint16>(unit.value(0)));

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