GrabBag/Module/ModbusTCPClient/_Inc/ModbusTCPClient.h

118 lines
4.1 KiB
C
Raw Normal View History

2026-02-01 14:51:16 +08:00
#ifndef MODBUS_TCP_CLIENT_H
#define MODBUS_TCP_CLIENT_H
#include "IYModbusTCPClient.h"
#include <memory>
#include <mutex>
#include <atomic>
extern "C" {
#include "modbus.h"
}
/**
* @brief Modbus TCP libmodbus
*
* Modbus TCP
* -
* - Modbus
* -
* -
*/
class ModbusTCPClient : public IYModbusTCPClient {
public:
/**
* @brief
* @param serverIP IP
* @param serverPort 502
*/
ModbusTCPClient(const std::string& serverIP, int serverPort = 502);
/**
* @brief
*/
virtual ~ModbusTCPClient() override;
// 禁用拷贝构造和赋值
ModbusTCPClient(const ModbusTCPClient&) = delete;
ModbusTCPClient& operator=(const ModbusTCPClient&) = delete;
// === 实现 IYModbusTCPClient 接口 ===
virtual bool SetConnectionParams(const std::string& serverIP, int serverPort) override;
virtual bool SetSlaveId(int slaveId) override;
virtual bool SetTimeout(int timeoutMs) override;
virtual void SetConnectionStateCallback(ConnectionStateCallback callback) override;
virtual Result Connect() override;
virtual void Disconnect() override;
virtual ConnectionState GetConnectionState() const override;
virtual bool IsConnected() const override;
// === 读操作 ===
virtual Result ReadCoils(int startAddress, int quantity, std::vector<bool>& values) override;
virtual Result ReadDiscreteInputs(int startAddress, int quantity, std::vector<bool>& values) override;
virtual Result ReadHoldingRegisters(int startAddress, int quantity, std::vector<uint16_t>& values) override;
virtual Result ReadInputRegisters(int startAddress, int quantity, std::vector<uint16_t>& values) override;
// === 写操作 ===
virtual Result WriteSingleCoil(int address, bool value) override;
virtual Result WriteSingleRegister(int address, uint16_t value) override;
virtual Result WriteMultipleCoils(int startAddress, const std::vector<bool>& values) override;
virtual Result WriteMultipleRegisters(int startAddress, const std::vector<uint16_t>& values) override;
// === 组合操作 ===
virtual Result ReadWriteMultipleRegisters(int readStartAddress, int readQuantity,
int writeStartAddress, const std::vector<uint16_t>& writeValues,
std::vector<uint16_t>& readValues) override;
// === 错误处理 ===
virtual std::string GetLastError() const override;
private:
/**
* @brief
* @param newState
* @param message
*/
void SetConnectionState(ConnectionState newState, const std::string& message = "");
/**
* @brief modbus
* @return
*/
bool IsModbusContextValid() const;
/**
* @brief libmodbus Result
* @return
*/
Result ConvertLibmodbusError() const;
/**
* @brief
* @param error
*/
void SetLastError(const std::string& error);
private:
modbus_t* m_modbusContext; ///< libmodbus 上下文
std::string m_serverIP; ///< 服务器 IP 地址
int m_serverPort; ///< 服务器端口
int m_slaveId; ///< 从站 ID
int m_timeoutMs; ///< 超时时间(毫秒)
std::atomic<ConnectionState> m_connectionState; ///< 连接状态
ConnectionStateCallback m_stateCallback; ///< 状态变化回调
mutable std::mutex m_mutex; ///< 互斥锁
std::string m_lastError; ///< 最后错误信息
};
#endif // MODBUS_TCP_CLIENT_H