From 4209d2767e9e6e8262b82930f3dbf6b0fe735722 Mon Sep 17 00:00:00 2001 From: trabus322 Date: Thu, 28 Mar 2024 11:05:07 +0100 Subject: [PATCH] Starting rework of reading data --- inc/hoymiles/dtu.h | 6 ++++-- inc/hoymiles/port.h | 4 ++-- src/hoymiles/dtu.cpp | 19 ++++++++++--------- src/hoymiles/port.cpp | 2 +- src/main.cpp | 5 ++++- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/inc/hoymiles/dtu.h b/inc/hoymiles/dtu.h index bf2875c..457a660 100644 --- a/inc/hoymiles/dtu.h +++ b/inc/hoymiles/dtu.h @@ -14,8 +14,6 @@ class Dtu { std::vector microinverters; - bool connected; - void populateMicroinverters(); std::pair getMicroinverterBySerialNumber(long long serialNumber); @@ -25,6 +23,10 @@ class Dtu { bool isConnected(); + bool modbusError(); + + std::string modbusErrorMessage(); + // void updateMicroinverters(); void updateMicroinverters(std::vector ¶metersToGet, bool allParameters, std::vector µinvertersToGet); diff --git a/inc/hoymiles/port.h b/inc/hoymiles/port.h index 194ffe7..1f20077 100644 --- a/inc/hoymiles/port.h +++ b/inc/hoymiles/port.h @@ -20,9 +20,9 @@ class Port { void increaseParametersAge(); public: - Port(std::shared_ptr modbus, uint16_t portStartAddress); + Port(std::shared_ptr modbus, int portStartAddress); - uint16_t portStartAddress; + int portStartAddress; std::vector> parameters; diff --git a/src/hoymiles/dtu.cpp b/src/hoymiles/dtu.cpp index c3025db..f0a1225 100644 --- a/src/hoymiles/dtu.cpp +++ b/src/hoymiles/dtu.cpp @@ -16,27 +16,28 @@ Dtu::Dtu(const char *ip_address, int port) { this->modbus = std::make_shared(modbus); if (!this->modbus.get()->modbus_connect()) { - std::cerr << "conn_error" << std::endl; - this->connected = false; - } else { - this->connected = true; + std::cerr << "NOT CONNECTED" << std::endl; } - if (this->connected) { + if (this->modbus.get()->is_connected()) { this->populateMicroinverters(); } } -bool Dtu::isConnected() { return this->connected; } +bool Dtu::isConnected() { return this->modbus.get()->is_connected(); } + +bool Dtu::modbusError() { return this->modbus.get()->err; } + +std::string Dtu::modbusErrorMessage() { return this->modbus.get()->error_msg; } Dtu::~Dtu() { this->modbus.get()->modbus_close(); } void Dtu::populateMicroinverters() { - uint16_t portStartAddress = 0x1000; - uint16_t readArray[1]; + int portStartAddress = 0x1000; + uint16_t readArray[20]; int registerCount; - registerCount = this->modbus.get()->modbus_read_holding_registers(portStartAddress + 0x0021, 1, readArray); + registerCount = this->modbus.get()->modbus_read_holding_registers(portStartAddress + 0x0001, 1, readArray); while (registerCount != -1 && readArray[0] == 0x700) { Port port{this->modbus, portStartAddress}; diff --git a/src/hoymiles/port.cpp b/src/hoymiles/port.cpp index 6a8b8ba..0b16434 100644 --- a/src/hoymiles/port.cpp +++ b/src/hoymiles/port.cpp @@ -9,7 +9,7 @@ #include "port.h" #include "portParameters.h" -Port::Port(std::shared_ptr modbus, uint16_t portStartAddress) { +Port::Port(std::shared_ptr modbus, int portStartAddress) { this->modbus = modbus; this->portStartAddress = portStartAddress; diff --git a/src/main.cpp b/src/main.cpp index 057d925..1ce13ea 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -73,7 +73,7 @@ int main(int argc, char **argv) { auto endTime = std::chrono::high_resolution_clock::now(); std::cout << "DTU construction time: " << std::chrono::duration_cast(endTime - startTime).count() << "ms" << std::endl; - while ((dtu.isConnected() || ignoreNotConnected) && (!parametersToGet.empty() || allParameters)) { + while (!dtu.modbusError() && (dtu.isConnected() || ignoreNotConnected) && (!parametersToGet.empty() || allParameters)) { startTime = std::chrono::high_resolution_clock::now(); dtu.updateMicroinverters(parametersToGet, allParameters, microinvertersToGet); endTime = std::chrono::high_resolution_clock::now(); @@ -82,6 +82,9 @@ int main(int argc, char **argv) { dtu.printMicroinverters(parametersToGet, allParameters, microinvertersToGet, shortNames, microinvertersGetTodayProduction, microinvertersGetTotalProduction); std::cout << std::endl; } + if(dtu.modbusError()) { + std::cerr << dtu.modbusErrorMessage() << std::endl; + } return 0; }