From a457c65874d5f8c7f1b42d9ceee7aebb484df4fb Mon Sep 17 00:00:00 2001 From: Peter M. Groen Date: Mon, 26 Sep 2022 00:34:14 +0200 Subject: [PATCH] Implmenting ModbusBase class --- src/modbusbase.cpp | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/modbusbase.h | 20 ++++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/modbusbase.cpp b/src/modbusbase.cpp index 847e170..dbd0146 100644 --- a/src/modbusbase.cpp +++ b/src/modbusbase.cpp @@ -118,7 +118,7 @@ int ModbusBase::readInputRegisters(uint16_t address, uint16_t amount, uint16_t * if (m_connected) { modbusRead(address, amount, READ_INPUT_REGS); - uint8_t to_rec[MSG_MAX_LENGTH]; + uint8_t to_rec[MAX_MSG_LENGTH]; size_t result = modbusReceive(to_rec); if (result == -1) { @@ -151,22 +151,116 @@ int ModbusBase::writeCoil(uint16_t address, const bool &to_write) if (m_connected) { int value = to_write * 0xFF00; + modbusWrite(address, 1, WRITE_COIL, (uint16_t *)&value); + uint8_t to_rec[MAX_MSG_LENGTH]; + ssize_t result = modbusReceive(to_rec); + if (result == -1) + { + setBadConnection(); + return BAD_CON; + } + + modbusErrorHandle(to_rec, WRITE_COIL); + if (err) + { + return err_no; + } + return 0; + } + else + { + setBadConnection(); + return BAD_CON; } } int ModbusBase::writeRegister(uint16_t address, const uint16_t &value) { + if (m_connected) + { + modbusWrite(address, 1, WRITE_REG, &value); + uint8_t to_rec[MAX_MSG_LENGTH]; + ssize_t result = modebusReceive(to_rec); + if (result == -1) + { + setBadConnection(); + return BAD_CON; + } + modbusErrorHandle(to_rec, WRITE_COIL); + if (err) + { + return err_no; + } + return 0; + } + else + { + setBadConnection(); + return BAD_CON; + } } int ModbusBase::writeCoils(uint16_t address, uint16_t amount, const bool *value) { + if (m_connected) + { + uint16_t *temp = new uint16_t[amount]; + for (int i = 0; i < amount; i++) + { + temp[i] = (uint16_t)value[i]; + } + + modbusWrite(address, amount, WRITE_COILS, temp); + delete[] temp; + uint8_t to_rec[MAX_MSG_LENGTH]; + ssize_t result = modbusReceive(to_rec); + if (result == -1) + { + setBadConnection(); + return BAD_CON; + } + + modbusErrorHandle(to_rec, WRITE_COILS); + if (err) + { + return err_no; + } + return 0; + } + else + { + setBadConnection(); + return BAD_CON; + } } int ModbusBase::writeRegisters(uint16_t address, uint16_t amount, const uint16_t *value) { + if (m_connected) + { + modbusWrite(address ,amount, WRITE_REGS, value); + uint8_t to_rec[MAX_MSG_LENGTH]; + ssize_t result = modbusReceive(to_rec); + if (result == -1) + { + setBadConnection(); + return BAD_CON; + } + modbusErrorHandle(to_rec, WRITE_COILS); + if (err) + { + return err_no; + } + return 0; + } + else + { + setBadConnection(); + return BAD_CON; + } } void ModbusBase::buildRequest(uint8_t *to_send, uint16_t address, int function_code) const diff --git a/src/modbusbase.h b/src/modbusbase.h index 79949cc..9599c3b 100644 --- a/src/modbusbase.h +++ b/src/modbusbase.h @@ -111,10 +111,30 @@ public: */ int writeCoil(uint16_t address, const bool &to_write); + /*! + * Write Single Register + * MODBUS Function 0x06 + * \param address - Reference Address + * \param value - Value to Be Written to Register + */ int writeRegister(uint16_t address, const uint16_t &value); + /*! + * Write Multiple Coils + * MODBUS Function 0x0F + * \param address - Reference Address + * \param amount - Amount of coils to write + * \param value - Values to Be Written to Coils + */ int writeCoils(uint16_t address, uint16_t amount, const bool *value); + /*! + * Write Multiple Registers + * MODBUS Function 0x10 + * \param address - Reference Address + * \param amount - Amount of Value to Write + * \param value - Values to Be Written to the Registers + */ int writeRegisters(uint16_t address, uint16_t amount, const uint16_t *value); private: // Methods -- libgit2 0.21.4