Modbus Driver fixing multiRequest
This commit is contained in:
151
src/main.cpp
151
src/main.cpp
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user