# 36仓体直流电瓶车充电柜 - 开发文档

## 1. 项目概述

### 1.1 项目目标

开发一款36仓体直流电瓶车充电柜，配置6个电源（每个电源对应6个仓体的独立直流输出口），支持每个仓体输出口独立设置电流、电压参数，适配星恒BMS Modbus协议与电源1TN RS485协议，实现安全、高效的独立充电功能。每个仓体配套状态指示灯，通过不同灯光状态反馈仓体工作情况，同时支持平台远程禁用仓体。

核心新增定制仓控主板及柜控主板功能：
- 每个仓控主板单独与所属电源通讯
- 仓控板采用拨码开关设置ID（ID范围1-6）
- 柜控板ID固定为128

### 1.2 核心功能矩阵

| 功能模块 | 子功能 | 说明 |
|---------|--------|------|
| 独立充电 | 多电压适配 | 48V/60V/72V直流适配，电流5A-20A可调 |
| | 快充模式 | 直流快充，1-2小时充满 |
| | 充电控制 | 扫码开门/预约/定时充电 |
| | BMS协议适配 | 支持星恒485一线通、天能485，平台可配置 |
| | 无协议充电 | 固定电压电流输出，低电流自动停止 |
| 仓体状态指示 | 绿灯闪烁 | 充电中，继电器闭合，电源正常输出 |
| | 绿灯常亮 | 仓体空闲，可正常启动充电 |
| | 红灯常亮 | 平台仓体禁用，管理员锁定 |
| | 红灯闪烁 | 电池不符合要求或设备告警或门未关 |
| 门锁控制 | 扫码开门 | 用户扫码→平台验证→下发开门指令 |
| | 门磁检测 | 实时监测仓门开/关状态 |
| | 关门超时报警 | 超过设置阈值未关门，上传告警（阈值可配置） |
| 平台仓体控制 | 远程禁用 | 管理员下发禁用指令，强制锁定仓体 |
| | 状态同步 | 禁用后指示灯切换，禁止充电 |
| | 手动解除 | 管理员解除禁用，恢复空闲状态 |
| 协议对接 | 1TN RS485 | 仓控板与电源通讯（电源参数控制） |
| | 星恒BMS Modbus | 仓控板与星恒电池BMS通讯（状态监测） |
| | 天能485 | 仓控板与天能电池BMS通讯（状态监测） |
| | 仓控-柜控485 | 仓控板（ID1-6）与柜控板（ID128）通讯 |
| 安全防护 | 过充/过温/过流/短路/漏电 | 实时监测，自动断电 |
| | 烟感+喷淋 | 烟感触发→断开接触器+打开喷淋电磁阀 |
| | 浸水保护 | 浸水触发→断开接触器切断380V |
| | 远程恢复 | 误报警可平台远程吸合接触器恢复供电 |
| | 6路温控 | 仓体温度实时采集，高温阈值可配置 |
| | 加热风扇 | 环境温度<0°C自动启动加热，≥25°C停止 |
| 固件管理 | OTA升级 | 平台远程升级柜控板和仓控板固件 |
| 定制主板 | 仓控主板 | 6路继电器、门锁驱动、门磁检测、光耦隔离、多通道485、温控 |
|  | 柜控主板 | 烟感/浸水接口、喷淋电磁阀、加热风扇、电磁泵、4G模块(TCP长连接) |

## 2. 系统架构

### 2.1 硬件架构

```
                         ┌───────────────────────┐
                         │     380V 市电输入       │
                         └──────────┬────────────┘
                                    │
                               ┌────┴────┐
                               │  漏保    │
                               └────┬────┘
                                    │
                         ┌──────────┼──────────┐
                         │          │          │
                   ┌─────┴─────┐ ┌──┴───┐ ┌───┴──────┐
                   │ 12V电源    │ │接触器 │ │其他负载  │
                   │(预接触器)  │ │柜控板控│ │(风扇等)  │
                   └─────┬─────┘ └──┬───┘ └──────────┘
                         │          │
                   ┌─────┴─────┐ ┌──┴───────────┐
                   │ 柜控板128  │ │ 充电电源×6   │
                   │ 仓控板×6   │ │ (直流输出)    │
                   │ (常供电)   │ └──────────────┘
                   └─────┬─────┘
                         │
                   ┌─────┴─────┐
                   │ 后备电池   │
                   │(380V断电备用)│
                   └───────────┘
```

### 2.2 软件架构

```
┌─────────────────────────────────────────────┐
│              后台管理平台                      │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐   │
│  │设备管理│ │用户管理│ │数据统计│ │故障管理  │   │
│  │OTA升级│ │      │ │      │ │报警阈值  │   │
│  └──┬───┘ └──┬───┘ └──┬───┘ └────┬─────┘   │
│  ┌──┴──────────┴──────────┴──────────┴────┐ │
│  │      BMS协议配置 · 无协议充电参数       │ │
│  │      门锁控制 · 仓体控制 · 仓体禁用     │ │
│  └─────────────────────────────────────────┘ │
│  ┌────────────────────────────────────────┐  │
│  │      自定义TCP通讯服务（长连接）        │  │
│  └────────────────────────────────────────┘  │
├─────────────────────────────────────────────┤
│              微信小程序                      │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐   │
│  │扫码充电│ │预约充电│ │进度查询│ │消息通知  │   │
│  │扫码开门│ │      │ │      │ │          │   │
│  └──────┘ └──────┘ └──────┘ └──────────┘   │
├─────────────────────────────────────────────┤
│          柜控主板（ID128）固件                │
│  ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│  │ TCP通讯  │ │数据处理  │ │充电控制逻辑  │ │
│  ├──────────┤ ├──────────┤ ├─────────────┤ │
│  │烟感/浸水 │ │485主站   │ │门锁指令转发  │ │
│  │喷淋电磁阀 │ │OTA管理   │ │BMS配置管理  │ │
│  └──────────┘ └──────────┘ └─────────────┘ │
├─────────────────────────────────────────────┤
│          仓控主板（ID1-6）固件                │
│  ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│  │ 485从站  │ │BMS通讯   │ │ 继电器控制  │ │
│  │          │ │多协议适配 │ │ 门锁控制    │ │
│  ├──────────┤ ├──────────┤ ├─────────────┤ │
│  │指示灯控制 │ │温控采集  │ │ 门磁监测    │ │
│  │OTA升级   │ │          │ │ 数据上报    │ │
│  └──────────┘ └──────────┘ └─────────────┘ │
└─────────────────────────────────────────────┘
```

