diff --git a/src/modbus.h b/src/modbus.h index aae2635..e1a33ce 100644 --- a/src/modbus.h +++ b/src/modbus.h @@ -7,6 +7,8 @@ #pragma once #include "imodbus.h" +#include "modbusbase.h" +#include namespace osdev { namespace components { @@ -19,10 +21,14 @@ public: virtual ~ModBus() {} + // Implementation virtual bool Open(const ConnectionConfig &connection_config) override; virtual bool Close() override; virtual std::vector Read(const Request &request) override; virtual std::vector Write(const Request &request) override; + +private: + std::unique_ptr m_modbus; }; } /* End namespace modbus */ diff --git a/src/modbustcp.cpp b/src/modbustcp.cpp index d07e3b6..8ee2bcf 100644 --- a/src/modbustcp.cpp +++ b/src/modbustcp.cpp @@ -6,6 +6,8 @@ */ #include "modbustcp.h" +#include + using namespace osdev::components::modbus; ModbusTcp::ModbusTcp(const ConnectionConfig &con_config) @@ -44,9 +46,13 @@ bool ModbusTcp::Connect() timeout.tv_sec = 20; // after 20 seconds connect() will timeout timeout.tv_usec = 0; + // Set the socket options.. + int l_flag = 1; setsockopt(m_socket, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast(&timeout), sizeof(timeout)); setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast(&timeout), sizeof(timeout)); + setsockopt(m_socket, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&l_flag), sizeof(int)); + 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);