From fd6476cd6e4d47c0cc0db9a1c18d5a14d5c18af2 Mon Sep 17 00:00:00 2001 From: trabus322 Date: Fri, 29 Mar 2024 21:40:50 +0100 Subject: [PATCH] :c --- CMakeLists.txt | 4 +- inc/hoymiles/microinverter.h | 3 + inc/hoymiles/sunspec.h | 37 ++++++ .../sunspecParameters/sunspecParameters.h | 15 +++ .../sunspecParametersGeneric.h | 124 ++++++++++++++++++ src/hoymiles/microinverter.cpp | 3 +- src/hoymiles/sunspec.cpp | 34 +++++ .../sunspecParameters/sunspecParameters.cpp | 23 ++++ .../sunspecParametersGeneric.cpp | 17 +++ src/main.cpp | 2 +- 10 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 inc/hoymiles/sunspec.h create mode 100644 inc/hoymiles/sunspecParameters/sunspecParameters.h create mode 100644 inc/hoymiles/sunspecParameters/sunspecParametersGeneric.h create mode 100644 src/hoymiles/sunspec.cpp create mode 100644 src/hoymiles/sunspecParameters/sunspecParameters.cpp create mode 100644 src/hoymiles/sunspecParameters/sunspecParametersGeneric.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ce57fb..359602a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,9 +3,9 @@ project(hoymilesClient VERSION 0.1.0 LANGUAGES C CXX) # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") -include_directories(inc inc/libmodbus inc/hoymiles inc/hoymiles/portParameters) +include_directories(inc inc/libmodbus inc/hoymiles inc/hoymiles/portParameters inc/hoymiles/sunspecParameters) -file(GLOB SOURCES src/*.cpp src/libmodbus/*.c src/hoymiles/*.cpp src/hoymiles/portParameters/*.cpp) +file(GLOB SOURCES src/*.cpp src/libmodbus/*.c src/hoymiles/*.cpp src/hoymiles/portParameters/*.cpp src/hoymiles/sunspecParameters/*.cpp) add_executable(hoymilesClient_exec ${SOURCES}) diff --git a/inc/hoymiles/microinverter.h b/inc/hoymiles/microinverter.h index 6ff4309..5e817cb 100644 --- a/inc/hoymiles/microinverter.h +++ b/inc/hoymiles/microinverter.h @@ -7,11 +7,14 @@ #include "modbus.h" #include "port.h" +#include "sunspec.h" class Microinverter { private: std::shared_ptr modbus; + Sunspec sunspec; + int startAddress; public: diff --git a/inc/hoymiles/sunspec.h b/inc/hoymiles/sunspec.h new file mode 100644 index 0000000..8cc4978 --- /dev/null +++ b/inc/hoymiles/sunspec.h @@ -0,0 +1,37 @@ +#ifndef SUNSPEC_H +#define SUNSPEC_H + +#include +#include +#include +#include + +#include "modbus.h" +#include "sunspecParametersGeneric.h" + +class Sunspec { + protected: + std::shared_ptr modbus; + + std::vector> parameters; + + std::string manufacturer; + std::string model; + std::string version; + + std::string serialNumber; + uint16_t deviceAddress; + + int sunspecAddress; + + void setValues(); + + void populateParameters(); + + public: + Sunspec(int address, std::shared_ptr modbus); + + uint16_t getAddress(); +}; + +#endif \ No newline at end of file diff --git a/inc/hoymiles/sunspecParameters/sunspecParameters.h b/inc/hoymiles/sunspecParameters/sunspecParameters.h new file mode 100644 index 0000000..745d47c --- /dev/null +++ b/inc/hoymiles/sunspecParameters/sunspecParameters.h @@ -0,0 +1,15 @@ +#ifndef SUNSPEC_PARAMETERS_H +#define SUNSPEC_PARAMETERS_H + +#include "sunspecParametersGeneric.h" + +class SunspecParameterManufacturer : public SunspecParameterString32 { + protected: + + public: + SunspecParameterManufacturer(); + + void setValueFromRegisters(uint16_t *registers, int addressOffset); +}; + +#endif \ No newline at end of file diff --git a/inc/hoymiles/sunspecParameters/sunspecParametersGeneric.h b/inc/hoymiles/sunspecParameters/sunspecParametersGeneric.h new file mode 100644 index 0000000..ab916a6 --- /dev/null +++ b/inc/hoymiles/sunspecParameters/sunspecParametersGeneric.h @@ -0,0 +1,124 @@ +#ifndef SUNSPEC_PARAMETERS_GENERIC_H +#define SUNSPEC_PARAMETERS_GENERIC_H + +#include +#include + +class SunspecParameter { + protected: + std::string name; + int registerAddressOffset; + int registerSize; + + public: + SunspecParameter(std::string name, int registerAddressOffset, int registerSize); + + virtual ~SunspecParameter(); + + enum SunspecValueType { uint32, uint16, string32, string16, sunssf, int16, acc32, float32, enum16 }; + + union SunspecValue { + uint32_t u32; + uint16_t u16; + uint16_t ssf; + int i16; + uint16_t a32; + float f; + uint16_t e16; + }; + + protected: + SunspecValueType valueType; + SunspecValue value; + + public: + + virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); + + std::pair getValue(); +}; + +// class SunspecParameterUint32 : public SunspecParameter { +// protected: + +// public: +// SunspecParameterUint32(std::string name, int registerAddressOffset, int registerSize); + +// virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +// }; + +// class SunspecParameterUint16 : public SunspecParameter { +// protected: + +// public: +// SunspecParameterUint16(std::string name, int registerAddressOffset, int registerSize); + +// virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +// }; + +class SunspecParameterString32 : public SunspecParameter { + protected: + std::string value; + + public: + SunspecParameterString32(std::string name, int registerAddressOffset, int registerSize); + + virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +}; + +// class SunspecParameterString16 : public SunspecParameter { +// protected: +// std::string value; + +// public: +// SunspecParameterString16(std::string name, int registerAddressOffset, int registerSize); + +// virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +// }; + +// class SunspecParameterSunssf : public SunspecParameter { +// protected: + +// public: +// SunspecParameterSunssf(std::string name, int registerAddressOffset, int registerSize); + +// virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +// }; + +// class SunspecParameterInt16 : public SunspecParameter { +// protected: + +// public: +// SunspecParameterInt16(std::string name, int registerAddressOffset, int registerSize); + +// virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +// }; + +// class SunspecParameterAcc32 : public SunspecParameter { +// protected: + +// public: +// SunspecParameterAcc32(std::string name, int registerAddressOffset, int registerSize); + +// virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +// }; + +// class SunspecParameterFloat32 : public SunspecParameter { +// protected: + +// public: +// SunspecParameterFloat32(std::string name, int registerAddressOffset, int registerSize); + +// virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +// }; + +// class SunspecParameterEnum16 : public SunspecParameter { +// protected: + +// public: +// SunspecParameterEnum16(std::string name, int registerAddressOffset, int registerSize); + +// virtual void setValueFromRegisters(uint16_t *registers, int addressOffset); +// }; + +#endif \ No newline at end of file diff --git a/src/hoymiles/microinverter.cpp b/src/hoymiles/microinverter.cpp index 3f5b79d..2524349 100644 --- a/src/hoymiles/microinverter.cpp +++ b/src/hoymiles/microinverter.cpp @@ -6,8 +6,9 @@ #include "microinverter.h" #include "port.h" +#include "sunspec.h" -Microinverter::Microinverter(std::shared_ptr modbus, int startAddress, long long serialNumber) { +Microinverter::Microinverter(std::shared_ptr modbus, int startAddress, long long serialNumber) : sunspec(40000, modbus) { this->modbus = modbus; this->startAddress = startAddress; this->serialNumber = serialNumber; diff --git a/src/hoymiles/sunspec.cpp b/src/hoymiles/sunspec.cpp new file mode 100644 index 0000000..d50cd50 --- /dev/null +++ b/src/hoymiles/sunspec.cpp @@ -0,0 +1,34 @@ +#include +#include +#include + +#include "sunspec.h" +#include "modbus.h" +#include "sunspecParameters.h" + +Sunspec::Sunspec(int address, std::shared_ptr modbus) { + this->modbus = modbus; + this->sunspecAddress = address; + + this->populateParameters(); + + this->setValues(); +} + +void Sunspec::setValues() { + uint16_t registers[70]; + + int registerCount; + registerCount = this->modbus.get()->modbus_read_holding_registers(this->sunspecAddress, 70, registers); + + std::vector>::iterator parametersIterator = this->parameters.begin(); + while(parametersIterator != this->parameters.end()) { + parametersIterator->get()->setValueFromRegisters(registers, 0); + parametersIterator++; + } +} + +void Sunspec::populateParameters() { + SunspecParameterManufacturer manufacturer{}; + this->parameters.push_back(std::make_shared(manufacturer)); +} \ No newline at end of file diff --git a/src/hoymiles/sunspecParameters/sunspecParameters.cpp b/src/hoymiles/sunspecParameters/sunspecParameters.cpp new file mode 100644 index 0000000..1312b08 --- /dev/null +++ b/src/hoymiles/sunspecParameters/sunspecParameters.cpp @@ -0,0 +1,23 @@ +#include +#include +#include + +#include "sunspecParameters.h" + +SunspecParameterManufacturer::SunspecParameterManufacturer() : SunspecParameterString32("manufacturer", 4, 16) { + this->valueType = string32; +} + +void SunspecParameterManufacturer::setValueFromRegisters(uint16_t *registers, int addressOffset) { + std::string readValue; + + for(int i{0}; iregisterSize; i++) { + std::stringstream readValueStringStream; + readValueStringStream << (registers[addressOffset + this->registerAddressOffset + i] >> 8) << " "; + readValueStringStream << (registers[addressOffset + this->registerAddressOffset + i] & 0x00FF) << " "; + + readValue.append(readValueStringStream.str().c_str()); + } + + this->value = readValue; +} \ No newline at end of file diff --git a/src/hoymiles/sunspecParameters/sunspecParametersGeneric.cpp b/src/hoymiles/sunspecParameters/sunspecParametersGeneric.cpp new file mode 100644 index 0000000..c825428 --- /dev/null +++ b/src/hoymiles/sunspecParameters/sunspecParametersGeneric.cpp @@ -0,0 +1,17 @@ +#include "sunspecParametersGeneric.h" + +SunspecParameter::~SunspecParameter() {} + +SunspecParameter::SunspecParameter(std::string name, int registerAddressOffset, int registerSize) { + this->name = name; + this->registerAddressOffset = registerAddressOffset; + this->registerSize = registerSize; +} + +void SunspecParameter::setValueFromRegisters(uint16_t *registers, int addressOffset) {} + +std::pair SunspecParameter::getValue() {} + +SunspecParameterString32::SunspecParameterString32(std::string name, int registerAddressOffset, int registerSize) : SunspecParameter(name, registerAddressOffset, registerSize) {} + +void SunspecParameterString32::setValueFromRegisters(uint16_t *registers, int addressOffset) {} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index aa7d743..bd69d8e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,7 +19,7 @@ int main(int argc, char **argv) { signal(SIGTERM, sigHandler); signal(SIGABRT, sigHandler); - std::string version{"v2.0beta"}; + std::string version{"v2.0"}; std::cout << version << std::endl; CLI::App hoymilesClient{"Client for DTU-Pro/DTU-ProS"};