## 3. 通讯协议设计

### 3.1 电源 1TN RS485 协议

#### 3.1.1 协议基础

- 标准号：YG20240118-1，版本 V1.0
- 制定方：苏州翌工电源科技有限公司
- 适用设备：换电柜用锂电池充电器（1TN系列多路充电器）
- 传输模式：Modbus-RTU
- 波特率：9600
- 字格式：11位：1个起始位(0) + 8个数据位 + 1个停止位
- 通讯方式：半双工主从应答（仓控板为主机，电源为从机）
- 地址范围：0x01-0x07（对应电源3位拨码开关，001=0x01 ... 111=0x07）
- 校验方式：和校验（SUM = 所有字节相加取低8位）
- 字节序：BigEndian（网络字节序）

#### 3.1.2 信息帧格式

| 字段 | 字节数 | 说明 |
|------|--------|------|
| ADDR | 1 | 电源地址 (0x01-0x07，对应拨码开关) |
| CHx | 1 | 通道号，高7位通道编号，Bit0主/副通道 |
| CMD | 1 | 功能码 |
| LEN | 1 | 数据区长度 |
| DATA | LEN | 数据区，BigEndian |
| SUM | 1 | 和校验 = (ADDR+CHx+CMD+LEN+DATA) & 0xFF |

**CHx 通道字节解析：**

| 通道 | Bit1-7 | CHx值(Bit0=0) | CHx值(Bit0=1) |
|------|--------|---------------|---------------|
| CH1  | 0x00   | 0x00 (主通道) | 0x01 (副通道) |
| CH2  | 0x01   | 0x02 (主通道) | 0x03 (副通道) |
| CH3  | 0x02   | 0x04 (主通道) | 0x05 (副通道) |
| CH4  | 0x03   | 0x06 (主通道) | 0x07 (副通道) |
| CH5  | 0x04   | 0x08 (主通道) | 0x09 (副通道) |
| CH6  | 0x05   | 0x0A (主通道) | 0x0B (副通道) |

#### 3.1.3 功能码定义

| 序号 | 命令 | CMD | LEN | 数据区 |
|------|------|-----|-----|--------|
| 1 | 设置通道输出电压/电流 | 0x02 | 0x04 | 电压(2B mV) + 电流(2B 0.1A) |
| 2 | 设置通道开关机 | 0x03 | 0x01 | 0x00=关机, 0x01=开机 |
| 3 | 通道组合指令（开关机+调压+调流） | 0x04 | 0x05 | 开关(1B) + 电压(2B) + 电流(2B) |
| 4 | 电源通道信息查询 | 0x05 | 0x01 | 查询类型 |
| 5 | 供应商/型号/版本号/序列号查询 | 0x12 | 0x01 | 查询类型 |
| 6 | 升级状态查询 | 0x18 | - | 详见升级协议 |
| 7 | OTA远程升级 | 0x19 | - | 详见升级协议 |

**电源回复数据格式：**

| 指令 | 回复LEN | 回复DATA说明 |
|------|---------|-------------|
| 0x02设置V/I | 0x01 | 0x01=设置成功 |
| 0x03开关机 | 0x01 | 0x01=设置成功 |
| 0x04组合指令 | 0x07 | 电压(2B) + 电流(2B) + 故障码(2B) + 环温(1B 0.1℃) |
| 0x05查询 | 0x0D | 设置电压(2B) + 设置电流(2B) + 故障码(2B) + 环温(1B) + 输入电压(2B 0.01V) + 输入电流(2B 0.01A) + 输入功率(2B W) |
| 0x12供应商信息 | 0x0F | 厂商(2B ASCII) + 型号(8B ASCII) + 硬件版本(1B) + 软件版本(1B) + 生产日期(3B) + 序列号(2B) |

#### 3.1.4 故障码定义

**故障字节1 (设备状态)：**

| Bit | 含义 | Bit | 含义 |
|-----|------|-----|------|
| Bit0 | 输入欠压 | Bit4 | 输出欠压 |
| Bit1 | 输入过压 | Bit5 | 输出短路 |
| Bit2 | NC | Bit6 | 输出过流 |
| Bit3 | 输出过压 | Bit7 | 过温 |

**故障字节2 (系统状态)：**

| Bit | 含义 | Bit | 含义 |
|-----|------|-----|------|
| Bit0 | 硬件故障 | Bit4 | NC |
| Bit1 | PFC故障 | Bit5 | NC |
| Bit2 | 风扇故障 | Bit6 | NC |
| Bit3 | 电池反接故障 | Bit7 | NC |

#### 3.1.5 指令示例

