Modbus Driver fixing multiRequest

This commit is contained in:
Emanuele Trabattoni
2025-07-10 16:01:10 +02:00
parent 4b97e6535d
commit 8f701ce81a
7 changed files with 158 additions and 191 deletions

View File

@@ -6,99 +6,16 @@
#include <RS485_Driver.h>
#include <TCA9554PWR_Driver.h>
#ifdef ESP32
auto bus = drivers::MODBUS(9600, SERIAL_8N1);
#else
auto bus = drivers::MODBUS(9600);
#endif
#include "utils.h"
/////////////// GLOBALS ///////////////
uint16_t k(0);
bool v(true);
void setup()
{
bool success = true;
Serial.begin(9600);
LOG_ATTACH_SERIAL(Serial);
LOG_INFO("Create i2c driver");
auto i2c = drivers::I2C();
LOG_INFO("Create relay driver");
auto relays = drivers::TCA9554PWR(i2c, TCA9554_ADDRESS);
/*
for (auto i(0); i < drivers::TCA9554PWR::OUT_PIN_MAX; i++)
{
LOG_INFO("Toggle relay [%d]=ON", i);
success &= relays.setOut(i, true);
delay(1000);
LOG_INFO("Toggle relay [%d]=OFF", i);
success &= relays.setOut(i, false);
delay(1000);
}
LOG_INFO("Toggle port [0x55]");
success &= relays.setPort(0x55);
delay(2000);
LOG_INFO("Toggle port [0xAA]");
success &= relays.setPort(0xAA);
delay(2000);
*/
LOG_INFO("Create modbus driver");
const uint8_t devAddress(0x01);
const uint8_t baseRegister(0x00);
std::vector<uint16_t> results;
LOG_INFO("Set Slave Address");
/*
while (false & !bus.writeRegister(devAddress, 0x00FE, 0x00AA)){
std::vector<uint16_t> rv;
if(bus.readHoldingRegisters(0x00AA, 0x00FE, 1, rv)) {
LOG_INFO("New Slave address: ", rv[0]);
break;
}
delay(500);
};
*/
/*
while (true)
{
success &= bus.readHoldingRegisters(devAddress, baseRegister, 8, results);
if (success) {
for (auto i(0); i< results.size(); i++){
LOG_INFO("[",i,"]Temperature: ", results.at(i)/10.0f);
}
results.clear();
}
delay(2000);
}
LOG_INFO("Write single coil");
success &= bus.writeCoil(devAddress, baseRegister, true);
success &= bus.writeCoil(devAddress, baseRegister, false);
LOG_INFO("Write multiple coils");
const uint16_t coilsNum(32);
std::vector<bool> coilsValues(coilsNum, false);
bool v = true;
for (auto i(0); i < coilsNum; i++)
{
coilsValues[i] = v;
v = ~v;
}
success &= bus.writeCoils(devAddress, baseRegister, coilsValues);
LOG_INFO("Write single register");
success &= bus.writeRegister(devAddress, baseRegister, 0xAA);
LOG_INFO("Write multiple registers");
const uint16_t regNum(16);
std::vector<uint16_t> regValues(regNum, 0);
for (uint16_t i(0); i < regNum; i++)
{
regValues[i] = i * 2;
}
*/
}
void loop()
@@ -106,30 +23,44 @@ void loop()
const uint8_t tempBoardAddr(0xAA);
const uint8_t relayBoardAddr(0x01);
const uint8_t baseRegister(0x00);
LOG_INFO("Looop");
std::vector<uint16_t> results;
bool success = bus.readHoldingRegisters(tempBoardAddr, baseRegister, 8, results);
if (success)
//////////////// DEVICES ////////////////
auto i2c = drivers::I2C();
auto relays = drivers::TCA9554PWR(i2c, TCA9554_ADDRESS);
auto bus = drivers::MODBUS(9600, SERIAL_8N1);
while (true)
{
for (auto i(0); i < results.size(); i++)
{
LOG_INFO("[", i, "]Temperature: ", results.at(i) / 10.0f);
}
results.clear();
}
delay(100);
for (auto i(0); i < 8; i++)
{
LOG_DEBUG("\n\nCHANNEL ", i);
LOG_INFO("\n\n\n\n[", k++, "] Loop");
std::vector<uint16_t> results;
std::vector<bool> values;
bus.writeCoil(relayBoardAddr, (uint8_t)i, true);
bus.readCoils(relayBoardAddr,0x00,8, values);
for (auto j(0); j < values.size(); j++) {
LOG_DEBUG("Coil", j, values.at(j) ? "True" : "False");
if (bus.readHoldingRegisters(tempBoardAddr, baseRegister, 8, results))
{
for (auto i(0); i < results.size(); i++)
{
LOG_INFO("[", i, "]Temperature: ", results.at(i) / 10.0f);
}
results.clear();
}
delay(1000);
bus.writeCoil(relayBoardAddr, (uint8_t)i, false);
delay(1000);
delay(100);
LOG_INFO("\n\n====>Write Status 1");
bus.writeCoils(relayBoardAddr, 0x00, {true, false, true, false, true, false, true, false});
bus.readCoils(relayBoardAddr, 0x00, 8, values);
printBool("====>Status 1", values);
delay(5000);
LOG_INFO("\n\n====>Write Status 2");
bus.writeCoils(relayBoardAddr, 0x00, {false, true, false, true, false, true, false, true});
bus.readCoils(relayBoardAddr, 0x00, 8, values);
printBool("====>Status 2", values);
delay(5000);
LOG_INFO("\n\n====>Read Inputs");
bus.readInputs(relayBoardAddr, 0x00, 8, values);
printBool("====>Inputs", values);
delay(5000);
}
delay(5000);
}