50 lines
1.4 KiB
C
50 lines
1.4 KiB
C
|
|
// 文件名: 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
|