#ifndef PCCU_DIS_PROTOCOL_H #define PCCU_DIS_PROTOCOL_H #include #include #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 encode(const void* obj) const override; \ bool decode(const std::vector& frame, void* obj) const override; \ std::vector encode(const dataT& v) const { return encode(&v); } \ bool decode(const std::vector& frame, dataT& v) const { \ return decode(frame, static_cast(&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