```
设置1#电源 CH1 开启+60.0V+10.0A (组合指令 0x04):
  主控 → 电源: ADDR=0x01, CHx=0x00, CMD=0x04, LEN=0x05,
               DATA=[0x01, 0x02, 0x58, 0x00, 0x64],
               SUM=(0x01+0x00+0x04+0x05+0x01+0x02+0x58+0x00+0x64)=0xC9
  电源 → 主控: ADDR=0x01, CHx=0x00, CMD=0x04, LEN=0x07,
               DATA=[0x02,0x58, 0x00,0x64, 0x01,0x01, 0x1A],
               回复: 当前电压60.0V, 电流10.0A, 故障码0x0101, 环温26℃

读取1#电源 CH1 运行信息 (查询 0x05):
  主控 → 电源: ADDR=0x01, CHx=0x00, CMD=0x05, LEN=0x01, DATA=[0x00], SUM=0x07
  电源 → 主控: ADDR=0x01, CHx=0x00, CMD=0x05, LEN=0x0D,
               DATA=[0x02,0x58, 0x00,0x64, 0x01,0x01, 0x1A,
                     0x55,0xF0, 0x03,0xE8, 0x08,0x98],
               回复: 设定60.0V/10.0A, 故障码0x0101, 环温26℃,
                     输入电压220.00V, 输入电流10.00A, 输入功率2200W

设置2#电源 CH2 关机 (开关机 0x03):
  主控 → 电源: ADDR=0x02, CHx=0x02, CMD=0x03, LEN=0x01, DATA=[0x00], SUM=0x08

供应商信息查询 (0x12):
  主控 → 电源: ADDR=0x01, CHx=0x00, CMD=0x12, LEN=0x01, DATA=[0x00], SUM=0x14
  电源 → 主控: ADDR=0x01, CHx=0x00, CMD=0x12, LEN=0x0F,
               DATA='YGCP1TN-A' + 硬件版本(1B) + 软件版本(1B) +
                    生产日期(3B: 年/月/日) + 序列号(2B)
```

### 3.2 BMS 协议适配

充电柜支持多协议BMS适配，通过平台远程配置当前柜体使用的BMS协议类型。仓控板根据配置选择对应的BMS通讯协议进行电池数据读取。

#### 3.2.1 BMS协议类型配置

| 协议类型 | 说明 | 配置方式 |
|---------|------|---------|
| 星恒485一线通 | 标准Modbus-RTU，地址0x16 | 平台配置 |
| 天能485 | 自定义协议 | 平台配置 |
| 无协议充电 | 不读取BMS，固定电压电流输出 | 平台配置 |

BMS协议配置存储在柜控板Flash中，仓控板上电时从柜控板获取当前BMS协议类型。平台可远程切换协议类型，切换后下次充电生效。

#### 3.2.2 星恒 BMS Modbus 协议

**协议基础：**

- 版本：V1.1
- 传输模式：Modbus-RTU
- 波特率：9600，数据位8，停止位1，无校验
- BMS固定地址：0x16 (16H)
- 支持功能码：03H（读保持寄存器）、10H（写控制指令）

**核心寄存器映射：**

| 寄存器地址 | 参数 | 类型 | 单位 | 说明 |
|-----------|------|------|------|------|
| 10000-10002 | BMS软硬件版本/控制 | 只读/读写 | - | 10002: 充电禁止/允许 |
| 10003-10027 | 电池条码 | 只读 | ASCII | 25个寄存器 |
| 10036 | 电芯材料 | 只读 | - | 磷酸铁锂/三元锂/锰酸锂 |
| 10043-10072 | 30串单体电压 | 只读 | mV | 30个寄存器 |
| 10074 | 总电压 | 只读 | mV | 1个寄存器 |
| 10080-10089 | 10路电芯温度 | 只读 | 0.1℃ | 10个寄存器 |
| 10091 | 单体过压告警 | 只读 | BIT | bit0=告警 |
| 10092 | 单体欠压告警 | 只读 | BIT | bit0=告警 |
| 10094 | 电芯不平衡告警 | 只读 | BIT | bit0=告警 |
| 10095 | 过流告警 | 只读 | BIT | bit0=告警 |
| 10096 | 过温告警 | 只读 | BIT | bit0=告警 |
| 10097 | 低温告警 | 只读 | BIT | bit0=告警 |
| 10101 | SOH | 只读 | 0.01 | 健康度0-1 |
| 10102 | SOC | 只读 | 0.1% | 剩余电量 |
| 10103 | 充电请求电压 | 只读 | mV | BMS请求的充电电压 |
| 10104 | 最大充电请求电流 | 只读 | 0.1A | BMS请求的最大电流 |
| 10156 | 电池组唯一编码 | 只读 | - | - |
| 10166 | 总压异常告警 | 只读 | BIT | bit0=告警 |
| 10167 | 容量通量 | 只读 | - | - |
| 10169 | 能量通量 | 只读 | - | - |
| 10172 | 生产日期 | 只读 | - | 年/月/日 |

#### 3.2.3 天能 485 协议

**协议基础：**

- 传输模式：自定义RS485协议
- 波特率：9600，数据位8，停止位1，无校验
- BMS地址：0x01
- 协议细节：以天能电池官方提供的BMS通讯协议文档为准，仓控板固件中预留协议适配层，支持按配置切换协议实现

**适配策略：**

仓控板BMS通讯模块采用分层设计：
1. **协议抽象层**：统一的数据接口（电压/电流/SOC/温度/告警等）
2. **协议实现层**：星恒Modbus实现、天能自定义协议实现
3. **配置选择层**：根据平台下发的BMS类型选择对应的协议实现

#### 3.2.4 无协议充电模式

当配置为无协议充电模式时，仓控板不通过485_2总线读取BMS数据，充电过程完全由平台下发的固定参数控制：

- 平台下发固定充电电压、充电电流
- 仓控板直接控制电源输出设定值
- 通过监测电源输出电流判断是否充满：电流低于设定阈值时自动停止
- 低电流阈值由平台配置，可在充电过程中动态调整

### 3.3 仓控主板 ↔ 柜控主板 485 通讯

#### 3.3.1 通讯参数

- 波特率：9600
- 半双工主从方式
- 柜控主板（ID128）为主站
- 仓控主板（ID1-6）为从站
- 光耦隔离保护
- 通讯响应延迟 ≤ 0.5s

#### 3.3.2 通讯帧结构

自定义协议帧：

| 字段 | 字节数 | 说明 |
|------|--------|------|
| 帧头 | 2 | 0xAA 0x55 |
| 目标ID | 1 | 0x01-0x06 或 0x80（柜控板） |
| 源ID | 1 | 0x01-0x06 或 0x80 |
| 功能码 | 1 | 指令类型 |
| 数据长度 | 2 | BigEndian |
| 数据区 | N | 具体数据 |
| CRC16 | 2 | Modbus CRC16 |

