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
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
|
||||
校验:
|
||||
1. FC 状态收到并整合,pCCU 周期发送 PM 状态(0x0004, 248B)到 16003
|
||||
2. PM 操控(0x0001)转发为 FC 控制(0x0001, 20B)到 16001
|
||||
2. PM 操控(0x0001)转发为 FC 控制(0x0001, 24B)到 16001
|
||||
3. PM 参数设定(0x0002)触发参数反馈(0x0003, 12B)到 16003
|
||||
4. SQLite 记录了收/发原始帧
|
||||
5. Web 页面可访问
|
||||
@@ -62,6 +62,7 @@ def fc_status_frame():
|
||||
p[17] = 70 # 液氧
|
||||
struct.pack_into("<H", p, 24, 350) # 钯膜温度
|
||||
struct.pack_into("<H", p, 68, 2500) # 舱室温度1
|
||||
struct.pack_into("<H", p, 140, 4321) # 剩余发电量 MWh (字节147,148)
|
||||
p[142] = 5 # 心跳
|
||||
p[143] = 0x01 # 应急指令
|
||||
return frame(0x0002, bytes(p), checksum=False)
|
||||
@@ -74,6 +75,8 @@ def pm_control_frame():
|
||||
p[8] = 2 # 模式 自动
|
||||
p[9] = 2 # 操控 启动
|
||||
p[10] = 120 # 输出功率 0.1kW
|
||||
struct.pack_into("<h", p, 11, 123) # 纵倾姿态数据1 12.3°
|
||||
struct.pack_into("<h", p, 13, -45) # 横倾姿态数据1 -4.5°
|
||||
p[15] = 0x03 # 应急允许
|
||||
struct.pack_into("<H", p, 16, 150) # 潜深
|
||||
p[21] = 0x10 # 仪表锂电启动
|
||||
@@ -173,14 +176,21 @@ def main():
|
||||
else:
|
||||
ok = False
|
||||
|
||||
# 校验 2:PM 操控转发为 FC 控制(20B)
|
||||
fc_ctl = [d for d in fc_ctl_results if len(d) == 20]
|
||||
print(f"[FC 控制转发] 收到 {len(fc_ctl)} 帧 (期望>=1, 每帧20B)")
|
||||
# 校验 2:PM 操控转发为 FC 控制(24B,0827协议:姿态数据1转发,数据2字节预留恒0)
|
||||
fc_ctl = [d for d in fc_ctl_results if len(d) == 24]
|
||||
print(f"[FC 控制转发] 收到 {len(fc_ctl)} 帧 (期望>=1, 每帧24B)")
|
||||
if fc_ctl:
|
||||
d = fc_ctl[0]
|
||||
cmd = d[7]; power = d[8]; hb = d[19]
|
||||
print(f" -> cmd={cmd}, outputPower={power}, heartbeat={hb}")
|
||||
cmd = d[7]; power = d[8]; hb = d[23]
|
||||
pitch = struct.unpack_from("<h", d, 9)[0] # 字节10,11
|
||||
roll = struct.unpack_from("<h", d, 13)[0] # 字节14,15
|
||||
resv1 = struct.unpack_from("<H", d, 11)[0] # 字节12,13 预留
|
||||
resv2 = struct.unpack_from("<H", d, 15)[0] # 字节16,17 预留
|
||||
print(f" -> cmd={cmd}, outputPower={power}, pitch={pitch}, roll={roll}, "
|
||||
f"resv1={resv1}, resv2={resv2}, heartbeat={hb}")
|
||||
ok = ok and (cmd == 2) and (power == 120) and (hb == 7)
|
||||
ok = ok and (pitch == 123) and (roll == -45)
|
||||
ok = ok and (resv1 == 0) and (resv2 == 0)
|
||||
else:
|
||||
ok = False
|
||||
|
||||
|
||||
Reference in New Issue
Block a user