Преобразование из необработанных данных в float из DDSU666-H
Привет, профессора, я пытаюсь прочитать данные из 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); }
@HẢI HỒ, 👍-1
Обсуждение1 ответ
Похоже, в техническом паспорте не указано конечное значение. Или, может быть, это так, но вы этого не показываете. Из полученных вами чисел следует, что float находятся в порядке большого конца, тогда как ваш код предполагает, что литтл-эндиан.
Измените назначение u.j
следующим образом:
u.j = ((unsigned long)data[0] << 16 | data[1]);
о, я действительно успешно прочитал регистр напряжения, но с frequentcy ( 0x200E) это не работает, ха-ха, @HẢI HỒ
Здравствуйте, эксперт, почему я не могу прочитать активный регистр частоты и мощности, в то время как я могу прочитать напряжение и ток ?, @HẢI HỒ
@hẢihỒ: Понятия не имею. Проверьте документацию вашего устройства., @Edgar Bonet
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
не вопрос об Arduino ... в лучшем случае это общий вопрос программирования, @jsotola
пожалуйста, удалите изображение текста и добавьте текст actusl ... текст на картинке не может быть скопирован для анализа, @jsotola
вы имеете в виду текст "привет, профессор"?, @HẢI HỒ
нет, распечатка показаний ... это должен быть текст, а не картинка, @jsotola
Не могли бы вы поделиться своей проводкой между модулем rs485 и ddsu, пожалуйста?, @acca rien