#### 3.3.3 功能码定义

| 功能码 | 指令 | 方向 | 说明 |
|--------|------|------|------|
| 0x01 | 上传BMS数据 | 仓控→柜控 | 电池SOC/电压/温度/告警/BMS协议类型 |
| 0x02 | 上传温控数据 | 仓控→柜控 | 6路仓体温度+环境温度 |
| 0x03 | 上传电源状态 | 仓控→柜控 | 电源运行参数 |
| 0x04 | 上传设备状态 | 仓控→柜控 | 继电器/通讯/门磁/门锁状态 |
| 0x05 | 上传门磁状态 | 仓控→柜控 | 6路仓体门开/关状态 |
| 0x06 | 上传OTA状态 | 仓控→柜控 | OTA升级进度/结果 |
| 0x81 | 继电器控制 | 柜控→仓控 | 充电继电器通断控制 |
| 0x82 | 电源参数设置 | 柜控→仓控 | 电压/电流/开关/无协议充电参数 |
| 0x83 | 指示灯控制 | 柜控→仓控 | 绿灯/红灯/闪烁 |
| 0x84 | 查询指令 | 柜控→仓控 | 查询全量状态 |
| 0x85 | 平台禁用 | 柜控→仓控 | 禁用/解除禁用 |
| 0x86 | 模式切换 | 平台→柜控 | 切换平台模式/柜控模式 |
| 0x87 | 接触器控制 | 平台→柜控 | 合闸/分闸指令 |
| 0x88 | 门锁控制 | 柜控→仓控 | 开门/锁门，指定仓体(位掩码) |
| 0x89 | OTA升级 | 柜控→仓控 | 固件升级数据包/启动升级/查询版本 |
| 0x8A | BMS类型配置 | 柜控→仓控 | 设置当前BMS协议类型(星恒/天能/无协议) |
| 0x8B | 报警阈值配置 | 柜控→仓控 | 设置关门超时/高温报警阈值 |

## 4. 定制主板设计

### 4.1 仓控主板（ID1-6）

#### 4.1.1 硬件规格

| 模块 | 规格 |
|------|------|
| MCU | 内置MCU控制器，独立运行，支持OTA固件升级 |
| 继电器 | 6路直流继电器，寿命≥10万次 |
| 电子门锁驱动 | 6路，MOSFET输出/继电器，12V电控锁驱动 |
| 门磁检测 | 6路开关量输入，检测仓门开/关状态 |
| 485接口 | 3路隔离485：1路接柜控板（ID128）、1路接BMS（6仓体共用总线）、1路接所属电源模块 |
| 光耦隔离 | 3路485均做光耦隔离 |
| 温控接口 | 6路，适配常用温控传感器（NTC/DS18B20） |
| ID设置 | 4位拨码开关，设置与柜控板通讯的485从站ID，范围1-6 |
| 指示灯接口 | 6路（每仓体1路），支持绿灯/红灯控制 |

#### 4.1.2 接口定义

```
┌─────────────────────────────────────┐
│         仓控主板 (ID1-6)             │
├─────────────────────────────────────┤
│ [拨码开关] ← 设置485从站ID (1-6)     │
│ [485_1]    ← 柜控主板 (ID128)       │
│ [485_2]    ← BMS总线 (6仓体共用)     │
│ [485_3]    ← 所属电源 (1TN协议)      │
│ [TEMP1-6]  ← 6路仓体温控             │
│ [RELAY1-6] ← 6路直流继电器           │
│ [DOOR_LK1-6]→ 6路电子门锁驱动        │
│ [DOOR_ST1-6]← 6路门磁检测            │
│ [LED1-6]   ← 6路仓体指示灯           │
│ [4PIN]     ← 充电线（2路正负极+2路485）│
└─────────────────────────────────────┘
```

#### 4.1.3 固件功能模块

| 模块 | 功能 |
|------|------|
| 485从站模块 | 响应柜控板（ID128）指令，按拨码开关ID寻址 |
| BMS通讯模块 | 按配置协议（星恒/天能/无协议）读取BMS数据或跳过 |
| 电源通讯模块 | 通过独立485与所属电源1TN协议交互 |
| 继电器控制模块 | 6路独立通断控制 |
| 指示灯控制模块 | 6路独立LED状态控制，关联门锁/充电/告警状态 |
| 温控采集模块 | 6路温度数据采集 |
| ID管理模块 | 拨码开关读取与ID识别 |
| 门锁控制模块 | 6路独立门锁驱动，接收柜控板门锁指令开锁 |
| 门磁监测模块 | 6路门磁状态检测，上传门状态，超时未关门报警 |
| OTA升级模块 | 接收固件升级数据包，校验写入，重启切换 |

#### 4.1.4 核心逻辑流程

