GrabBag/Module/ModbusTCPClient/Inc/IYModbusTCPClient.h

100 lines
3.9 KiB
C
Raw Normal View History

2026-02-01 14:51:16 +08:00
#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