build-test-deploy / ci (push) Successful in 1h13m13s
FC协议(0827 docx): - 控制指令域:字节12,13/16,17由纵倾/横倾姿态数据2改为预留(编码恒0、解码忽略) - 状态反馈域:字节147,148由预留12改为剩余发电量(MWh),贯通JSON/网页显示 - PM→CCU链路:姿态字段4xuchar改为2xshort(数据1),结构体大小与线上布局不变 - 同步更新:CCU转发映射、SnapshotBuilder、pCCU网页、fuelcell网页、SQLite列描述、单测/模拟器 - 修正集成测试遗留断言(20B→24B、心跳d[19]→d[23])并增强预留字节校验 CCU地址可配置: - pPowerManger 支持 moos 配置项 ccuhost/ccuport(默认127.0.0.1:7000) - build-board.sh 增加 --ccu-host/--ccu-port 参数 文档:FC协议文档更新为0827版,清理过期协议docx
179 lines
9.5 KiB
C++
179 lines
9.5 KiB
C++
#ifndef PCCU_FC_PROTOCOL_H
|
||
#define PCCU_FC_PROTOCOL_H
|
||
|
||
#include <cstdint>
|
||
#include <vector>
|
||
#include <memory>
|
||
#include "Message.h"
|
||
|
||
namespace ccu {
|
||
|
||
//============================================================================
|
||
// FC 协议(燃料电池系统 <-> 复合管控器)
|
||
// 依据:docs/超滑FC和复合管控器通讯协议 - 0827.docx
|
||
//
|
||
// 帧格式统一:0x40 0x40 + 域标识符(2B) + 域字节数(2B) + 数据域 + [校验和]
|
||
// 注意:FC 协议文档未列出校验和行,故默认采用 None(可插拔,联调可切换)。
|
||
//
|
||
// 两条消息:
|
||
// 0x0001 复合管控器->燃料电池控制器(控制指令域) payload 18B,总长 24B
|
||
// 0x0002 燃料电池控制器->复合管控器(状态反馈域) payload 144B,总长 150B
|
||
//============================================================================
|
||
|
||
//--------------------------------------------------------------------------
|
||
// 0x0001 控制指令域(复合管控器 -> 燃料电池)
|
||
// payload 18 字节,对应文档字节 7~24
|
||
//--------------------------------------------------------------------------
|
||
struct FcControlValue {
|
||
uint8_t mode = 0; // 模式设定 00~03
|
||
uint8_t cmd = 0; // 操控指令 00~0B
|
||
uint8_t outputPower = 0; // 输出功率指令 0~250,分辨率0.1kW
|
||
int16_t pitch1 = 0; // 纵倾姿态数据1 int16,分辨率0.1°(字节10,11)
|
||
uint16_t reserved1 = 0; // 预留(字节12,13),0827协议由纵倾姿态数据2改为预留
|
||
int16_t roll1 = 0; // 横倾姿态数据1 int16,分辨率0.1°(字节14,15)
|
||
uint16_t reserved2 = 0; // 预留(字节16,17),0827协议由横倾姿态数据2改为预留
|
||
uint8_t emergencyAllow = 0; // 应急允许:Bit0 允许降载 / Bit1 允许排气(字节18)
|
||
uint16_t depth = 0; // 潜深深度,单位 m(字节19,20)
|
||
uint8_t supplyCmd = 0; // 补给/排放指令 00~0B(字节21)
|
||
uint8_t reservedCmd5 = 0; // 预留指令5(字节22)
|
||
uint8_t reservedCmd6 = 0; // 预留指令6(字节23)
|
||
uint8_t heartbeat = 0; // 通信心跳,每次+1(字节24)
|
||
};
|
||
|
||
//--------------------------------------------------------------------------
|
||
// 0x0002 状态反馈域(燃料电池 -> 复合管控器)
|
||
// payload 144 字节,对应文档字节 7~150
|
||
//--------------------------------------------------------------------------
|
||
struct FcStatusValue {
|
||
uint8_t fc_mode = 0; // 燃料电池系统运行模式
|
||
uint8_t fc_status = 0; // 燃料电池系统运行状态
|
||
uint16_t fault_level_1 = 0; // 一级故障码
|
||
uint16_t fault_level_2 = 0; // 二级故障码
|
||
uint16_t fault_level_3 = 0; // 三级故障码
|
||
uint16_t fault_level_4 = 0; // 四级故障码
|
||
uint16_t total_generation_time = 0;// 累积发电时间,0.1h
|
||
uint8_t fc_fault_level = 0; // 系统故障等级 00~04
|
||
uint16_t generation_power = 0; // 系统发电功率,0.01kW
|
||
uint8_t hydrogen_capacity = 0; // 储氢剩余容量 %
|
||
uint8_t liquid_oxygen_capacity = 0; // 液氧剩余容量 %
|
||
|
||
uint8_t fc1_min_cell_voltage = 0; // I#FC最低单片电压,10mV
|
||
uint8_t fc1_min_cell_pos = 0; // I#FC最低单片电压位置
|
||
uint8_t fc1_avg_cell_voltage = 0; // I#FC平均单片电压,10mV
|
||
uint8_t fc2_min_cell_voltage = 0; // 2#FC最低单片电压
|
||
uint8_t fc2_min_cell_pos = 0; // 2#FC最低单片电压位置
|
||
uint8_t fc2_avg_cell_voltage = 0; // 2#FC平均单片电压
|
||
|
||
uint16_t palladium_temp = 0; // 甲醇制氢装置钯膜最高温度,0.1℃
|
||
uint16_t buffer_tank_pressure = 0; // 缓冲罐压力,0.1kPa
|
||
uint16_t flue_total_emission = 0; // 烟气累计排放量,0.1kg
|
||
uint16_t flue_pressure = 0; // 烟气压力,0.001MPa
|
||
uint16_t reactor_pressure = 0; // 反应器压力,0.001MPa
|
||
uint16_t electric_valve_open = 0; // 电动阀开度,0.1%
|
||
|
||
uint16_t dcdc1_in_voltage = 0; // DC/DC通道1输入电压,0.1V
|
||
uint16_t dcdc1_in_current = 0; // DC/DC通道1输入电流,0.1A
|
||
uint16_t dcdc2_in_voltage = 0; // DC/DC通道2输入电压,0.1V
|
||
uint16_t dcdc2_in_current = 0; // DC/DC通道2输入电流,0.1A
|
||
uint16_t dcdc_out_voltage = 0; // DC/DC输出电压,0.1V
|
||
uint16_t dcdc_out_current = 0; // DC/DC输出电流,0.1A
|
||
uint8_t dcdc_ctrl_voltage = 0; // DC/DC控制电源电压,0.25V
|
||
uint8_t dcdc_aux_voltage = 0; // DC/DC辅电输出电压,0.125V
|
||
|
||
uint16_t methanol_total_use = 0; // 甲醇累计使用量,0.1kg
|
||
uint16_t methanol_feed = 0; // 甲醇溶液进料量,1mL/min
|
||
uint16_t oxygen_side_water_level = 0; // 氧侧生成水箱液位,0.01mm
|
||
uint16_t hydrogen_side_water_level = 0;// 氢侧生成水箱液位,0.01mm
|
||
uint16_t ballast_water_level = 0; // 配重水箱液位,0.01mm
|
||
|
||
uint16_t exhaust_inlet_pressure = 0; // 尾气装置进气压力,0.01MPa
|
||
uint16_t exhaust_outlet_pressure = 0; // 尾气装置排气压力,0.01MPa
|
||
uint16_t cabin_pressure1 = 0; // 舱室压力1,0.01kPa
|
||
uint16_t cabin_pressure2 = 0; // 舱室压力2,0.01kPa
|
||
uint16_t cabin_temp1 = 0; // 舱室温度1,0.01℃
|
||
uint16_t cabin_temp2 = 0; // 舱室温度2,0.01℃
|
||
uint16_t cabin_humidity1 = 0; // 舱室湿度1,0.01%RH
|
||
uint16_t cabin_humidity2 = 0; // 舱室湿度2,0.01%RH
|
||
uint16_t h2_concentration1 = 0; // 舱室H2浓度1,0.01%LEL
|
||
uint16_t h2_concentration2 = 0; // 舱室H2浓度2,0.01%LEL
|
||
uint16_t h2_concentration3 = 0; // 舱室H2浓度3,0.01%LEL
|
||
uint16_t o2_concentration1 = 0; // 舱室O2浓度1,0.01%Vol
|
||
uint16_t o2_concentration2 = 0; // 舱室O2浓度2,0.01%Vol
|
||
uint16_t ch3oh_concentration1 = 0; // 舱室甲醇浓度1,0.01%LEL
|
||
uint16_t ch3oh_concentration2 = 0; // 舱室甲醇浓度2,0.01%LEL
|
||
|
||
uint8_t flame_detector1 = 0; // 火焰探测器1状态
|
||
uint8_t flame_detector2 = 0; // 火焰探测器2状态
|
||
|
||
uint16_t emergency_float_depth = 0; // 应急上浮深度,1m
|
||
uint16_t emergency_float_time = 0; // 应急上浮时间,1min
|
||
uint16_t exhaust_run_freq = 0; // 尾气装置运行频率,0.01Hz
|
||
uint16_t exhaust_inlet_temp = 0; // 尾气装置进气温度,0.01℃
|
||
uint16_t exhaust_outlet_temp = 0; // 尾气装置排气温度,0.01℃
|
||
uint16_t exhaust_water_in_pressure = 0;// 尾气装置进水压力,0.01kPa
|
||
uint16_t exhaust_water_out_pressure = 0;// 尾气装置排水压力,0.01kPa
|
||
uint16_t tank_lo2_pressure = 0; // 一体化罐装置液氧罐压力,0.01MPa
|
||
uint16_t tank_co2_pressure = 0; // 一体化罐装置二氧化碳压力,0.01MPa
|
||
uint16_t tank_lo2_level = 0; // 一体化罐装置液氧罐液位,0.01mm
|
||
uint16_t alloy_h2_flow = 0; // 合金供氢流量,0.01L/min
|
||
uint16_t fc_h2_flow = 0; // FC供氢流量,0.01L/min
|
||
uint16_t fc_o2_flow = 0; // FC供氧流量,0.01L/min
|
||
|
||
uint16_t reserved[11] = {0}; // 预留1~11(字节125~146)
|
||
uint16_t remaining_generation = 0; // 剩余发电量,MWh(字节147,148),0827协议由预留12改为
|
||
|
||
uint8_t heartbeat = 0; // 通信心跳,每次+1
|
||
uint8_t emergency_cmd = 0; // 应急指令:Bit0 降载/Bit1 上浮/...
|
||
};
|
||
|
||
//--------------------------------------------------------------------------
|
||
// 消息类
|
||
//--------------------------------------------------------------------------
|
||
|
||
class FcControlMessage : public Message {
|
||
public:
|
||
uint16_t id() const override { return 0x0001; }
|
||
const char* name() const override { return "fc_control"; }
|
||
const ChecksumPolicy& checksum() const override { return m_checksum; }
|
||
// 1.1.1 控制指令域:数据域 18 字节(字节7~24),整包 24 字节(域字节数 0x0018)
|
||
size_t payloadLength() const override { return 18; }
|
||
|
||
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 FcControlValue& v) const { return encode(&v); }
|
||
bool decode(const std::vector<uint8_t>& frame, FcControlValue& v) const {
|
||
return decode(frame, static_cast<void*>(&v));
|
||
}
|
||
|
||
private:
|
||
ChecksumPolicy m_checksum{ChecksumType::None};
|
||
};
|
||
|
||
class FcStatusMessage : public Message {
|
||
public:
|
||
uint16_t id() const override { return 0x0002; }
|
||
const char* name() const override { return "fc_status"; }
|
||
const ChecksumPolicy& checksum() const override { return m_checksum; }
|
||
size_t payloadLength() const override { return 144; }
|
||
|
||
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 FcStatusValue& v) const { return encode(&v); }
|
||
bool decode(const std::vector<uint8_t>& frame, FcStatusValue& v) const {
|
||
return decode(frame, static_cast<void*>(&v));
|
||
}
|
||
|
||
private:
|
||
ChecksumPolicy m_checksum{ChecksumType::None};
|
||
};
|
||
|
||
// 注册 FC 消息到给定注册表(见 MessageRegistry.h)
|
||
void registerFcMessages(class MessageRegistry& reg);
|
||
|
||
} // namespace ccu
|
||
|
||
#endif // PCCU_FC_PROTOCOL_H
|