```
初始化：
  1. 读取拨码开关 → 获取本机ID (1-6)
  2. 初始化3路485接口（9600, 8, 1, none）
  3. 初始化继电器 → 全部断开
  4. 初始化门锁 → 全部锁闭
  5. 初始化指示灯 → 全部绿灯常亮（空闲）
  6. 初始化温控接口 → 开始采集
  7. 从柜控板获取BMS协议类型配置
  8. 从柜控板获取报警阈值配置（关门超时/高温）
  9. 注册到柜控板 → 发送上线通知（源ID=本机ID, 目标ID=128）

主循环：
  每个周期（100ms）：
    1. 检查柜控板指令（485_1）
       → 如有指令：解析功能码，执行对应操作
       → 门锁控制(0x88)：按位掩码开门/锁门
       → OTA升级(0x89)：处理固件升级数据
       → BMS配置(0x8A)：切换BMS协议类型
       → 报警阈值配置(0x8B)：更新关门超时/高温阈值
    2. 按配置的BMS协议类型轮询BMS总线（485_2）
       → 星恒模式：Modbus-RTU读取电池数据
       → 天能模式：自定义协议读取电池数据
       → 无协议模式：跳过BMS读取
       → 解析数据，故障时联动继电器+指示灯
    3. 读取6路温控数据
       → 超范围时触发保护
       → 温度超过高温报警阈值 → 上传告警
    4. 读取6路门磁状态
       → 检测到开门 → 启动计时
       → 超过设置阈值未关门 → 上传告警
    5. 通过485_3查询所属电源状态
       → 读取电压/电流/故障码（1TN协议）
       → 无协议充电模式：监测输出电流，低于阈值通知柜控板停止
    6. 上传数据至柜控板（ID128）
       → BMS数据 + 温控 + 电源状态 + 继电器状态 + 门磁状态
    7. 更新指示灯状态

充电启动流程：
  1. 检测到仓门关闭（门磁闭合）
  2. 按配置协议读取BMS数据（无协议模式跳过）
  3. 上传数据至柜控板（ID128），等待充电指令
  4. 收到允许充电指令 → 闭合继电器
     → 通过485_3发送电源开启+调压调流指令（1TN协议）
     → 无协议模式：使用平台下发的固定电压/电流值
     → 指示灯切换为绿灯闪烁（充电中）
  5. 实时同步数据，动态调整电源参数
     → 有BMS模式：根据BMS请求调整
     → 无协议模式：监测电流，低于阈值自动停止
  6. 充满/异常 → 断开继电器，关闭电源输出

门开锁流程：
  1. 用户扫码 → 平台验证通过
  2. 平台下发开门指令至柜控板(TCP)
  3. 柜控板转发0x88开门指令至对应仓控板
  4. 仓控板解析位掩码 → 驱动对应门锁继电器/MOSFET → 开锁
  5. 门锁动作时间到 → 自动复位
  6. 用户开门取/放电池
  7. 门磁检测到关门 → 上报门已关闭状态
```

### 4.2 柜控主板（ID128）

#### 4.2.1 硬件规格

| 模块 | 规格 |
|------|------|
| MCU | 内置MCU控制器，独立运行，支持OTA固件升级 |
| 485接口 | 1路隔离RS485，与6个仓控板通讯（光耦隔离） |
| 485电表接口 | 1路隔离RS485，接DL/T645电表，读取耗电量数据 |
| 4G模块 | Air780E，自定义TCP协议长连接 |
| 烟感接口 | 1路开关量输入 |
| 浸水接口 | 1路开关量输入 |
| 倾倒检测 | 1路开关量输入 |
| 环境温控传感器 | 1路，NTC/DS18B20，用于加热风扇自动温控 |
| 接触器控制 | 1路继电器输出，控制常开接触器（默认断开，给信号吸合） |
| 喷淋电磁阀 | 1路继电器输出，烟感触发时自动打开，喷淋灭火 |
| 加热风扇继电器 | 1路独立继电器输出，220V/10A，自动温控 |
| 电磁泵继电器 | 1路继电器输出，平台远程控制通断 |
| 接触器按钮 | 2个物理按钮：合闸按钮（吸合接触器）、分闸按钮（断开接触器），用于离线时手动操作 |
| 存储 | Flash（存储设备配置参数：BMS类型、报警阈值、无协议充电参数，本地不留充电数据） |
| 主电源 | 来自12V电源（预接触器，常供电） |
| 后备电源 | 后备电池输入，380V总断电时自动切换，维持板子供电与远程通讯 |
| | 平台可远程下发恢复指令 → 吸合接触器恢复充电电源供电 |

#### 4.2.2 接口定义

```
┌─────────────────────────────────────┐
│         柜控主板 (ID128)             │
├─────────────────────────────────────┤
│ [485]      ←→ 仓控板ID1-6           │
│ [485_METER]←→ DL/T645电表（耗电量采集）│
│ [4G/TCP]   ←→ 后台平台（自定义TCP长连接）│
│ [SMOKE]    ← 烟感传感器（开关量）     │
│ [WATER]    ← 浸水传感器（开关量）     │
│ [TILT]     ← 倾倒检测（开关量）       │
│ [TEMP_AMB] ← 环境温度传感器（NTC/DS18B20）│
│ [CONTACTOR]→ 接触器控制（继电器输出）  │
│ [SPRINKLER]→ 喷淋电磁阀控制（继电器输出）│
│ [FAN]      → 加热风扇控制（独立继电器输出）│
│ [PUMP]     → 电磁泵控制（继电器输出）  │
│ [合闸按钮]  ← 手动吸合接触器          │
│ [分闸按钮]  ← 手动断开接触器          │
│ [PWR_IN]   ← 12V电源输入             │
│ [PWR_OUT]  → 仓控板供电输出          │
└─────────────────────────────────────┘
```

#### 4.2.3 固件功能模块

| 模块 | 功能 |
|------|------|
| 485主站模块 | 与仓控板ID1-6双向通讯，ID寻址 |
| TCP通讯模块 | 与后台平台数据交换（自定义TCP协议长连接） |
| 数据处理模块 | BMS/温控/电源/门磁数据解析转发 |
| 充电控制模块 | 双模式充电控制逻辑（平台/本地），支持无协议充电参数管理 |
| 安全监测模块 | 烟感/浸水/倾倒监测，触发后断开接触器切断380V + 打开喷淋电磁阀 |
| 接触器控制模块 | 控制380V接触器吸合（上电/恢复）/断开（告警/急停），含按钮去抖逻辑 |
| 按钮处理模块 | 合闸→吸合接触器，分闸→断开接触器，离线时手动操控，优先级高于平台指令 |
| 告警联动模块 | 烟感/浸水→断开接触器+打开喷淋→上报平台→记录日志 |
| 加热风扇控制模块 | 自动温控：读取环境温度传感器，<0°C启动加热，≥25°C停止 |
| 电磁泵控制模块 | 接收平台远程指令控制继电器通断 |
| 门锁指令转发模块 | 接收平台开门指令 → 转发对应仓控板（0x88） |
| OTA升级模块 | 接收平台固件包 → 分片转发至仓控板或本地升级 |
| BMS配置管理模块 | 存储/切换BMS协议类型，新配置下发至仓控板 |
| 电表采集模块 | 通过独立485按DL/T645协议读取电表耗电量，定时上报平台 |

