diff --git a/src/connectionconfig.h b/src/connectionconfig.h index ccdf00c..8f62074 100644 --- a/src/connectionconfig.h +++ b/src/connectionconfig.h @@ -6,6 +6,8 @@ */ #pragma once +#include + namespace osdev { namespace components { namespace modbus { @@ -13,7 +15,53 @@ namespace modbus { class ConnectionConfig { public: + enum class E_CONNECTIONTYPE + { + SERIAL, + TCP, + UNKNOWN + }; + + enum class E_PARITY + { + ODD, + EVEN, + NONE + }; + + enum class E_BAUDRATE + { + R1200 = 1200, + R2400 = 2400, + R4800 = 4800, + R9600 = 9600, + R19200 = 19200, + R38400 = 38400, + R57600 = 57600, + R76800 = 76800, + R115200 = 115200 + }; + ConnectionConfig(); + + // Getters and Setters + void setConnectionType( E_CONNECTIONTYPE type ) { m_conType = type; } + E_CONNECTIONTYPE getConnectionType() const { return m_conType; } + void setBaudRate( E_BAUDRATE baud_rate ) { m_baudRate = baud_rate; } + E_BAUDRATE getBaudRate() const { return m_baudRate; } + void setParity(E_PARITY parity) { m_parity = parity; } + E_PARITY getParity() const { return m_parity; } + +private: + E_CONNECTIONTYPE m_conType = E_CONNECTIONTYPE::UNKNOWN; + E_BAUDRATE m_baudRate = E_BAUDRATE::R9600; + E_PARITY m_parity = E_PARITY::NONE; + int m_dataBits = 8; + int m_stopBits = 1; + std::string m_ipAddress{}; + unsigned int m_portNUmber = 502; + int m_frameTimeOut = -1; + }; } // End namespace modbus diff --git a/src/modbusbase.cpp b/src/modbusbase.cpp index ae0a36b..e680b58 100644 --- a/src/modbusbase.cpp +++ b/src/modbusbase.cpp @@ -20,7 +20,7 @@ int ModbusBase::readCoils(uint16_t address, uint16_t amount, bool *buffer) } modbusRead(address, amount, READ_COILS); - uint8_t to_rec[m_max_message_length]; + uint8_t *to_rec = new uint8_t[m_max_message_length]; ssize_t result = modbusReceive(to_rec); if (result == -1) { @@ -58,7 +58,7 @@ int ModbusBase::readInputBits(uint16_t address, uint16_t amount, bool *buffer) } modbusRead(address, amount, READ_INPUT_BITS); - uint8_t to_rec[m_max_message_length]; + uint8_t *to_rec = new uint8_t[m_max_message_length]; ssize_t result = modbusReceive(to_rec); if (result == -1) { @@ -89,7 +89,7 @@ int ModbusBase::readHoldingRegisters(uint16_t address, uint16_t amount, uint16_t if (m_connected) { modbusRead(address, amount, READ_REGS); - uint8_t to_rec[m_max_message_length]; // <-- Transport layer dependent .. ? + uint8_t *to_rec = new uint8_t[m_max_message_length]; ssize_t result = modbusReceive(to_rec); if (result == -1) { @@ -120,7 +120,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[m_max_message_length]; + uint8_t *to_rec = new uint8_t[m_max_message_length]; ssize_t result = modbusReceive(to_rec); if (result == -1) { @@ -154,7 +154,7 @@ int ModbusBase::writeCoil(uint16_t address, const bool &to_write) { int value = to_write * 0xFF00; modbusWrite(address, 1, WRITE_COIL, reinterpret_cast(&value)); - uint8_t to_rec[m_max_message_length]; + uint8_t *to_rec = new uint8_t[m_max_message_length]; ssize_t result = modbusReceive(to_rec); if (result == -1) { @@ -181,7 +181,7 @@ int ModbusBase::writeRegister(uint16_t address, const uint16_t &value) if (m_connected) { modbusWrite(address, 1, WRITE_REG, &value); - uint8_t to_rec[m_max_message_length]; + uint8_t *to_rec = new uint8_t[m_max_message_length]; ssize_t result = modbusReceive(to_rec); if (result == -1) { @@ -216,7 +216,7 @@ int ModbusBase::writeCoils(uint16_t address, uint16_t amount, const bool *value) modbusWrite(address, amount, WRITE_COILS, temp); delete[] temp; - uint8_t to_rec[m_max_message_length]; + uint8_t *to_rec = new uint8_t[m_max_message_length]; ssize_t result = modbusReceive(to_rec); if (result == -1) { @@ -243,7 +243,7 @@ int ModbusBase::writeRegisters(uint16_t address, uint16_t amount, const uint16_t if (m_connected) { modbusWrite(address ,amount, WRITE_REGS, value); - uint8_t to_rec[MAX_MSG_LENGTH]; + uint8_t *to_rec = new uint8_t[m_max_message_length]; ssize_t result = modbusReceive(to_rec); if (result == -1) { diff --git a/src/modbustcp.cpp b/src/modbustcp.cpp index 7ad285f..0af8167 100644 --- a/src/modbustcp.cpp +++ b/src/modbustcp.cpp @@ -10,7 +10,7 @@ using namespace osdev::components::modbus; ModbusTCP::ModbusTCP(const ConnectionConfig &port_configuration) { - + setMaxMessageLength(260); // Maximum Messagelength over TCP } bool ModbusTCP::Connect() diff --git a/src/modbustcp.h b/src/modbustcp.h index 1e2fc83..567a809 100644 --- a/src/modbustcp.h +++ b/src/modbustcp.h @@ -26,6 +26,9 @@ using SOCKADDR_IN = struct sockaddr_in; #define X_CLOSE_SOCKET(s) close(s) #define X_ISCONNECTSUCCEED(s) ((s) >= 0) +/*! + * \brief The ModbusTCP class + */ class ModbusTCP : public ModbusBase { public: @@ -65,7 +68,7 @@ private: // Methods private: // Members uint16_t m_port {}; - std::string m_host; + std::string m_host{}; X_SOCKET m_socket{}; SOCKADDR_IN m_server{}; };