From 0be34396769060a0e880a09c274728b73ada88f4 Mon Sep 17 00:00:00 2001 From: Peter M. Groen Date: Tue, 15 Nov 2022 01:15:37 +0100 Subject: [PATCH] Implmenting ModbusBase class --- src/connectionconfig.cpp | 8 ++++++++ src/connectionconfig.h | 2 +- src/modbusbase.h | 35 +++++++++++++++++++++++------------ src/modbusrtu.cpp | 20 ++++++++++++++++++++ src/modbusrtu.h | 28 ++++++++++++++++++++++++++++ src/modbustcp.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/modbustcp.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 189 insertions(+), 15 deletions(-) diff --git a/src/connectionconfig.cpp b/src/connectionconfig.cpp index 46376c0..8756b78 100644 --- a/src/connectionconfig.cpp +++ b/src/connectionconfig.cpp @@ -4,3 +4,11 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ +#include "connectionconfig.h" + +using namespace osdev::components::modbus; + +ConnectionConfig::ConnectionConfig() +{ + +} diff --git a/src/connectionconfig.h b/src/connectionconfig.h index 25c8a67..ccdf00c 100644 --- a/src/connectionconfig.h +++ b/src/connectionconfig.h @@ -13,7 +13,7 @@ namespace modbus { class ConnectionConfig { public: - ConnectionConfig + ConnectionConfig(); }; } // End namespace modbus diff --git a/src/modbusbase.h b/src/modbusbase.h index 493c459..da250fe 100644 --- a/src/modbusbase.h +++ b/src/modbusbase.h @@ -6,7 +6,9 @@ */ #pragma once +#include #include +#include // Create a simple logger for console output during debugging. // TODO: Replace with a custom logger by using std::function @@ -54,23 +56,12 @@ namespace modbus { class ModbusBase { public: - bool err{}; - int err_no{}; - std::string m_error_msg; - ModbusBase(); virtual ~ModbusBase(); - /*! - * Set slave id for this context - * \param slave_id - The slave id this system is known under. - */ - void setSlaveId(int slave_id) { m_slaveId = slave_id; } - // Pure virtuals. Override when inherited. - virtual bool Connect() const = 0; + virtual bool Connect() = 0; virtual void Close() = 0; - virtual bool isConnected() const = 0; // Modbus implementation(s) /*! @@ -143,6 +134,23 @@ public: */ int writeRegisters(uint16_t address, uint16_t amount, const uint16_t *value); + // Getters and Setters. + void setConnected(bool connected = false){ m_connected = connected;} + bool getConnected() const { return m_connected; } + void setMessageId( uint32_t message_id ) { m_msg_id = message_id; } + uint32_t getMessageId() const { return m_msg_id; } + void setSlaveId(int slave_id){ m_slaveId = slave_id; } + int getSlaveId() const { return m_slaveId; } + void setError(bool error, int error_number = 0, const std::string &error_message = std::string()) + { + m_error = error; + m_error_number = error_number; + m_error_message = error_message; + } + bool getError() const { return m_error; } + int getErrorNumber() const { return m_error_number; } + std::string getErrorMessage() const { return m_error_message;} + private: // Methods /*! * Modbus Request Builder @@ -201,6 +209,9 @@ private: // Members (Giggity!) bool m_connected{}; uint32_t m_msg_id{}; int m_slaveId{}; + bool m_error{}; + int m_error_number{}; + std::string m_error_message; }; diff --git a/src/modbusrtu.cpp b/src/modbusrtu.cpp index 1dce690..2656c1d 100644 --- a/src/modbusrtu.cpp +++ b/src/modbusrtu.cpp @@ -12,3 +12,23 @@ ModbusRTU::ModbusRTU() { } + +bool ModbusRTU::Connect() +{ + +} + +void ModbusRTU::Close() +{ + +} + +ssize_t ModbusRTU::modbusSend(uint8_t *to_send, size_t length) +{ + +} + +ssize_t ModbusRTU::modbusReceive(uint8_t *buffer) const +{ + +} diff --git a/src/modbusrtu.h b/src/modbusrtu.h index fd874f8..393098a 100644 --- a/src/modbusrtu.h +++ b/src/modbusrtu.h @@ -16,6 +16,34 @@ class ModbusRTU : public ModbusBase { public: ModbusRTU(); + + // Pure virtuals. Override when inherited. + /*! + * \brief Connect + * \return + */ + virtual bool Connect() override; + + /*! + * \brief Close + */ + virtual void Close() override; + +private: + /*! + * \brief modbusSend + * \param to_send + * \param length + * \return + */ + virtual ssize_t modbusSend(uint8_t *to_send, size_t length) override; + + /*! + * \brief modbusReceive + * \param buffer + * \return + */ + virtual ssize_t modbusReceive(uint8_t *buffer) const override; }; } // End namespace modbus diff --git a/src/modbustcp.cpp b/src/modbustcp.cpp index 07df664..e84e237 100644 --- a/src/modbustcp.cpp +++ b/src/modbustcp.cpp @@ -8,7 +8,62 @@ using namespace osdev::components::modbus; -ModbusTCP::ModbusTCP() +ModbusTCP::ModbusTCP(const ConnectionConfig &port_configuration) +{ + +} + +bool ModbusTCP::Connect() +{ + if(m_host.empty() || m_port == 0) + { + LOG("Missing host and port"); + return false; + } + + m_socket = socket(AF_INET, SOCK_STREAM, 0); + if(!X_ISVALIDSOCKET(m_socket)) + { + LOG("Errror Opening Socket"); + return false; + } + + struct timeval timeout {}; + timeout.tv_sec = 20; // After 20 seconds connect() will timeout + timeout.tv_usec = 0; + + setsockopt(m_socket, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast(&timeout), sizeof(timeout)); + setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast(&timeout), sizeof(timeout)); + m_server.sin_family = AF_INET; + m_server.sin_addr.s_addr = inet_addr(m_host.c_str()); + m_server.sin_port = htons(m_port); + + if(!X_ISCONNECTSUCCEED(connect(m_socket, reinterpret_cast(&m_server), sizeof(m_server)))) + { + LOG("Connection Error"); + return false; + } + + ModbusBase::setConnected(true); + return true; +} + +void ModbusTCP::Close() +{ + +} + +bool ModbusTCP::isConnected() const +{ + +} + +ssize_t ModbusTCP::modbusSend(uint8_t *to_send, size_t length) +{ + +} + +ssize_t ModbusTCP::modbusReceive(uint8_t *buffer) const { } diff --git a/src/modbustcp.h b/src/modbustcp.h index cbf3acf..1e2fc83 100644 --- a/src/modbustcp.h +++ b/src/modbustcp.h @@ -7,15 +7,67 @@ #pragma once #include "modbusbase.h" +#include "connectionconfig.h" + +#include +#include +#include +#include namespace osdev { namespace components { namespace modbus { +using X_SOCKET = int; +using SOCKADDR = struct sockaddr; +using SOCKADDR_IN = struct sockaddr_in; + +#define X_ISVALIDSOCKET(s) ((s) >= 0) +#define X_CLOSE_SOCKET(s) close(s) +#define X_ISCONNECTSUCCEED(s) ((s) >= 0) + class ModbusTCP : public ModbusBase { public: - ModbusTCP(); + /*! + * \brief ModbusTCP + * \param port_configuration + */ + ModbusTCP(const ConnectionConfig &port_configuration); + + // Pure virtuals. Override when inherited. + /*! + * \brief Connect + * \return + */ + virtual bool Connect() override; + + /*! + * \brief Close + */ + virtual void Close() override; + +private: // Methods + /*! + * \brief modbusSend + * \param to_send + * \param length + * \return + */ + virtual ssize_t modbusSend(uint8_t *to_send, size_t length) override; + + /*! + * \brief modbusReceive + * \param buffer + * \return + */ + virtual ssize_t modbusReceive(uint8_t *buffer) const override; + +private: // Members + uint16_t m_port {}; + std::string m_host; + X_SOCKET m_socket{}; + SOCKADDR_IN m_server{}; }; } // End namespace modbus -- libgit2 0.21.4