2024-03-20 14:40:02 +01:00
|
|
|
#include <algorithm>
|
2024-03-20 14:56:19 +01:00
|
|
|
#include <cmath>
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <vector>
|
2024-03-16 21:15:15 +01:00
|
|
|
|
|
|
|
|
#include "modbus.h"
|
|
|
|
|
|
|
|
|
|
#include "port.h"
|
2024-03-16 22:51:32 +01:00
|
|
|
#include "portParameters.h"
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-19 18:13:27 +01:00
|
|
|
Port::Port(std::shared_ptr<class modbus> modbus, uint16_t portStartAddress) {
|
|
|
|
|
this->modbus = modbus;
|
2024-03-17 21:33:21 +01:00
|
|
|
|
2024-03-16 21:15:15 +01:00
|
|
|
this->portStartAddress = portStartAddress;
|
|
|
|
|
|
2024-03-19 09:22:21 +01:00
|
|
|
this->currentFixed = false;
|
|
|
|
|
|
2024-03-16 21:15:15 +01:00
|
|
|
this->populateParameters();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Port::populateParameters() {
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterPortNumber>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterPvVoltage>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterPvCurrentMi>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterPvCurrentHm>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterGridVoltage>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterGridFrequency>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterPvPower>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterTodayProduction>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterTotalProduction>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterTemperature>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterOperatingStatus>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterAlarmCode>());
|
2024-03-16 21:15:15 +01:00
|
|
|
|
2024-03-16 22:51:32 +01:00
|
|
|
this->parameters.push_back(std::make_shared<PortParameterAlarmCount>());
|
|
|
|
|
|
|
|
|
|
this->parameters.push_back(std::make_shared<PortParameterLinkStatus>());
|
2024-03-16 21:15:15 +01:00
|
|
|
}
|
|
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
std::pair<std::shared_ptr<PortParameter>, bool> Port::getParameterByName(std::string name) {
|
|
|
|
|
std::pair<std::shared_ptr<PortParameter>, bool> result;
|
|
|
|
|
result.second = false;
|
|
|
|
|
|
|
|
|
|
std::vector<std::shared_ptr<PortParameter>>::iterator parametersIterator = this->parameters.begin();
|
2024-03-20 14:56:19 +01:00
|
|
|
while (parametersIterator != this->parameters.end() && !result.second) {
|
|
|
|
|
if (parametersIterator->get()->name == name) {
|
2024-03-20 11:28:43 +01:00
|
|
|
result.first = *parametersIterator;
|
|
|
|
|
result.second = true;
|
|
|
|
|
}
|
2024-03-20 14:40:02 +01:00
|
|
|
parametersIterator++;
|
2024-03-20 11:28:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-19 09:22:21 +01:00
|
|
|
void Port::fixCurrent() {
|
2024-03-20 14:56:19 +01:00
|
|
|
if (this->currentFixed) {
|
2024-03-19 09:22:21 +01:00
|
|
|
return;
|
|
|
|
|
}
|
2024-03-20 14:56:19 +01:00
|
|
|
|
|
|
|
|
if (!this->getParameterByName("pvCurrentMI").second != !this->getParameterByName("pvCurrentHM").second) {
|
|
|
|
|
this->currentFixed = true;
|
2024-03-19 09:22:21 +01:00
|
|
|
return;
|
|
|
|
|
}
|
2024-03-20 14:56:19 +01:00
|
|
|
|
|
|
|
|
if (this->getParameterByName("pvVoltage").second && this->getParameterByName("pvPower").second) {
|
|
|
|
|
if (this->getParameterByName("pvCurrentMI").second && this->getParameterByName("pvCurrentHM").second) {
|
2024-03-20 19:55:36 +01:00
|
|
|
if (this->getParameterByName("pvPower").first->getValue().first.f > this->getParameterByName("pvVoltage").first->getValue().first.f * this->getParameterByName("pvCurrentMI").first->getValue().first.f) {
|
2024-03-20 14:56:19 +01:00
|
|
|
this->parameters.erase(std::find(this->parameters.begin(), this->parameters.end(), this->getParameterByName("pvCurrentHM").first));
|
2024-03-20 19:55:36 +01:00
|
|
|
} else {
|
2024-03-20 14:56:19 +01:00
|
|
|
this->parameters.erase(std::find(this->parameters.begin(), this->parameters.end(), this->getParameterByName("pvCurrentM").first));
|
|
|
|
|
}
|
|
|
|
|
this->currentFixed = true;
|
|
|
|
|
}
|
2024-03-20 19:55:36 +01:00
|
|
|
}
|
2024-03-19 09:22:21 +01:00
|
|
|
}
|
|
|
|
|
|
2024-03-20 14:40:02 +01:00
|
|
|
void Port::updateParameters(std::vector<std::string> ¶metersToGet, bool allParameters) {
|
2024-03-20 14:56:19 +01:00
|
|
|
if (allParameters && parametersToGet.size() < this->parameters.size()) {
|
2024-03-20 14:40:02 +01:00
|
|
|
std::vector<std::shared_ptr<PortParameter>>::iterator parametersIterator = this->parameters.begin();
|
2024-03-20 14:56:19 +01:00
|
|
|
while (parametersIterator != this->parameters.end()) {
|
|
|
|
|
if (std::find(parametersToGet.begin(), parametersToGet.end(), parametersIterator->get()->name) == parametersToGet.end()) {
|
2024-03-20 14:40:02 +01:00
|
|
|
parametersToGet.push_back(parametersIterator->get()->name);
|
|
|
|
|
}
|
|
|
|
|
parametersIterator++;
|
|
|
|
|
}
|
2024-03-18 23:48:37 +01:00
|
|
|
}
|
|
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
std::vector<std::string>::iterator parametersToGetIterator = parametersToGet.begin();
|
2024-03-20 14:56:19 +01:00
|
|
|
while (parametersToGetIterator != parametersToGet.end()) {
|
2024-03-20 11:28:43 +01:00
|
|
|
std::pair<std::shared_ptr<PortParameter>, bool> parameterPair;
|
2024-03-20 14:56:19 +01:00
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
parameterPair = this->getParameterByName(*parametersToGetIterator);
|
2024-03-20 14:56:19 +01:00
|
|
|
if (parameterPair.second) {
|
2024-03-20 11:28:43 +01:00
|
|
|
parameterPair.first->updateValue(this->modbus, this->portStartAddress);
|
|
|
|
|
}
|
2024-03-20 14:56:19 +01:00
|
|
|
|
|
|
|
|
this->fixCurrent();
|
2024-03-20 19:55:36 +01:00
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
parametersToGetIterator++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-20 14:40:02 +01:00
|
|
|
void Port::printParameters(std::vector<std::string> ¶metersToGet, bool allParameters) {
|
2024-03-20 14:56:19 +01:00
|
|
|
if (allParameters && parametersToGet.size() < this->parameters.size()) {
|
2024-03-20 14:40:02 +01:00
|
|
|
std::vector<std::shared_ptr<PortParameter>>::iterator parametersIterator = this->parameters.begin();
|
2024-03-20 14:56:19 +01:00
|
|
|
while (parametersIterator != this->parameters.end()) {
|
|
|
|
|
if (std::find(parametersToGet.begin(), parametersToGet.end(), parametersIterator->get()->name) != parametersToGet.end()) {
|
2024-03-20 14:40:02 +01:00
|
|
|
parametersToGet.push_back(parametersIterator->get()->name);
|
|
|
|
|
}
|
|
|
|
|
parametersIterator++;
|
|
|
|
|
}
|
2024-03-18 23:48:37 +01:00
|
|
|
}
|
|
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
std::vector<std::string>::iterator parametersToGetIterator = parametersToGet.begin();
|
2024-03-20 14:56:19 +01:00
|
|
|
if (parametersToGetIterator != parametersToGet.end()) {
|
2024-03-20 11:28:43 +01:00
|
|
|
std::cout << "|";
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-20 14:56:19 +01:00
|
|
|
while (parametersToGetIterator != parametersToGet.end()) {
|
2024-03-20 11:28:43 +01:00
|
|
|
std::pair<std::shared_ptr<PortParameter>, bool> parameterPair;
|
|
|
|
|
|
|
|
|
|
parameterPair = this->getParameterByName(*parametersToGetIterator);
|
2024-03-20 14:56:19 +01:00
|
|
|
if (parameterPair.second) {
|
2024-03-20 11:28:43 +01:00
|
|
|
std::cout << " " << parameterPair.first->name << ": " << parameterPair.first->getOutputValue() << " |";
|
|
|
|
|
}
|
2024-03-20 14:40:02 +01:00
|
|
|
parametersToGetIterator++;
|
2024-03-20 11:28:43 +01:00
|
|
|
}
|
2024-03-16 21:15:15 +01:00
|
|
|
}
|