# 集控协议转换模块系统 - 技术架构设计

> **文档版本**: v1.0  
> **设计目标**: 基于现有两线集控技术，扩展支持 DALI / DMX512 标准协议  
> **核心价值**: 让智步集控系统无缝接入专业照明控制生态

---

## 一、系统架构概览

```
┌─────────────────────────────────────────────────────────────────┐
│                        智步集控主机                              │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────────────┐  │
│  │  两线集控   │───▶│  协议抽象层  │───▶│   统一串口输出      │  │
│  │  核心系统   │    │  (虚拟节点)  │    │  UART / RS-485      │  │
│  └─────────────┘    └─────────────┘    └─────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                      可插拔协议转换模块                           │
│  ┌─────────────────┐              ┌─────────────────────────┐   │
│  │   DALI 转接模块  │              │    DMX512 转接模块       │   │
│  │  (双线总线)      │              │   (RS-485总线)          │   │
│  └─────────────────┘              └─────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘
                              │
              ┌───────────────┴───────────────┐
              ▼                               ▼
┌─────────────────────────┐      ┌─────────────────────────┐
│      DALI 生态设备       │      │     DMX512 生态设备      │
│  • 双色温驱动器          │      │  • 彩色灯带控制器        │
│  • 调光电源              │      │  • 舞台灯光设备          │
│  • 传感器/面板           │      │  • 建筑亮化灯具          │
└─────────────────────────┘      └─────────────────────────┘
```

---

## 二、主机端设计（智步集控系统扩展）

### 2.1 串口输出协议（主机 ↔ 转接模块）

**物理层**: UART / RS-485，波特率 115200，8N1

**数据帧格式**:

```c
// 帧头(2) + 命令(1) + 节点ID(2) + 数据长度(1) + 数据(N) + 校验(1) + 帧尾(2)
#define FRAME_HEAD      0xAA55
#define FRAME_TAIL      0x55AA

typedef struct {
    uint16_t head;          // 0xAA55
    uint8_t  cmd;           // 命令码
    uint16_t node_id;       // 节点ID (0 = 广播, 1-512 = 具体节点)
    uint8_t  data_len;      // 数据长度
    uint8_t  data[64];      // 数据载荷
    uint8_t  checksum;      // 校验和
    uint16_t tail;          // 0x55AA
} Host_Frame_t;
```

**命令码定义**:

| 命令码 | 名称 | 说明 |
|--------|------|------|
| 0x01 | CMD_SET_COLOR | 设置颜色 RGB/RGBW |
| 0x02 | CMD_SET_CCT | 设置色温 CW |
| 0x03 | CMD_SET_DIM | 设置亮度 |
| 0x04 | CMD_SET_SCENE | 调用场景 |
| 0x05 | CMD_NODE_DISCOVER | 节点发现 |
| 0x06 | CMD_NODE_CONFIG | 节点配置 |
| 0x07 | CMD_SYNC_STATUS | 状态同步 |

**数据载荷示例**:

```c
// RGBW 颜色设置
typedef struct {
    uint8_t r;      // 红色 0-255
    uint8_t g;      // 绿色 0-255
    uint8_t b;      // 蓝色 0-255
    uint8_t w;      // 白色 0-255
} Color_RGBW_t;

// 双色温设置
typedef struct {
    uint16_t cct;   // 色温 2700-6500K
    uint8_t  dim;   // 亮度 0-100%
} Color_CCT_t;
```

### 2.2 虚拟节点管理

**两种工作模式**:

```c
typedef enum {
    MODE_SINGLE_NODE = 0,       // 单节点模式：整组统一控制
    MODE_VIRTUAL_NODES = 1,     // 虚拟节点模式：每个子灯独立控制
} NodeMode_t;

typedef struct {
    uint16_t    node_id;        // 节点ID (DALI: 0-63, DMX512: 1-512)
    NodeMode_t  mode;           // 工作模式
    uint8_t     sub_node_count; // 子节点数量 (虚拟模式下有效)
    uint8_t     sub_node_map[32]; // 子节点映射表
    uint16_t    dali_short_addr;  // DALI短地址
    uint16_t    dmx_start_channel; // DMX起始通道
} Node_Config_t;
```

**虚拟节点映射示例**:

```
场景：一条30灯的灯带，作为1个DALI设备或30个独立DALI设备

┌─────────────────────────────────────────────────────────┐
│  主机视角：1个逻辑节点 (Node_ID = 5)                      │
│  ├─ 子节点 1  → DALI地址 1 或 DMX通道 1-4               │
│  ├─ 子节点 2  → DALI地址 2 或 DMX通道 5-8               │
│  ├─ ...                                                │
│  └─ 子节点 30 → DALI地址 30 或 DMX通道 117-120          │
└─────────────────────────────────────────────────────────┘
```

