Преобразование из необработанных данных в float из DDSU666-H

Here is the modbus register Map i find from CHINT

Привет, профессора, я пытаюсь прочитать данные из DDSU666-H ( Smart metter) CHINT используя modbus RTU, я получаю только необработанные данные , но я не знаю , как преобразовать их в float, в приведенном ниже коде речь идет о напряжении, реальные данные-233,4 В, но в последовательном-вот так, может ли кто-нибудь помочь мне преобразовать это в float 233,4 В, спасибо так много!

 Вот мой код, я получаю его из библиотеки modbusmaster.
/*

  RS485_HalfDuplex.pde - пример использования библиотеки ModbusMaster для связи
  с контроллером EPSolar LS2024B, использующим полудуплексный приемопередатчик RS485.

  Этот пример протестирован на солнечном контроллере заряда EPSolar LS2024B.
  Спецификации протокола см. Здесь:
  http://www.solar-elektro.cz/data/dokumenty/1733_modbus_protocol.pdf

  Библиотека:: ModbusMaster
  Автор:: Мариус Кинтель <marius at kintel dot net>

  Copyright:: 2009-2016 Doc Walker

  Лицензируется по лицензии Apache версии 2.0 (далее - "Лицензия").;
  вы не можете использовать этот файл, кроме как в соответствии с Лицензией.
  Копию Лицензии вы можете получить по адресу:

      http://www.apache.org/licenses/LICENSE-2.0

  Если это не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение
  распространяется по Лицензии на условиях "КАК ЕСТЬ".,
  БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ, явных или подразумеваемых.
  См.Лицензию для конкретного языка, регулирующего разрешения и
ограничения в соответствии с Лицензией.

*/

#include <ModbusMaster.h>

/*!
  Мы используем приемопередатчик RS485, совместимый с MAX485.
  Rx/Tx подключается к аппаратному последовательному порту в режиме "Serial".
  Контакты Data Enable и Receiver Enable подключаются следующим образом:
*/
#define MAX485_DE      50
#define MAX485_RE_NEG  52

// instantiate ModbusMaster object
ModbusMaster node;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup()
{
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);

  // Modbus communication runs at 115200 baud
  Serial1.begin(9600);
  Serial.begin(9600);

  // Modbus slave ID 1
  node.begin(12, Serial1);
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}
void loop()
{
  uint8_t i, result;
  uint16_t data[2];
  union
  {
    uint32_t j;
    float f;
  } u;
  // Read 16 registers starting at 0x3100)
  Serial.println("-----------------------");
  result = node.readHoldingRegisters(0x2000, 2);
  if (result == node.ku8MBSuccess)
  {
    for (i = 0; i < 2; i++)
    {
      data[i] = node.getResponseBuffer(i);
    }
    Serial.println(data[0]);
    Serial.println(data[1]);
    u.j = ((unsigned long)data[1] << 16 | data[0]);
    Serial.println(u.f);
  }

, 👍-1

Обсуждение

не вопрос об Arduino ... в лучшем случае это общий вопрос программирования, @jsotola

пожалуйста, удалите изображение текста и добавьте текст actusl ... текст на картинке не может быть скопирован для анализа, @jsotola

вы имеете в виду текст "привет, профессор"?, @HẢI HỒ

нет, распечатка показаний ... это должен быть текст, а не картинка, @jsotola

Не могли бы вы поделиться своей проводкой между модулем rs485 и ddsu, пожалуйста?, @acca rien


1 ответ


2

Похоже, в техническом паспорте не указано конечное значение. Или, может быть, это так, но вы этого не показываете. Из полученных вами чисел следует, что float находятся в порядке большого конца, тогда как ваш код предполагает, что литтл-эндиан.

Измените назначение u.j следующим образом:

u.j = ((unsigned long)data[0] << 16 | data[1]);
,

о, я действительно успешно прочитал регистр напряжения, но с frequentcy ( 0x200E) это не работает, ха-ха, @HẢI HỒ

Здравствуйте, эксперт, почему я не могу прочитать активный регистр частоты и мощности, в то время как я могу прочитать напряжение и ток ?, @HẢI HỒ

@hẢihỒ: Понятия не имею. Проверьте документацию вашего устройства., @Edgar Bonet