GrabBag/Module/ModbusTCPClient/Inc/IYModbusTCPClient.h
2026-02-01 14:51:16 +08:00

100 lines
3.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef IY_MODBUS_TCP_CLIENT_H
#define IY_MODBUS_TCP_CLIENT_H
#include <string>
#include <vector>
#include <functional>
#include <cstdint>
/**
* @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<void(ConnectionState oldState, ConnectionState newState, const std::string& message)>;
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<bool>& values) = 0;
virtual Result ReadDiscreteInputs(int startAddress, int quantity, std::vector<bool>& values) = 0;
virtual Result ReadHoldingRegisters(int startAddress, int quantity, std::vector<uint16_t>& values) = 0;
virtual Result ReadInputRegisters(int startAddress, int quantity, std::vector<uint16_t>& 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<bool>& values) = 0;
virtual Result WriteMultipleRegisters(int startAddress, const std::vector<uint16_t>& values) = 0;
// === 组合操作 ===
virtual Result ReadWriteMultipleRegisters(int readStartAddress, int readQuantity,
int writeStartAddress, const std::vector<uint16_t>& writeValues,
std::vector<uint16_t>& 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