---

## 三、DALI 转接模块设计

### 3.1 DALI 协议简介

- **物理层**: 双线总线，16.5V 供电兼通信
- **速率**: 1200 bps，曼彻斯特编码
- **地址**: 短地址 0-63，组地址 0-15，广播
- **指令**: 标准指令 (16位) + 扩展指令 (24位)

### 3.2 硬件设计

```
┌─────────────────────────────────────────────────────────────┐
│                    DALI 转接模块                             │
│                                                              │
│  ┌──────────┐      ┌──────────────┐      ┌──────────────┐  │
│  │  UART    │──────▶│   MCU        │──────▶│  DALI        │  │
│  │  RX/TX   │      │  (STM32G0)   │      │  收发器      │  │
│  └──────────┘      │              │      │  (L6571)     │  │
│                    │  - 协议转换  │      └──────────────┘  │
│  ┌──────────┐      │  - 节点管理  │              │          │
│  │  电源    │──────▶│  - 地址分配  │              ▼          │
│  │  5V/3.3V │      └──────────────┘      ┌──────────────┐  │
│  └──────────┘                            │  DALI 总线   │  │
│                                          │  DA+/DA-     │  │
│                                          └──────────────┘  │
└─────────────────────────────────────────────────────────────┘
```

**关键器件**:

| 器件 | 型号 | 功能 |
|------|------|------|
| MCU | STM32G030F6P6 | 主控，64KB Flash，8KB RAM |
| DALI 收发器 | L6571 / BP5011 | DALI 总线接口 |
| 电源 | MP1584 | 5V 降压模块 |

**电路原理图要点**:

```
                    ┌─────────────────┐
    DALI_DA+ ───────┤1  L6571         │
                    │    DALI 收发器  │
    DALI_DA- ───────┤8                │
                    │                 │
    3.3V ───────────┤2 VCC            │
    GND ────────────┤7 GND            │
                    │                 │
    MCU_TX ─────────┤3 TX             │
    MCU_RX ─────────┤4 RX             │
                    └─────────────────┘
```

### 3.3 固件设计

**核心模块**:

```c
// dali_module.h
#ifndef DALI_MODULE_H
#define DALI_MODULE_H

#include <stdint.h>
#include <stdbool.h>

// DALI 指令定义
#define DALI_CMD_OFF                0x00
#define DALI_CMD_UP                 0x01
#define DALI_CMD_DOWN               0x02
#define DALI_CMD_STEP_UP            0x03
#define DALI_CMD_STEP_DOWN          0x04
#define DALI_CMD_RECALL_MAX_LEVEL   0x05
#define DALI_CMD_RECALL_MIN_LEVEL   0x06
#define DALI_CMD_STEP_DOWN_OFF      0x07
#define DALI_CMD_STEP_UP_ON         0x08
#define DALI_CMD_GO_TO_SCENE(n)     (0x10 + (n))
#define DALI_CMD_DIRECT_ARC_POWER   0x20  // 需要 + 8位数据

// 色温控制指令 (DT8)
#define DALI_CMD_SET_TEMPERATURE    0xE0  // 设置色温
#define DALI_CMD_ENABLE_DT8         0xC1  // 启用设备类型8

// 设备类型
#define DALI_DEVICE_TYPE_6          6     // LED 模块
#define DALI_DEVICE_TYPE_8          8     // 色温控制

typedef struct {
    uint8_t short_addr;         // 短地址 0-63
    uint8_t group_mask;         // 组归属位图
    uint8_t device_type;        // 设备类型
    uint8_t min_level;          // 最小亮度
    uint8_t max_level;          // 最大亮度
    uint8_t current_level;      // 当前亮度
    uint16_t current_cct;       // 当前色温
} DALI_Device_t;

// 初始化
void DALI_Init(void);

// 发送标准指令
bool DALI_SendCommand(uint8_t addr, uint8_t cmd);

// 发送直接调光指令
bool DALI_SendDirectArc(uint8_t addr, uint8_t level);

// 发送扩展指令 (DT8 色温)
bool DALI_SendDT8_Temperature(uint8_t addr, uint16_t kelvin);

// 地址分配流程
bool DALI_Commissioning(uint8_t *assigned_addr, uint8_t max_count);

// 轮询状态
void DALI_PollDevices(void);

// 从主机帧处理
void DALI_ProcessHostFrame(const Host_Frame_t *frame);

#endif
```