#### 4.2.4 核心逻辑流程

```
初始化：
  1. 初始化485主站（9600, 8, 1, none）
  2. 初始化4G模块 → 与后台平台建立TCP长连接
  3. 初始化烟感/浸水接口（中断模式）
  4. 初始化接触器继电器 → 吸合（系统正常上电）
  5. 读取存储的配置参数（BMS类型、报警阈值、无协议充电参数）
  6. 轮询所有仓控板（ID1-6）上线状态
  7. 下发BMS类型配置至所有仓控板
  8. 下发报警阈值配置至所有仓控板
  9. 上传设备上线通知至平台

主循环：
  每500ms：
    1. 轮询仓控板ID1-6数据
       → 发送查询指令 → 接收BMS/温控/电源/门磁/设备状态
       → 按ID分类存储
    2. 处理后台下行指令（TCP长连接接收）
       → 仓体禁用/解除 → 转发对应仓控板
       → 充电控制指令 → 转发对应仓控板
       → 电磁泵控制 → 通/断控制电磁泵继电器
       → 门锁控制 → 开门指令转发对应仓控板（0x88）
       → OTA升级 → 固件包处理，转发仓控板或本地升级
       → BMS类型配置 → 存储+下发仓控板（0x8A）
       → 报警阈值配置 → 存储+下发仓控板（0x8B）
       → 无协议充电参数 → 存储+转发仓控板
       → 配置更新 → 本地存储+生效
    3. 安全监测检查（最高优先级）
→ 烟感触发 → 立即断开接触器 + 打开喷淋电磁阀
        → 浸水触发 → 立即断开接触器
        → 倾倒触发 → 立即断开接触器 + 上传告警
       → 发送急停指令至所有仓控板（断开继电器）
       → 板子仍由12V电源正常供电，通讯不受影响
       → 上传告警至平台
       → 等待人工/平台远程复位才可重新吸合接触器
    4. 电表数据采集
        → 通过485_METER按DL/T645协议读取电表耗电量
        → 定时采集（每5分钟），缓存累计数据
        → 上报平台
     5. 加热风扇自动温控
       → 读取环境温度传感器
       → 温度 < 0°C → 闭合加热风扇继电器（启动加热）
       → 温度 ≥ 25°C → 断开加热风扇继电器（停止加热）
       → 温度在0-25°C之间 → 保持当前状态（滞回控制）
       → 状态变化时上传平台
    5. 接触器状态同步
       → 接触器异常断开 → 上报平台
       → 平台远程恢复 → 吸合接触器，恢复充电电源供电
    6. 充电控制逻辑
       → 平台模式（默认）：等待平台远程指令，需在线
       → 柜控模式：由平台远程切换为本地模式，离线也可正常充电
         · 平台下发"启用本地模式"指令 → 柜控板切换为本地控制
         · 本地校验项：BMS握手成功/无协议充电参数合规、电池参数合规、仓体未被禁用
         · 符合条件 → 下发允许充电指令
         · 不符合条件 → 下发拒绝指令（红灯闪烁）
       → 平台模式/柜控模式可通过平台远程切换
     8. 数据上传
        → 实时上报BMS/温控/状态数据供平台监控
        → 上报加热风扇状态（运行/停止）及环境温度
        → 上报电磁泵状态（通/断）
        → 上报各仓体门磁状态（开/关）及关门超时告警
        → 上报烟感/喷淋状态
        → 上报电表耗电量数据
        → 平台仅记录充电记录（起止时间、电量、费用等）

TCP断连处理：
  1. 检测到TCP断连 → 触发告警
  2. 如已启用柜控模式，离线充电不受影响
  3. 如为平台模式 → 充电控制暂停，等待重连
  4. 缓存待上传数据（重连后补偿上报）
  5. 自动重连（间隔递增：10s/30s/60s/300s）
  6. 重连成功 → 补偿上传缓存数据
```

## 5. 指示灯状态控制

### 5.1 状态定义

| 指示灯状态 | 对应状态 | 触发条件 | 继电器 | 电源输出 |
|-----------|---------|---------|--------|---------|
| 绿灯闪烁 | 充电中 | 正常充电，BMS通讯正常（有协议）或电源输出正常（无协议） | 闭合 | 正常输出 |
| 绿灯常亮 | 仓体空闲 | 无充电任务、无故障、无禁用、门已关闭 | 断开 | 无输出 |
| 红灯常亮 | 平台禁用 | 管理员下发禁用指令 | 断开 | 无输出 |
| 红灯闪烁 | 电池不符合要求/设备告警/门未关 | BMS校验不通过/故障/门长期未关 | 断开 | 无输出 |

### 5.2 状态切换条件

```
[绿灯常亮] ──扫码/预约充电──→ [绿灯闪烁]
[绿灯闪烁] ──充满/用户停止──→ [绿灯常亮]
[绿灯常亮] ──平台禁用指令──→ [红灯常亮]
[红灯常亮] ──平台解除禁用──→ [绿灯常亮]
[绿灯常亮] ──插入不合规电池──→ [红灯闪烁]
[红灯闪烁] ──拔掉电池──→ [绿灯常亮]
[绿灯闪烁] ──故障告警──→ [红灯闪烁]
[红灯闪烁] ──故障排除──→ [绿灯常亮]
任何状态   ──烟感/浸水触发──→ [红灯闪烁/常亮]
```

### 5.3 控制实现

指示灯控制由仓控主板直接驱动，柜控主板通过485下发指示灯控制指令（功能码0x83），仓控板执行具体GPIO控制：

```
绿灯控制：GPIO输出PWM（闪烁）/高电平（常亮）/低电平（灭）
红灯控制：GPIO输出PWM（闪烁）/高电平（常亮）/低电平（灭）
```

