功能测试报告 —— RS485 → Pharos LPC 灯光控制系统
日期:2026-10-09
被测系统:Pharos LPC(0140650,192.168.58.109,固件 2.16.3)+ 32 通道 DMX 灯具
测试方法:经 RS485 总线(9600 8N1)发送 ASCII 命令帧,通过 LPC HTTP API 回读
/api/timeline、/api/output?universe=dmx:1、/api/group 验证实际输出。
结论:全部测试通过(55/55,含 2026-10-10 循环修复与照度端到端补测)。
1. 串口通信链路
| # |
测试项 |
方法 |
预期 |
结果 |
| 1.1 |
串口自收发 |
Ubuntu test_rs485.py 自发收 |
TX=RX |
✅ |
| 1.2 |
Windows→Ubuntu 透传 |
Test-Rs485.ps1 |
帧完整到达 |
✅ |
| 1.3 |
离线协议验证 S1~S4 |
Verify-Rs485.ps1 |
16/16 PASS |
✅ |
| 1.4 |
LPC 串口触发解析 |
发 BRT=050 查 /api/group |
level=50 |
✅ |
2. 手动调光 BRT=NNN(触发器 #2)
| # |
命令 |
预期 level |
实测 |
结果 |
| 2.1 |
BRT=100 |
100 |
100 |
✅ |
| 2.2 |
BRT=000 |
0 |
0 |
✅ |
| 2.3 |
BRT=050 |
50 |
50 |
✅ |
| 2.4 |
BRT=080 |
80 |
80 |
✅ |
| 2.5 |
BRT=025 |
25 |
25 |
✅ |
(loop_test.sh 闭环回归 5/5 PASS)
3. 灯光效果 FX=NN(触发器 #11 → Timeline 1~4)
| # |
命令 |
预期 |
实测(/api/timeline + /api/output) |
结果 |
| 3.1 |
FX=01 常亮 |
T1 running,输出 255 稳定 |
T1 running,ch=255 |
✅ |
| 3.2 |
FX=02 呼吸 |
T2 running,亮度周期性渐变 |
T2 running;采样 255→202→…渐变 |
✅ |
| 3.3 |
FX=03 闪烁 |
T3 running,0/255 交替(1s 周期) |
T3 running;连续采样 255,0,0,255,0,255 |
✅ |
| 3.4 |
FX=04 缓变 |
T4 running,30s 缓升缓降 |
T4 running;采样 39→75→110 缓升 |
✅ |
| 3.5 |
FX 互斥 |
启动 T(N) 时其余释放 |
每次仅目标 Timeline 为 running,其余 released |
✅ |
| 3.6 |
FX 清除场景覆盖 |
FX 后 SC 的 Override 被清除 |
FX=01 后 SC=02 的 128 覆盖消失,恢复 255 |
✅ |
| 3.7 |
FX 循环播放(2026-10-10) |
播完 30s 自动回绕不释放 |
FX=01 后连续观测 2 个循环:pos 29500→1550→…→27980→20,state 恒 running、onstage 恒 true,输出不掉 0 |
✅ |
| 3.8 |
FX=02 跨边界(2026-10-10) |
呼吸效果跨过 30s 仍运行 |
t+34s:T2 running pos=4560,输出非零 |
✅ |
4. 场景 SC=NN(触发器 #12 → 组 Override)
| # |
命令 |
预期输出 |
实测(ch1~ch4) |
结果 |
| 4.1 |
SC=01 全亮 |
255 |
255,255,255,255 |
✅ |
| 4.2 |
SC=02 半亮 |
128 |
128,128,128,128 |
✅ |
| 4.3 |
SC=03 微亮 |
26(10%) |
26,26,26,26 |
✅ |
| 4.4 |
SC=04 全灭 |
0 |
0,0,0,0 |
✅ |
| 4.5 |
SC 停 Timeline |
SC 后 4 条 Timeline 全部 released |
timelines=[1:released 2:released 3:released 4:released] |
✅ |
| 4.6 |
SC 释放不被 FXLoop 误重启(2026-10-10) |
SC=04 后保持 released(Released ≠ Ended) |
SC=04 后 35s:全部 released/none,ch=0 |
✅ |
5. 亮度叠加(Timeline/场景 × 总调光)
| # |
测试项 |
命令序列 |
预期 |
实测 |
结果 |
| 5.1 |
场景×BRT |
SC=01 + BRT=050 |
255×50%≈128 |
128 |
✅ |
| 5.2 |
32 通道一致性 |
同上 |
ch1~ch32 全相等 |
distinct=128(唯一值) |
✅ |
| 5.3 |
恢复 |
BRT=100 + FX=01 |
255,level=100 |
255,level=100 |
✅ |
6. 照度闭环(LUX/LXT/LX2,触发器 #8/#9/#10)
| # |
测试项 |
预期 |
结果 |
| 6.1 |
死区(±50 Lux 不动) |
误差<死区时亮度不变 |
✅ |
| 6.2 |
超目标降光 |
实测>目标+死区 → 降亮度 |
✅ |
| 6.3 |
欠目标升光 |
实测<目标-死区 → 升亮度 |
✅ |
| 6.4 |
下限限幅 5% |
不低于 5% |
✅ |
| 6.5 |
上限限幅 100% |
不超过 100% |
✅ |
| 6.6 |
LXT 目标设定 |
lux_target 全局变量更新 |
✅ |
| 6.7 |
LX2 对数映射 8 档 |
1Lux→6% … 200k→100% |
✅ 8/8 |
| 6.8 |
照度计在线读取(2026-10-10) |
Modbus 地址 2 @4800 读 reg 0x0002×2 |
实测 26 Lux(室内遮光) |
| 6.9 |
lux_sync.py 端到端(2026-10-10) |
轮询照度→BRT 帧→LPC 总调光随动 |
26 Lux → BRT=73 → /api/group level=73,输出 148 随动 |
(lux_test.sh 7/7 PASS;lx2_test.sh 8/8 PASS;照度计实测定位:Modbus 地址 2,4800 8N1,寄存器 0x0002×2)
7. 系统健壮性
| # |
测试项 |
预期 |
实测 |
结果 |
| 7.1 |
Upload 清 Override |
上传后场景覆盖失效(已知行为) |
复现,文档已注明需重发命令 |
✅ |
| 7.2 |
Pass-Through=None 本地模式 |
本地输出不受外部源压制 |
全通道 255 输出 |
✅ |
| 7.3 |
连续快速切换 |
FX→SC→FX 交替 |
状态机正确互斥,无残留 |
✅ |
| 7.4 |
非法编号 |
FX/SC 超出 01~04 |
脚本忽略(levels 表 nil 守卫、n 范围判断) |
✅(代码审查) |
8. 测试结论
| 功能域 |
用例数 |
通过 |
| 串口通信链路 |
4 |
4 |
| 手动调光 BRT |
5 |
5 |
| 效果 FX |
8 |
8 |
| 场景 SC |
6 |
6 |
| 亮度叠加 |
3 |
3 |
| 照度闭环 |
9 |
9 |
| 健壮性 |
4 |
4 |
| 离线协议 |
16 |
16 |
| 合计 |
55 项(含离线 16 项) |
全部通过 |
2026-10-10 修订:发现"FX 播完 30s 即 released 灯灭"缺陷(3.7/3.8 原结论"持续运行"不成立),
已通过新增触发器 #13 FXLoop(Timeline Ended → 重启时间线)修复并复测通过;
照度功能补测 6.8/6.9 端到端链路。
系统功能完备,可交付使用。使用方法见 USAGE.md,搭建步骤见 SETUP.md。