- protocol/DisProtocol: 配电协议8条消息(指令0x0001~4/反馈0x0005~8, Sum8),复用pmSysvariable结构体+static_assert核对 - ChecksumPolicy 新增 Sum8;Frame 支持 1 字节校验和 - MessageRegistry 支持 (id+帧总长) 二维查找:配电指令与PM操控指令共用id按帧长区分(帧头length字段不可信) - LinkManager: 按实际帧长分发 + sendRaw原帧透传 + 非本协议帧头落库节流告警;UdpEndpoint sendTo 加锁 - comm/RcuLinkManager: 真实CCU链路;core/DisBridge: 配电桥接器(反馈转pPowerManger+解码显示,指令转真实CCU,0x0004仅显示不转发) - 网页新增"真实CCU"页签全字段展示;SnapshotBuilder realCcu 节 + rcu 链路描述 - h100.moos: 端口腾挪(真实CCU固定上报5001归pCCU,pPowerManger iport=5002),rcu_remote=192.168.0.140:7000 - 测试: pccuTest 新增配电/Sum8/长度分发/RCU注册表用例(176项);集成测试新增桥接字节一致+不误转发用例
116 lines
6.0 KiB
C++
116 lines
6.0 KiB
C++
#ifndef PCCU_DIS_PROTOCOL_H
|
||
#define PCCU_DIS_PROTOCOL_H
|
||
|
||
#include <cstdint>
|
||
#include <vector>
|
||
#include "Message.h"
|
||
#include "pmSysvariable.h"
|
||
|
||
namespace ccu {
|
||
|
||
//============================================================================
|
||
// 配电协议(配电控制器 <-> 复合管控器,经 CCU 在 PM 链路与真实 CCU 链路间桥接)
|
||
// 依据:docs/配电控制器与复合管控器的通信协议20260824.docx
|
||
// 数据结构复用 src/pPowerManger/pmSysvariable.h(pPowerManger 按同结构
|
||
// 裸解析收帧,复用可保证两侧 sizeof/字段布局完全一致)。
|
||
//
|
||
// 帧格式:0x40 0x40 + 域标识符(2B) + 域字节数(2B) + 数据域 + uint8 校验和
|
||
// 校验和 = 从域起始符到校验和之前所有数据的字节和低 8 位(Sum8)。
|
||
//
|
||
// 注意(重要):
|
||
// 配电指令 0x0001~0x0004 与 PM 协议操控/参数指令共用 id,仅能靠
|
||
// 帧总长区分(配电指令 13~21B,PM 指令 28/45B)。且 pPowerManger 发送
|
||
// 配电指令时帧头 length 字段并非总长(见 udpComm.cpp TODO),
|
||
// 分发必须用实际帧长(见 MessageRegistry::find(id, totalLength))。
|
||
//
|
||
// 八条消息(均 Sum8 校验):
|
||
// 指令(pPowerManger -> CCU -> 真实CCU) payload 总长
|
||
// 0x0001 高压母线配电指令 disHighVolBusCmd 14B 21B
|
||
// 0x0002 高压母线A配电指令 disHighAVolBusCmd 6B 13B
|
||
// 0x0003 低压主母线配电指令 disLowMainBusCmd 7B 14B
|
||
// 0x0004 仪表汇流排配电指令 disLowBusCmd 8B 15B
|
||
// 反馈(真实CCU -> CCU -> pPowerManger)
|
||
// 0x0005 高压母线配电反馈 disHighVolBusState 53B 60B
|
||
// 0x0006 高压母线A配电反馈 disHighAVolBusState 25B 32B
|
||
// 0x0007 低压主母线配电反馈 disLowMainBusState 34B 41B
|
||
// 0x0008 仪表汇流排配电反馈 disLowBusState 29B 36B
|
||
// (payload/总长由 static_assert 在编译期核对,见 DisProtocol.cpp)
|
||
//============================================================================
|
||
|
||
enum : uint16_t {
|
||
DIS_HV_CMD_ID = 0x0001, // 高压母线配电指令
|
||
DIS_HVA_CMD_ID = 0x0002, // 高压母线A配电指令
|
||
DIS_HVB_CMD_ID = 0x0003, // 低压主母线配电指令
|
||
DIS_LV_CMD_ID = 0x0004, // 仪表汇流排配电指令
|
||
DIS_HV_FB_ID = 0x0005, // 高压母线配电反馈
|
||
DIS_HVA_FB_ID = 0x0006, // 高压母线A配电反馈
|
||
DIS_HVB_FB_ID = 0x0007, // 低压主母线配电反馈
|
||
DIS_LV_FB_ID = 0x0008, // 仪表汇流排配电反馈
|
||
};
|
||
|
||
// 断路器/开关类指令与状态值
|
||
enum : uint8_t {
|
||
DIS_BREAKER_ON = 0x55, // 闭合
|
||
DIS_BREAKER_OFF = 0xAA, // 断开
|
||
DIS_BREAKER_FLT = 0x5A, // 故障脱扣
|
||
};
|
||
|
||
// 判断是否配电协议消息(指令或反馈),桥接器据此识别
|
||
bool isDisMessage(const Message* msg);
|
||
bool isDisCmdMessage(const Message* msg);
|
||
bool isDisFbMessage(const Message* msg);
|
||
|
||
//--------------------------------------------------------------------------
|
||
// 指令消息(pPowerManger 下发,pCCU 原帧转发给真实CCU)
|
||
//--------------------------------------------------------------------------
|
||
|
||
#define PCCU_DIS_MSG_CLASS(clsName, msgId, msgName, dataT) \
|
||
class clsName : public Message { \
|
||
public: \
|
||
uint16_t id() const override { return msgId; } \
|
||
const char* name() const override { return msgName; } \
|
||
const ChecksumPolicy& checksum() const override { return m_checksum; } \
|
||
size_t payloadLength() const override { return sizeof(dataT); } \
|
||
std::vector<uint8_t> encode(const void* obj) const override; \
|
||
bool decode(const std::vector<uint8_t>& frame, void* obj) const override; \
|
||
std::vector<uint8_t> encode(const dataT& v) const { return encode(&v); } \
|
||
bool decode(const std::vector<uint8_t>& frame, dataT& v) const { \
|
||
return decode(frame, static_cast<void*>(&v)); \
|
||
} \
|
||
private: \
|
||
ChecksumPolicy m_checksum{ChecksumType::Sum8}; \
|
||
}
|
||
|
||
// 高压母线配电指令(0x0001)
|
||
PCCU_DIS_MSG_CLASS(DisHighVolBusCmdMessage, DIS_HV_CMD_ID, "dis_hv_cmd", disHighVolBusCmd);
|
||
// 高压母线A配电指令(0x0002)
|
||
PCCU_DIS_MSG_CLASS(DisHighAVolBusCmdMessage, DIS_HVA_CMD_ID, "dis_hva_cmd", disHighAVolBusCmd);
|
||
// 低压主母线配电指令(0x0003)
|
||
PCCU_DIS_MSG_CLASS(DisHighBVolBusCmdMessage, DIS_HVB_CMD_ID, "dis_hvb_cmd", disLowMainBusCmd);
|
||
// 仪表汇流排配电指令(0x0004)
|
||
PCCU_DIS_MSG_CLASS(DisLowBusCmdMessage, DIS_LV_CMD_ID, "dis_lv_cmd", disLowBusCmd);
|
||
|
||
//--------------------------------------------------------------------------
|
||
// 反馈消息(真实CCU 上报,pCCU 原帧转发给 pPowerManger 并解码显示)
|
||
//--------------------------------------------------------------------------
|
||
|
||
// 高压母线配电反馈(0x0005)
|
||
PCCU_DIS_MSG_CLASS(DisHighVolBusFbMessage, DIS_HV_FB_ID, "dis_hv_fb", disHighVolBusState);
|
||
// 高压母线A配电反馈(0x0006)
|
||
PCCU_DIS_MSG_CLASS(DisHighAVolBusFbMessage, DIS_HVA_FB_ID, "dis_hva_fb", disHighAVolBusState);
|
||
// 低压主母线配电反馈(0x0007)
|
||
PCCU_DIS_MSG_CLASS(DisHighBVolBusFbMessage, DIS_HVB_FB_ID, "dis_hvb_fb", disLowMainBusState);
|
||
// 仪表汇流排配电反馈(0x0008)
|
||
PCCU_DIS_MSG_CLASS(DisLowBusFbMessage, DIS_LV_FB_ID, "dis_lv_fb", disLowBusState);
|
||
|
||
#undef PCCU_DIS_MSG_CLASS
|
||
|
||
// 注册配电指令消息(PM 链路用:识别 pPowerManger 下发的配电指令)
|
||
void registerDisCmdMessages(class MessageRegistry& reg);
|
||
// 注册配电反馈消息(RCU 链路用:识别真实CCU 上报的配电反馈)
|
||
void registerDisFbMessages(class MessageRegistry& reg);
|
||
|
||
} // namespace ccu
|
||
|
||
#endif // PCCU_DIS_PROTOCOL_H
|