## 6. 充电控制逻辑

### 6.1 电池握手流程

```
[用户扫码 → 平台验证 → 下发开门指令]
    ↓
[仓门打开 → 用户放入电池 → 关闭仓门]
    ↓
仓控板检测门磁闭合
    ↓
按配置BMS协议类型读取电池数据：
  ┌─ 星恒模式：Modbus 03H读取寄存器
  │   - 10000-10002: 版本+控制状态
  │   - 10003-10027: 电池条码
  │   - 10043-10072: 单体电压（30串）
  │   - 10074: 总电压
  │   - 10080-10089: 温度（10路）
  │   - 10091-10099: 告警状态
  │   - 10101: SOH
  │   - 10102: SOC
  │   - 10103-10104: 充电请求参数
  ├─ 天能模式：自定义协议读取对应数据
  └─ 无协议模式：跳过BMS读取，使用平台下发的固定参数
    ↓
数据有效性校验（SOC 0-100%, 电压40-80V等）
    ↓
打包数据 → 上传至柜控板（ID128）→ TCP长连接上传平台
    ↓
等待充电控制指令
```

### 6.2 双模式充电控制

#### 6.2.1 平台控制模式

```
后台平台接收BMS信息 → 管理员判断/自动规则
    ↓
下发充电允许/禁止指令
    ↓
柜控板接收 → 转发至对应仓控板
    ↓
仓控板执行：
  允许 → 闭合继电器 → 电源开启+调压调流 → 绿灯闪烁
  禁止 → 断开继电器 → 电源关闭 → 红灯闪烁
```

#### 6.2.2 柜控板控制模式

```
后台预设触发条件（特殊ID列表、参数规则等）
    ↓
柜控板接收BMS信息 → 自动校验条件
    ↓
符合条件 → 下发充电允许 → 仓控板执行充电启动
不符合条件 → 下发禁止 → 红灯闪烁
    ↓
校验结果上传至平台
    ↓
拔掉电池 → 自动恢复绿灯常亮（空闲）
```

### 6.3 充电过程动态调整

```
每1秒循环：
  1. 读取BMS实时数据（有协议模式）/ 读取电源输出电流（无协议模式）
  2. SOC ≥ 98% → 满电保护：关闭电源，绿灯常亮
  3. 电池温度 > 55℃ 或 < -10℃ → 过温保护：关闭电源
  4. 仓体温度 > 高温报警阈值（平台可配置，默认55℃）→ 高温告警上传
  5. 告警状态检查：
     - 单体过压/欠压 → 保护动作
     - 过流 → 降低电流或断电
     - 电芯不平衡 → 预警提示
  6. 动态调压调流：
     - 有协议模式：根据BMS请求电压/电流调整电源输出（功能码0x02/0x04）
     - 无协议模式：保持平台下发的固定电压/电流输出
     - 电压偏差 ≥ 0.5V 时重新调节
  7. 无协议模式低电流检测：
     - 输出电流 < 平台设置的停止阈值 → 判定充满，自动断电
```

### 6.4 无协议充电模式

当配置为无协议充电模式时，充电过程不依赖BMS通讯，由平台下发固定参数控制：

**配置参数（平台设置）：**

| 参数 | 说明 | 范围 |
|------|------|------|
| 充电电压 | 固定输出电压 | 40-80V |
| 充电电流 | 固定输出电流 | 5-20A |
| 停止电流阈值 | 低于此值判定充满自动停止 | 0.5-5A |

**充电流程：**

```
[用户放入电池 → 关闭仓门]
    ↓
仓控板检测门磁闭合
    ↓
无BMS握手 → 直接上传"仓体就绪"至平台
    ↓
平台下发充电允许 + 充电参数（电压/电流/停止电流阈值）
    ↓
仓控板闭合继电器 → 通过485_3设置电源输出固定电压/电流
    ↓
指示灯切换为绿灯闪烁（充电中）
    ↓
每1秒监测电源输出电流
    ↓
输出电流 < 停止电流阈值 → 判定充满
    ↓
断开继电器 → 关闭电源输出 → 绿灯常亮
    ↓
上报充电完成（时长+总输出电量估算）
```

## 7. 软件平台设计

### 7.1 后台管理系统

#### 7.1.1 技术栈建议

```
后端框架：Spring Boot / Node.js (Egg.js/Nest.js) / Python (FastAPI)
数据库：MySQL + Redis + InfluxDB（时序数据）
通信协议：自定义TCP协议长连接（设备通讯）+ HTTP/WebSocket（前端）
前端框架：React / Vue3 + Element Plus / Ant Design
```

#### 7.1.2 核心模块

| 模块 | 功能 |
|------|------|
| 设备管理 | 实时监控、远程重启、参数配置、OTA固件升级（柜控板+仓控板） |
| 仓体控制 | 独立电流/电压设置、禁用/解除、状态查看、远程开门 |
| BMS协议配置 | 设置当前柜体BMS协议类型（星恒/天能/无协议充电） |
| 无协议充电参数配置 | 设置固定充电电压/电流/停止电流阈值 |
| 充电控制模式配置 | 平台/柜控模式切换、特殊ID管理 |
| 用户管理 | 注册/登录、权限分配（管理员/普通/骑手） |
| 数据统计 | 充电量、使用率、故障率、温控数据、告警统计 |
| 故障管理 | 故障记录、工单分配、处理跟踪、解除禁用 |
| 报警阈值管理 | 关门超时阈值配置、高温报警阈值配置、设备告警管理 |
| TCP连接管理 | 连接状态监控、心跳检测、断连告警 |
| 辅助设备控制 | 电磁泵远程通断控制、加热风扇状态监控 |

#### 7.1.3 设备数据模型

