#ifndef IY_MODBUS_TCP_CLIENT_H #define IY_MODBUS_TCP_CLIENT_H #include #include #include #include /** * @brief Modbus TCP 客户端虚拟接口类 * * 提供 Modbus TCP 客户端的抽象接口,隔离底层 libmodbus 依赖。 * 外部使用者只需包含此头文件,通过 CreateInstance 工厂方法创建实例。 */ class IYModbusTCPClient { public: // 连接状态枚举 enum ConnectionState { DISCONNECTED = 0, ///< 已断开连接 CONNECTING, ///< 正在连接 CONNECTED, ///< 已连接 ERROR_STATE ///< 错误状态 }; // 操作结果枚举 enum Result { SUCCESS = 0, ///< 操作成功 ERROR_CONNECTION = -1, ///< 连接错误 ERROR_INVALID_PARAM = -2, ///< 参数错误 ERROR_TIMEOUT = -3, ///< 超时错误 ERROR_DEVICE = -4, ///< 设备错误 ERROR_PROTOCOL = -5, ///< 协议错误 ERROR_UNKNOWN = -6 ///< 未知错误 }; // 连接状态变化回调函数类型 using ConnectionStateCallback = std::function; public: virtual ~IYModbusTCPClient() = default; /** * @brief 工厂方法:创建 ModbusTCPClient 实例 * @param ppClient 输出的客户端实例指针 * @param serverIP 服务器 IP 地址 * @param serverPort 服务器端口(默认 502) * @return 是否创建成功 */ static bool CreateInstance(IYModbusTCPClient** ppClient, const std::string& serverIP, int serverPort = 502); // === 连接管理 === virtual bool SetConnectionParams(const std::string& serverIP, int serverPort) = 0; virtual bool SetSlaveId(int slaveId) = 0; virtual bool SetTimeout(int timeoutMs) = 0; virtual void SetConnectionStateCallback(ConnectionStateCallback callback) = 0; virtual Result Connect() = 0; virtual void Disconnect() = 0; virtual ConnectionState GetConnectionState() const = 0; virtual bool IsConnected() const = 0; // === 读操作 === virtual Result ReadCoils(int startAddress, int quantity, std::vector& values) = 0; virtual Result ReadDiscreteInputs(int startAddress, int quantity, std::vector& values) = 0; virtual Result ReadHoldingRegisters(int startAddress, int quantity, std::vector& values) = 0; virtual Result ReadInputRegisters(int startAddress, int quantity, std::vector& values) = 0; // === 写操作 === virtual Result WriteSingleCoil(int address, bool value) = 0; virtual Result WriteSingleRegister(int address, uint16_t value) = 0; virtual Result WriteMultipleCoils(int startAddress, const std::vector& values) = 0; virtual Result WriteMultipleRegisters(int startAddress, const std::vector& values) = 0; // === 组合操作 === virtual Result ReadWriteMultipleRegisters(int readStartAddress, int readQuantity, int writeStartAddress, const std::vector& writeValues, std::vector& readValues) = 0; // === 数据类型转换辅助函数 === static uint32_t RegistersToUInt32(uint16_t high, uint16_t low); static void UInt32ToRegisters(uint32_t value, uint16_t& high, uint16_t& low); static float RegistersToFloat(uint16_t high, uint16_t low); static void FloatToRegisters(float value, uint16_t& high, uint16_t& low); // === 错误处理 === virtual std::string GetLastError() const = 0; static std::string ResultToString(Result result); static std::string ConnectionStateToString(ConnectionState state); }; #endif // IY_MODBUS_TCP_CLIENT_H