Commit a457c65874d5f8c7f1b42d9ceee7aebb484df4fb

Authored by Peter M. Groen
1 parent fac78288

Implmenting ModbusBase class

src/modbusbase.cpp
@@ -118,7 +118,7 @@ int ModbusBase::readInputRegisters(uint16_t address, uint16_t amount, uint16_t * @@ -118,7 +118,7 @@ int ModbusBase::readInputRegisters(uint16_t address, uint16_t amount, uint16_t *
118 if (m_connected) 118 if (m_connected)
119 { 119 {
120 modbusRead(address, amount, READ_INPUT_REGS); 120 modbusRead(address, amount, READ_INPUT_REGS);
121 - uint8_t to_rec[MSG_MAX_LENGTH]; 121 + uint8_t to_rec[MAX_MSG_LENGTH];
122 size_t result = modbusReceive(to_rec); 122 size_t result = modbusReceive(to_rec);
123 if (result == -1) 123 if (result == -1)
124 { 124 {
@@ -151,22 +151,116 @@ int ModbusBase::writeCoil(uint16_t address, const bool &to_write) @@ -151,22 +151,116 @@ int ModbusBase::writeCoil(uint16_t address, const bool &to_write)
151 if (m_connected) 151 if (m_connected)
152 { 152 {
153 int value = to_write * 0xFF00; 153 int value = to_write * 0xFF00;
  154 + modbusWrite(address, 1, WRITE_COIL, (uint16_t *)&value);
  155 + uint8_t to_rec[MAX_MSG_LENGTH];
  156 + ssize_t result = modbusReceive(to_rec);
  157 + if (result == -1)
  158 + {
  159 + setBadConnection();
  160 + return BAD_CON;
  161 + }
  162 +
  163 + modbusErrorHandle(to_rec, WRITE_COIL);
  164 + if (err)
  165 + {
  166 + return err_no;
  167 + }
  168 + return 0;
  169 + }
  170 + else
  171 + {
  172 + setBadConnection();
  173 + return BAD_CON;
154 } 174 }
155 } 175 }
156 176
157 int ModbusBase::writeRegister(uint16_t address, const uint16_t &value) 177 int ModbusBase::writeRegister(uint16_t address, const uint16_t &value)
158 { 178 {
  179 + if (m_connected)
  180 + {
  181 + modbusWrite(address, 1, WRITE_REG, &value);
  182 + uint8_t to_rec[MAX_MSG_LENGTH];
  183 + ssize_t result = modebusReceive(to_rec);
  184 + if (result == -1)
  185 + {
  186 + setBadConnection();
  187 + return BAD_CON;
  188 + }
159 189
  190 + modbusErrorHandle(to_rec, WRITE_COIL);
  191 + if (err)
  192 + {
  193 + return err_no;
  194 + }
  195 + return 0;
  196 + }
  197 + else
  198 + {
  199 + setBadConnection();
  200 + return BAD_CON;
  201 + }
160 } 202 }
161 203
162 int ModbusBase::writeCoils(uint16_t address, uint16_t amount, const bool *value) 204 int ModbusBase::writeCoils(uint16_t address, uint16_t amount, const bool *value)
163 { 205 {
  206 + if (m_connected)
  207 + {
  208 + uint16_t *temp = new uint16_t[amount];
  209 + for (int i = 0; i < amount; i++)
  210 + {
  211 + temp[i] = (uint16_t)value[i];
  212 + }
  213 +
  214 + modbusWrite(address, amount, WRITE_COILS, temp);
  215 + delete[] temp;
164 216
  217 + uint8_t to_rec[MAX_MSG_LENGTH];
  218 + ssize_t result = modbusReceive(to_rec);
  219 + if (result == -1)
  220 + {
  221 + setBadConnection();
  222 + return BAD_CON;
  223 + }
  224 +
  225 + modbusErrorHandle(to_rec, WRITE_COILS);
  226 + if (err)
  227 + {
  228 + return err_no;
  229 + }
  230 + return 0;
  231 + }
  232 + else
  233 + {
  234 + setBadConnection();
  235 + return BAD_CON;
  236 + }
165 } 237 }
166 238
167 int ModbusBase::writeRegisters(uint16_t address, uint16_t amount, const uint16_t *value) 239 int ModbusBase::writeRegisters(uint16_t address, uint16_t amount, const uint16_t *value)
168 { 240 {
  241 + if (m_connected)
  242 + {
  243 + modbusWrite(address ,amount, WRITE_REGS, value);
  244 + uint8_t to_rec[MAX_MSG_LENGTH];
  245 + ssize_t result = modbusReceive(to_rec);
  246 + if (result == -1)
  247 + {
  248 + setBadConnection();
  249 + return BAD_CON;
  250 + }
169 251
  252 + modbusErrorHandle(to_rec, WRITE_COILS);
  253 + if (err)
  254 + {
  255 + return err_no;
  256 + }
  257 + return 0;
  258 + }
  259 + else
  260 + {
  261 + setBadConnection();
  262 + return BAD_CON;
  263 + }
170 } 264 }
171 265
172 void ModbusBase::buildRequest(uint8_t *to_send, uint16_t address, int function_code) const 266 void ModbusBase::buildRequest(uint8_t *to_send, uint16_t address, int function_code) const
src/modbusbase.h
@@ -111,10 +111,30 @@ public: @@ -111,10 +111,30 @@ public:
111 */ 111 */
112 int writeCoil(uint16_t address, const bool &to_write); 112 int writeCoil(uint16_t address, const bool &to_write);
113 113
  114 + /*!
  115 + * Write Single Register
  116 + * MODBUS Function 0x06
  117 + * \param address - Reference Address
  118 + * \param value - Value to Be Written to Register
  119 + */
114 int writeRegister(uint16_t address, const uint16_t &value); 120 int writeRegister(uint16_t address, const uint16_t &value);
115 121
  122 + /*!
  123 + * Write Multiple Coils
  124 + * MODBUS Function 0x0F
  125 + * \param address - Reference Address
  126 + * \param amount - Amount of coils to write
  127 + * \param value - Values to Be Written to Coils
  128 + */
116 int writeCoils(uint16_t address, uint16_t amount, const bool *value); 129 int writeCoils(uint16_t address, uint16_t amount, const bool *value);
117 130
  131 + /*!
  132 + * Write Multiple Registers
  133 + * MODBUS Function 0x10
  134 + * \param address - Reference Address
  135 + * \param amount - Amount of Value to Write
  136 + * \param value - Values to Be Written to the Registers
  137 + */
118 int writeRegisters(uint16_t address, uint16_t amount, const uint16_t *value); 138 int writeRegisters(uint16_t address, uint16_t amount, const uint16_t *value);
119 139
120 private: // Methods 140 private: // Methods