57 lines
2.0 KiB
C++
57 lines
2.0 KiB
C++
#pragma once
|
||
|
||
#include "line_laser_modbus/device.hpp"
|
||
|
||
namespace line_laser_modbus {
|
||
|
||
// 板卡运动控制适配接口。
|
||
//
|
||
// 迁移到真实驱动板时,协议库不需要知道具体轴控、插补、报警和坐标系实现。
|
||
// 板卡侧只要实现这个接口,MotionControlBridge 就能把 Modbus 寄存器协议和
|
||
// 真实运动控制模块连接起来。
|
||
class MotionControlAdapter {
|
||
public:
|
||
virtual ~MotionControlAdapter() = default;
|
||
|
||
// 上位机写入 0xD000 模式命令字,并且 DeviceServer 已确认该模式合法后调用。
|
||
virtual void on_mode_changed(WorkMode mode) = 0;
|
||
|
||
// 上位机写入 0xD020 ~ 0xD02D 目标示教位姿后调用。
|
||
virtual void on_target_pose(const Pose6D& pose) = 0;
|
||
|
||
// 上位机写入 0xD036 ~ 0xD043 六轴纠偏量后调用。
|
||
virtual void on_correction(const Pose6D& correction) = 0;
|
||
|
||
// 返回板卡当前实际位姿。桥接层会把它写入 0xD00A ~ 0xD017。
|
||
[[nodiscard]] virtual Pose6D current_pose() const = 0;
|
||
|
||
// 返回板卡当前设备状态。桥接层会把它写入 0xD001。
|
||
[[nodiscard]] virtual DeviceState current_state() const = 0;
|
||
};
|
||
|
||
// 协议服务器与板卡运动控制之间的桥接器。
|
||
//
|
||
// 固件主循环可以直接调用 process_request():
|
||
// 1. 先把板卡实时反馈发布到 RegisterBank;
|
||
// 2. 调用 DeviceServer 处理 RTU 请求;
|
||
// 3. 如果本帧是合法写请求,则把写入结果回调给 MotionControlAdapter。
|
||
class MotionControlBridge {
|
||
public:
|
||
MotionControlBridge(DeviceServer& server, MotionControlAdapter& adapter) noexcept;
|
||
|
||
[[nodiscard]] ByteVector process_request(const ByteVector& request);
|
||
|
||
// 没有上位机请求时,也可以周期调用该函数刷新当前位姿和状态寄存器。
|
||
void publish_feedback();
|
||
|
||
private:
|
||
[[nodiscard]] bool write_ack_matches(const ByteVector& response,
|
||
const WriteRequest& request) const;
|
||
void notify_adapter_for_write(const WriteRequest& request);
|
||
|
||
DeviceServer& server_;
|
||
MotionControlAdapter& adapter_;
|
||
};
|
||
|
||
} // 命名空间 line_laser_modbus
|