bonus-edge-proxy/src/modbus/modbus_master_poller.h

50 lines
1.4 KiB
C
Raw Normal View History

// 文件名: src/modbus/modbus_master_poller.h
#ifndef MODBUS_MASTER_POLLER_H
#define MODBUS_MASTER_POLLER_H
#include "protocol/iprotocol_adapter.h" // For UnifiedData and ReportDataCallback
#include <boost/asio.hpp>
#include <memory>
#include <string>
// 配置一个Modbus设备的连接和轮询参数
struct ModbusDeviceConfig {
std::string device_id; // 自定义设备ID用于MQTT主题
std::string ip_address;
uint16_t port;
uint8_t slave_id;
uint16_t start_address;
uint16_t quantity;
int poll_interval_ms;
};
class ModbusMasterPoller : public std::enable_shared_from_this<ModbusMasterPoller> {
public:
ModbusMasterPoller(boost::asio::io_context& io_context,
ModbusDeviceConfig config,
ReportDataCallback report_cb);
// 开始轮询器的工作 (连接和定时)
void start();
private:
void do_connect();
void do_poll();
void do_write();
void do_read_header();
void do_read_pdu(std::size_t pdu_length);
void on_error(const std::string& stage);
boost::asio::io_context& m_io_context;
boost::asio::ip::tcp::socket m_socket;
boost::asio::steady_timer m_timer;
ModbusDeviceConfig m_config;
ReportDataCallback m_report_callback;
std::vector<uint8_t> m_write_buffer;
std::array<uint8_t, 260> m_read_buffer; // Max Modbus TCP frame size
uint16_t m_transaction_id = 0;
};
#endif // MODBUS_MASTER_POLLER_H