**协议转换逻辑**:

```c
// dali_converter.c

void DALI_ProcessHostFrame(const Host_Frame_t *frame) {
    uint16_t node_id = frame->node_id;
    
    switch(frame->cmd) {
        case CMD_SET_DIM: {
            uint8_t brightness = frame->data[0];
            // 映射到 DALI 0-254
            uint8_t dali_level = (brightness * 254) / 100;
            DALI_SendDirectArc(node_id, dali_level);
            break;
        }
        
        case CMD_SET_CCT: {
            Color_CCT_t *cct = (Color_CCT_t *)frame->data;
            // 先设置亮度
            uint8_t dali_level = (cct->dim * 254) / 100;
            DALI_SendDirectArc(node_id, dali_level);
            // 再设置色温 (DT8)
            DALI_SendDT8_Temperature(node_id, cct->cct);
            break;
        }
        
        case CMD_SET_COLOR: {
            // DALI DT8 支持 RGBW，但需设备支持
            // 此处可扩展
            break;
        }
        
        case CMD_NODE_DISCOVER: {
            // 启动 DALI 地址分配
            DALI_StartCommissioning();
            break;
        }
    }
}
```

**虚拟节点处理**:

```c
// 当主机发送虚拟节点控制时
void DALI_ProcessVirtualNode(uint16_t parent_id, uint8_t sub_index, 
                              const Host_Frame_t *frame) {
    // 计算实际 DALI 地址
    // 例如：父节点映射到地址 10，子节点 0-29 对应地址 10-39
    uint8_t dali_addr = parent_id + sub_index;
    
    if (dali_addr > 63) {
        // 超出 DALI 地址范围，使用组广播
        uint8_t group = (dali_addr / 16) % 16;
        DALI_SendCommand(0x80 | group, frame->data[0]); // 组广播
    } else {
        DALI_SendDirectArc(dali_addr, frame->data[0]);
    }
}
```

---

## 四、DMX512 转接模块设计

### 4.1 DMX512 协议简介

- **物理层**: RS-485 差分信号
- **速率**: 250 kbps (固定)
- **帧结构**: Break (88μs) + MAB (8μs) + Slot 0 (Start Code) + 最多 512 Slots
- **通道**: 每个设备占用 1-N 个通道（通常 RGB=3, RGBW=4）

### 4.2 硬件设计

```
┌─────────────────────────────────────────────────────────────┐
│                   DMX512 转接模块                            │
│                                                              │
│  ┌──────────┐      ┌──────────────┐      ┌──────────────┐  │
│  │  UART    │──────▶│   MCU        │──────▶│  RS-485      │  │
│  │  RX/TX   │      │  (STM32G0)   │      │  收发器      │  │
│  └──────────┘      │              │      │  (MAX485)    │  │
│                    │  - 协议转换  │      └──────────────┘  │
│  ┌──────────┐      │  - 通道管理  │              │          │
│  │  电源    │──────▶│  - RDM支持   │              ▼          │
│  │  5V/3.3V │      └──────────────┘      ┌──────────────┐  │
│  └──────────┘                            │  DMX512 总线 │  │
│                                          │  D+/D-/GND   │  │
│                                          └──────────────┘  │
│                                                          │
│  ┌──────────┐                                            │
│  │  XLR-3   │◄── 标准DMX接口 (可选)                      │
│  └──────────┘                                            │
└─────────────────────────────────────────────────────────────┘
```

**关键器件**:

| 器件 | 型号 | 功能 |
|------|------|------|
| MCU | STM32G030F6P6 | 主控 |
| RS-485 收发器 | MAX485 / SP3485 | DMX 总线接口 |
| 终端电阻 | 120Ω | 总线匹配 |

**电路原理图要点**:

```
                    ┌─────────────────┐
    MCU_TX ─────────┤1  DI            │
                    │                 │
    MCU_RX ─────────┤2  RO   MAX485   │
                    │                 │
    MCU_DE/RE ──────┤3  DE/RE         │
    3.3V ───────────┤4  VCC           │
    GND ────────────┤5  GND           │
    DMX_D+ ─────────┤6  A             │
    DMX_D- ─────────┤7  B             │
                    └─────────────────┘
    
    A ────┬──[120Ω]──┬── DMX_D+
          │          │
    B ────┴──────────┴── DMX_D-
```

### 4.3 固件设计

**核心模块**:

```c
// dmx512_module.h
#ifndef DMX512_MODULE_H
#define DMX512_MODULE_H

#include <stdint.h>
#include <stdbool.h>

#define DMX512_MAX_CHANNELS     512
#define DMX512_BAUDRATE         250000
#define DMX512_BREAK_US         88
#define DMX512_MAB_US           8

// 起始码
#define DMX512_START_CODE       0x00    // 标准DMX
#define DMX512_RDM_START_CODE   0xCC    // RDM 起始码

typedef struct {
    uint16_t start_channel;     // 起始通道 1-512
    uint8_t  channel_count;     // 占用通道数 (1-4 典型)
    uint8_t  personality;       // 设备个性 (RDM)
    uint8_t  current_values[4]; // 当前通道值
} DMX512_Device_t;

// 初始化
void DMX512_Init(void);

// 发送完整帧
void DMX512_SendFrame(const uint8_t *data, uint16_t length);

// 更新单个通道
void DMX512_SetChannel(uint16_t channel, uint8_t value);

// 更新连续通道
void DMX512_SetChannels(uint16_t start, const uint8_t *values, uint8_t count);

// 从主机帧处理
void DMX512_ProcessHostFrame(const Host_Frame_t *frame);

// RDM 处理 (可选)
void DMX512_ProcessRDM(const uint8_t *rdm_data, uint8_t len);

#endif
```

**协议转换逻辑**:

```c
// dmx512_converter.c

// DMX 帧缓冲区
static uint8_t dmx_frame[DMX512_MAX_CHANNELS + 1]; // +1 for start code

void DMX512_ProcessHostFrame(const Host_Frame_t *frame) {
    uint16_t node_id = frame->node_id;
    
    switch(frame->cmd) {
        case CMD_SET_COLOR: {
            Color_RGBW_t *color = (Color_RGBW_t *)frame->data;
            // 映射到 DMX 通道
            // Node 1 → 通道 1-4, Node 2 → 通道 5-8, ...
            uint16_t ch_start = (node_id - 1) * 4 + 1;
            
            dmx_frame[ch_start + 0] = color->r;
            dmx_frame[ch_start + 1] = color->g;
            dmx_frame[ch_start + 2] = color->b;
            dmx_frame[ch_start + 3] = color->w;
            break;
        }
        
        case CMD_SET_CCT: {
            Color_CCT_t *cct = (Color_CCT_t *)frame->data;
            // CCT 映射到冷暖两路
            // 简化处理：根据色温计算冷暖比例
            uint16_t ch_start = (node_id - 1) * 2 + 1;
            
            uint8_t warm, cool;
            CCT_to_CW(cct->cct, cct->dim, &warm, &cool);
            
            dmx_frame[ch_start + 0] = warm;
            dmx_frame[ch_start + 1] = cool;
            break;
        }
        
        case CMD_SET_DIM: {
            uint8_t brightness = frame->data[0];
            uint16_t ch_start = (node_id - 1) * 1 + 1;
            dmx_frame[ch_start] = (brightness * 255) / 100;
            break;
        }
    }
    
    // 标记需要发送
    dmx_frame_dirty = true;
}

// 定时发送 DMX 帧 (典型 44Hz)
void DMX512_TimerHandler(void) {
    if (!dmx_frame_dirty) return;
    
    // 发送 Break
    DMX512_SendBreak();
    
    // 发送 MAB
    DMX512_SendMAB();
    
    // 发送 Start Code
    UART_SendByte(DMX512_START_CODE);
    
    // 发送数据
    for (int i = 1; i <= max_channel_used; i++) {
        UART_SendByte(dmx_frame[i]);
    }
    
    dmx_frame_dirty = false;
}
```

**虚拟节点处理**:

```c
// 虚拟节点模式下，一个物理设备虚拟出多个 DMX 设备
void DMX512_ProcessVirtualNode(uint16_t parent_id, uint8_t sub_index,
                                const Host_Frame_t *frame) {
    // 例如：父节点起始通道 = 1，每个子节点占 4 通道
    // 子节点 0 → 通道 1-4
    // 子节点 1 → 通道 5-8
    // ...
    uint16_t base_channel = (parent_id - 1) * 4 + 1;
    uint16_t sub_channel = base_channel + sub_index * 4;
    
    if (sub_channel + 3 > DMX512_MAX_CHANNELS) return;
    
    Color_RGBW_t *color = (Color_RGBW_t *)frame->data;
    dmx_frame[sub_channel + 0] = color->r;
    dmx_frame[sub_channel + 1] = color->g;
    dmx_frame[sub_channel + 2] = color->b;
    dmx_frame[sub_channel + 3] = color->w;
    
    dmx_frame_dirty = true;
}
```

