Fixed MODBUS and seneca drivers, added partial counter reset

This commit is contained in:
Emanuele Trabattoni
2025-07-13 13:16:24 +02:00
parent d2eba9085e
commit 7e02f3cef2
5 changed files with 96 additions and 60 deletions

View File

@@ -12,7 +12,7 @@ namespace drivers
const S50140::powerinfo_t S50140::getAll()
{
powerinfo_t info;
powerinfo_t info{MAXFLOAT};
info.v = getV();
info.a = getA();
info.pAct = getPact();
@@ -57,19 +57,36 @@ namespace drivers
return readFloatReg(REG_WhPart);
}
void S50140::resetTotalCounters()
void S50140::delayRequest()
{
uint8_t retries(0);
const uint16_t resetAll = 0x0000;
while (retries++ < maxRetries)
{
if (m_bus.writeRegister(m_address, REG_TotCount, resetAll))
return;
LOG_ERROR("Unable to Reset Powermeter Total Counters, device", m_address);
delay(10);
auto now = millis();
if ((now - m_lastRequest) < minDelay)
{ // minimum 500ms between requests
delay(now - m_lastRequest);
}
return;
m_lastRequest = now;
}
const uint8_t S50140::getRegset()
{
std::vector<uint16_t> value;
delayRequest();
m_bus.readHoldingRegisters(m_address, REG_Regset, 2, value);
if (value.empty())
return UINT8_MAX;
return value.front() + value.back();
}
const uint16_t S50140::getCounterStatus()
{
std::vector<uint16_t> value;
delayRequest();
m_bus.readHoldingRegisters(m_address, REG_PartCount, 2, value);
if (value.empty())
return UINT16_MAX;
return value.front() + value.back();
}
void S50140::resetPartialCounters()
{
uint8_t retries(0);
@@ -79,15 +96,18 @@ namespace drivers
while (retries++ < maxRetries)
{
bool ok(true);
ok &= m_bus.writeRegister(m_address, REG_TotCount, stopAll);
delay(10);
ok &= m_bus.writeRegister(m_address, REG_TotCount, resetAll);
delay(10);
ok &= m_bus.writeRegister(m_address, REG_TotCount, startAll);
delayRequest();
LOG_WARN("Powermeter Counter STOP");
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {0x0000, stopAll});
delayRequest();
LOG_WARN("Powermeter Counter RESET");
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {0x0000, resetAll});
delayRequest();
LOG_WARN("Powermeter Counter START");
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {0x0000, startAll});
if (ok)
return;
LOG_ERROR("Unable to Reset Powermeter Partial Counters, device", m_address);
delay(10);
}
return;
}
@@ -99,11 +119,12 @@ namespace drivers
while (retries++ < maxRetries)
{
delayRequest();
if (m_bus.readHoldingRegisters(m_address, reg, dataWords, values) && values.size() == dataWords)
{
floatval_t fv; // potrebbe essere il contrario, vedremo
fv.hi = values[0]; // magari va invertita ancora l'endianness
fv.lo = values[1];
floatval_t fv; // potrebbe essere il contrario, vedremo
fv.words.lo = values[0]; // magari va invertita ancora l'endianness
fv.words.hi = values[1];
return fv.f;
}
LOG_ERROR("Unable to Read Powermeter values, device", m_address);