```
充电柜 (Cabinet):
  - id, 名称, 位置, 状态(在线/离线)
  - BMS协议类型(星恒/天能/无协议)
  - 无协议充电参数(电压/电流/停止电流阈值)
  - 报警阈值(关门超时/高温)
  - 6个电源 (Power): 型号, 版本, 状态
  - 36个仓体 (Compartment): 
    - 所属电源, 所属仓控板ID
    - 状态(空闲/充电中/禁用/故障/门未关)
    - 当前电压/电流设置
    - 指示灯状态
    - 门磁状态(开/关) · 门锁状态
    - 关门超时告警
  - 6个仓控板 (CabinBoard): 
    - ID(1-6), 状态, 固件版本, OTA升级进度
    - 6路温控数据
    - 6路门磁数据
  - 1个柜控板 (CabinetBoard):
    - ID(128), 状态, 固件版本, OTA升级进度
    - TCP连接状态 · 4G信号强度
    - 加热风扇状态(运行/停止) · 环境温度
    - 电磁泵状态(通/断)
    - 喷淋电磁阀状态(开/关)
    - 电表耗电量(kWh) · 电表通讯状态
  - 烟感/浸水/喷淋状态

充电记录 (ChargeRecord):
  - 仓体ID, 仓控板ID, 电源通道
  - 开始时间, 结束时间
  - 充电量, 最高温度, 平均电压
  - BMS数据快照(SOC/电压/温度)
  - 充电状态(正常/异常中断/手动停止)

故障记录 (FaultRecord):
  - 仓体ID/主板ID, 故障类型, 故障码
  - 发生时间, 处理时间
  - 处理状态(待处理/处理中/已解决)
  - 故障等级(预警/保护/严重)
```

### 7.2 微信小程序

#### 7.2.1 功能页面

| 页面 | 功能 |
|------|------|
| 首页 | 附近充电柜列表/地图，空闲舱位显示 |
| 扫码充电 | 扫描仓体二维码，启动充电 |
| 预约充电 | 选择仓体，预约时间段 |
| 充电进度 | 实时显示SOC/电压/温度/充电时间 |
| 消息通知 | 充电完成、故障告警、系统通知 |
| 个人中心 | 充电记录、用户信息、反馈 |

#### 7.2.2 仓体状态展示

小程序同步显示仓体指示灯状态及门锁状态：
- 绿灯闪烁 → "充电中"
- 绿灯常亮 + 门锁图标开 → "空闲（门已开）"
- 绿灯常亮 + 门锁图标关 → "空闲（门已关）"
- 红灯 → "禁用/故障"

扫码开门流程：
1. 用户扫描仓体二维码
2. 小程序显示仓体信息和操作按钮
3. 点击"开门"按钮 → 平台验证 → 下发开门指令
4. 门锁打开，用户放入/取出电池
5. 关门后系统自动检测门磁闭合

## 8. 安全防护设计

### 8.1 电气安全

| 防护类型 | 实现方式 | 触发动作 |
|---------|---------|---------|
| 过充保护 | SOC监测 + 电压监测 | SOC≥98%自动断电 |
| 过温保护 | 温控传感器 + BMS温度 | 超过平台设置高温报警阈值（可配置）时告警+断电 |
| 过流保护 | 电源故障码监测 | 超过设定值断电 |
| 短路保护 | 电源故障码监测 | 即时断电 |
| 漏电保护 | 漏保 | 快速切断380V输入 |
| 浪涌保护 | 浪涌保护器件 | 吸收浪涌冲击 |
| 烟感保护 | 开关量烟感传感器 | 断开接触器切断380V + 打开喷淋电磁阀 + 告警 |
| 浸水保护 | 开关量浸水传感器 | 断开接触器切断380V + 告警 |
| 门未关报警 | 门磁传感器+计时 | 超过平台设置关门超时阈值（可配置）时上传告警 |

### 8.2 数据安全

| 安全类型 | 措施 |
|---------|------|
| 存储加密 | 用户信息、BMS数据加密存储 |
| 通讯校验 | 1TN和校验 + Modbus CRC16校验 |
| 网络传输 | 自定义TCP协议加密传输 |
| 权限管控 | 管理员/普通用户分级权限 |

### 8.3 防护联动流程

```
[烟感/浸水触发]
    ↓
柜控板检测到开关量变化（中断）
    ↓
烟感触发 → 立即断开接触器（切断充电电源380V输入）+ 打开喷淋电磁阀（简易喷淋）
浸水触发 → 立即断开接触器（切断充电电源380V输入）
    ↓
发送0x81急停指令至所有仓控板(ID1-6)：继电器全部断开
    ↓
柜控板+仓控板仍由12V电源正常供电（预接触器），4G通讯在线
    ↓
所有仓体指示灯切换为红灯（告警）
    ↓
上传告警至后台平台（即时推送）
    ↓
管理员接收通知 → 判断是否为误报警
    ↓
误报警 → 平台下发恢复指令 → 关闭喷淋电磁阀 → 柜控板吸合接触器 → 充电电源恢复供电
    ↓
真实告警 → 现场排查处理 → 灭火后平台关闭喷淋 → 故障排除后恢复
    ↓
各仓体恢复空闲（绿灯常亮）
```

## 9. 性能指标

| 指标 | 要求 |
|------|------|
| 仓控-柜控通讯延迟 | ≤ 0.5s |
| 仓控-电源通讯延迟 | ≤ 0.3s |
| TCP数据上传延迟 | ≤ 1s |
| 指示灯状态切换延迟 | ≤ 0.5s |
| 平台指令执行延迟 | ≤ 1s |
| 门锁响应延迟（平台→开门） | ≤ 1.5s |
| 门磁检测上报延迟 | ≤ 1s |
| OTA升级成功率 | ≥ 99% |
| 烟感→喷淋联动延迟 | ≤ 0.5s |
| 通讯故障率 | ≤ 0.1% |
| MTBF | ≥ 8000小时 |
| 设备故障率 | ≤ 0.5% |
| 继电器寿命 | ≥ 10万次 |
| 指示灯寿命 | ≥ 50000小时 |
| 工作温度 | -10℃ ~ +70℃ |
| 工作湿度 | 10% ~ 90% |