---

## 五、主机端固件扩展

### 5.1 协议抽象层

```c
// protocol_abstraction.h

// 设备能力描述
typedef struct {
    uint8_t  protocol_type;     // PROTO_DALI / PROTO_DMX512
    uint8_t  supports_rgbw:1;   // 支持彩色
    uint8_t  supports_cct:1;    // 支持双色温
    uint8_t  supports_dim:1;    // 支持调光
    uint8_t  max_virtual_nodes; // 最大虚拟节点数
    uint8_t  channel_count;     // 占用通道数
} DeviceCapability_t;

// 协议管理器
typedef struct {
    uint8_t module_type;        // MODULE_DALI / MODULE_DMX512
    DeviceCapability_t caps;
    void (*send_frame)(Host_Frame_t *frame);
    void (*discover_nodes)(void);
    void (*set_virtual_mode)(uint16_t node_id, uint8_t count);
} ProtocolManager_t;

// 注册协议模块
void Protocol_RegisterModule(ProtocolManager_t *module);

// 发送命令到指定协议
void Protocol_SendCommand(uint8_t protocol, Host_Frame_t *frame);
```

### 5.2 配置界面（小程序/APP 扩展）

```json
{
  "node_config": {
    "node_id": 5,
    "name": "客厅灯带",
    "protocol": "dali",
    "mode": "virtual_nodes",
    "virtual_count": 30,
    "dali_config": {
      "short_addr_start": 10,
      "device_type": 8
    },
    "dmx_config": {
      "start_channel": 1,
      "channel_mode": "rgbw"
    }
  }
}
```

---

## 六、开发计划建议

### 第一阶段：基础验证 (2-3周)

1. **DALI 模块验证**
   - 搭建测试板（STM32 + L6571）
   - 实现基本指令收发
   - 对接现有 DALI 驱动器测试

2. **DMX512 模块验证**
   - 搭建测试板（STM32 + MAX485）
   - 实现 DMX 帧发送
   - 对接舞台灯/控制器测试

### 第二阶段：协议整合 (2-3周)

1. **主机端扩展**
   - 添加串口输出协议
   - 实现虚拟节点管理
   - 配置界面开发

2. **转接模块完善**
   - 地址分配流程
   - 状态反馈机制
   - 错误处理

### 第三阶段：产品化 (2-3周)

1. **硬件优化**
   - PCB 设计
   - 外壳设计
   - 生产测试

2. **固件优化**
   - 稳定性测试
   - 性能优化
   - OTA 升级支持

---

## 七、应用场景示例

### 场景1：智能酒店客房

```
┌─────────────────────────────────────────────────────────┐
│  酒店客房控制系统                                        │
│  ├─ 床头灯 (DALI 双色温)                                │
│  ├─ 阅读灯 (DALI 调光)                                  │
│  ├─ 氛围灯带 (DMX512 RGBW)                              │
│  └─ 窗帘电机 (DALI 继电器模块)                          │
│                                                          │
│  智步主机 ──DALI模块──▶ DALI 总线                       │
│         ──DMX模块───▶ DMX512 总线                       │
└─────────────────────────────────────────────────────────┘
```

### 场景2：商业空间照明

```
┌─────────────────────────────────────────────────────────┐
│  商场/展厅照明系统                                       │
│  ├─ 主照明 (DALI 双色温，统一控制)                       │
│  ├─ 展柜灯带 (DMX512 RGBW，单灯独立控制)                 │
│  └─ 氛围灯 (DMX512 彩色，场景联动)                       │
│                                                          │
│  智步主机 ──DMX模块──▶ 虚拟30节点 ──▶ 30个独立DMX设备   │
└─────────────────────────────────────────────────────────┘
```

---

## 八、参考资源

### DALI 相关
- **IEC 62386** - DALI 国际标准
- **DALI-2 认证** - 互操作性认证
- **DT8 (Device Type 8)** - 色温控制扩展

### DMX512 相关
- **ANSI E1.11** - DMX512 标准
- **ANSI E1.20** - RDM (远程设备管理)
- **Open Lighting Architecture** - 开源实现参考

### 芯片选型
- **STM32G0** - 低成本 ARM Cortex-M0+
- **L6571** - ST DALI 收发器
- **MAX485** / **SP3485** - RS-485 收发器

---

*文档生成时间: 2026-06-11*  
*设计: 微智电子智能助手*  
*状态: 初版待评审*
