diff --git a/inc/hoymiles/port.h b/inc/hoymiles/port.h index cd7cb79..9071fdc 100644 --- a/inc/hoymiles/port.h +++ b/inc/hoymiles/port.h @@ -19,6 +19,9 @@ class Port { uint16_t portStartAddress; + uint16_t *readArray; + int readArraySize; + std::vector> parameters; void populateParameters(); diff --git a/inc/hoymiles/portParameters/portParameters.h b/inc/hoymiles/portParameters/portParameters.h index 83dcd85..1444f29 100644 --- a/inc/hoymiles/portParameters/portParameters.h +++ b/inc/hoymiles/portParameters/portParameters.h @@ -5,7 +5,7 @@ class PortParameterMicroinverterSerialNumber : public PortParameterInt { protected: - void setValueFromRegisters(uint16_t *readArray, int registerCount); + void setValueFromRegisters(uint16_t *readArray, int readArraySize); public: PortParameterMicroinverterSerialNumber(); @@ -13,7 +13,7 @@ class PortParameterMicroinverterSerialNumber : public PortParameterInt { class PortParameterPortNumber : public PortParameterInt { private: - void setValueFromRegisters(uint16_t *readArray, int registerCount); + void setValueFromRegisters(uint16_t *readArray, int readArraySize); public: PortParameterPortNumber(); diff --git a/inc/hoymiles/portParameters/portParametersGeneric.h b/inc/hoymiles/portParameters/portParametersGeneric.h index b9578bd..bc59063 100644 --- a/inc/hoymiles/portParameters/portParametersGeneric.h +++ b/inc/hoymiles/portParameters/portParametersGeneric.h @@ -14,7 +14,7 @@ class PortParameter { uint16_t parameterAddressOffset; int registerSize; - virtual void setValueFromRegisters(uint16_t *readArray, int registerCount); + virtual void setValueFromRegisters(uint16_t *readArray, int readArraySize); public: PortParameter(std::string name, uint16_t parameterAddressOffset, int registerSize); @@ -40,14 +40,14 @@ class PortParameter { virtual std::string getOutputValue(); - void updateValue(std::shared_ptr modbus_context, std::mutex *modbus_context_mutex, uint16_t portStartAddress); + void updateValue(uint16_t *readArray, int readArraySize, int registerCount); }; class PortParameterFloat : virtual public PortParameter { protected: int decimalPlaces; - virtual void setValueFromRegisters(uint16_t *readArray, int registerCount); + virtual void setValueFromRegisters(uint16_t *readArray, int readArraySize); public: PortParameterFloat(std::string name, int decimalPlaces, uint16_t parameterAddressOffset, int registerSize); @@ -57,7 +57,7 @@ class PortParameterFloat : virtual public PortParameter { class PortParameterInt : virtual public PortParameter { protected: - virtual void setValueFromRegisters(uint16_t *readArray, int registerCount); + virtual void setValueFromRegisters(uint16_t *readArray, int readArraySize); public: PortParameterInt(std::string name, uint16_t parameterAddressOffset, int registerSize); diff --git a/src/hoymiles/microinverter.cpp b/src/hoymiles/microinverter.cpp index 6a636ed..cdc06c1 100644 --- a/src/hoymiles/microinverter.cpp +++ b/src/hoymiles/microinverter.cpp @@ -29,6 +29,8 @@ void Microinverter::populatePorts() { this->modbus_context_mutex->lock(); registerCount = modbus_read_registers(*this->modbus_context.get(), portStartAddress + 0x0021, 1, readArray); this->modbus_context_mutex->unlock(); + + break; } } diff --git a/src/hoymiles/port.cpp b/src/hoymiles/port.cpp index d12e634..067d397 100644 --- a/src/hoymiles/port.cpp +++ b/src/hoymiles/port.cpp @@ -1,18 +1,21 @@ -#include -#include -#include #include +#include #include +#include +#include #include "modbus.h" #include "port.h" #include "portParameters.h" -Port::Port(std::shared_ptr modbus_context, std::mutex *modbus_context_mutex, uint16_t portStartAddress) { +Port::Port(std::shared_ptr modbus_context, std::mutex *modbus_context_mutex, uint16_t portStartAddress) { this->modbus_context = modbus_context; this->modbus_context_mutex = modbus_context_mutex; + this->readArraySize = 34; + this->readArray = new uint16_t[this->readArraySize]; + this->portStartAddress = portStartAddress; this->populateParameters(); @@ -51,9 +54,15 @@ void Port::populateParameters() { } void Port::updateParameters() { + int registerCount; + + modbus_context_mutex->lock(); + registerCount = modbus_read_registers(*modbus_context.get(), portStartAddress - 1, this->readArraySize, this->readArray); + modbus_context_mutex->unlock(); + std::vector>::iterator parametersIterator{this->parameters.begin()}; while (parametersIterator != this->parameters.end()) { - parametersIterator->get()->updateValue(this->modbus_context, this->modbus_context_mutex, this->portStartAddress); + parametersIterator->get()->updateValue(this->readArray, this->readArraySize, registerCount); parametersIterator++; } } \ No newline at end of file diff --git a/src/hoymiles/portParameters/portParameters.cpp b/src/hoymiles/portParameters/portParameters.cpp index 98f86e6..4754d18 100644 --- a/src/hoymiles/portParameters/portParameters.cpp +++ b/src/hoymiles/portParameters/portParameters.cpp @@ -6,12 +6,11 @@ PortParameterMicroinverterSerialNumber::PortParameterMicroinverterSerialNumber() : PortParameterInt("microinverterSerialNumber", 0x0001, 6), PortParameter("microinverterSerialNumber", 0x0001, 6) {} -void PortParameterMicroinverterSerialNumber::setValueFromRegisters(uint16_t *readArray, int registerCount) { +void PortParameterMicroinverterSerialNumber::setValueFromRegisters(uint16_t *readArray, int readArraySize) { uint16_t readValue; std::string readValueString = ""; - registerCount = std::ceil(registerCount/2); - for (int i{0}; i < registerCount; i++) { - readValue = readArray[i]; + for (int i{0}; i < std::ceil(this->registerSize/2) && (this->parameterAddressOffset + i) < readArraySize; i++) { + readValue = readArray[this->parameterAddressOffset + i]; std::stringstream readValueStringStream; readValueStringStream << std::hex << readValue; readValueString.append(readValueStringStream.str()); @@ -21,9 +20,9 @@ void PortParameterMicroinverterSerialNumber::setValueFromRegisters(uint16_t *rea PortParameterPortNumber::PortParameterPortNumber() : PortParameterInt("portNumber", 0x0007, 1), PortParameter("portNumber", 0x0007, 1) {} -void PortParameterPortNumber::setValueFromRegisters(uint16_t *readArray, int registerCount) { - if (registerCount > 0) { - this->value.i = readArray[0]; +void PortParameterPortNumber::setValueFromRegisters(uint16_t *readArray, int readArraySize) { + if(readArraySize > this->parameterAddressOffset) { + this->value.i = readArray[this->parameterAddressOffset]; } } diff --git a/src/hoymiles/portParameters/portParametersGeneric.cpp b/src/hoymiles/portParameters/portParametersGeneric.cpp index 000da08..4fc11f4 100644 --- a/src/hoymiles/portParameters/portParametersGeneric.cpp +++ b/src/hoymiles/portParameters/portParametersGeneric.cpp @@ -20,7 +20,7 @@ PortParameter::PortParameter(std::string name, uint16_t parameterAddressOffset, PortParameter::~PortParameter() {} -void PortParameter::setValueFromRegisters(uint16_t *readArray, int registerCount) {} +void PortParameter::setValueFromRegisters(uint16_t *readArray, int readArraySize) {} std::pair PortParameter::getValue() { return std::pair(this->value, this->valueType); @@ -28,14 +28,7 @@ std::pair modbus_context, std::mutex *modbus_context_mutex, uint16_t portStartAddress) { - uint16_t readArray[this->registerSize]; - int registerCount; - - modbus_context_mutex->lock(); - registerCount = modbus_read_registers(*modbus_context.get(), portStartAddress + this->parameterAddressOffset, this->registerSize, readArray); - modbus_context_mutex->unlock(); - +void PortParameter::updateValue(uint16_t *readArray, int readArraySize, int registerCount) { if(registerCount == -1){ this->age++; } @@ -53,7 +46,7 @@ PortParameterFloat::PortParameterFloat(std::string name, int decimalPlaces, uint this->value.f = 0; } -void PortParameterFloat::setValueFromRegisters(uint16_t *readArray, int registerCount) { +void PortParameterFloat::setValueFromRegisters(uint16_t *readArray, int readArraySize) { float temp = readArray[0]; temp = temp / std::pow(10, this->decimalPlaces); this->value.f = temp; @@ -69,12 +62,11 @@ PortParameterInt::PortParameterInt(std::string name, uint16_t parameterAddressOf this->value.i = 0; } -void PortParameterInt::setValueFromRegisters(uint16_t *readArray, int registerCount) { +void PortParameterInt::setValueFromRegisters(uint16_t *readArray, int readArraySize) { uint16_t readValue; std::string readValueString = ""; - registerCount = std::ceil(registerCount/2); - for (int i{0}; i < registerCount; i++) { - readValue = readArray[i]; + for (int i{0}; i < std::ceil(this->registerSize/2) && (this->parameterAddressOffset + i) < readArraySize; i++) { + readValue = readArray[this->parameterAddressOffset + i]; readValueString.append(std::to_string(readValue)); } this->value.i = std::stol(readValueString);