rs485-lpc/rs485_verification_plan.md

12 KiB
Raw Blame History

Pharos LPC RS485 串口链路验证 —— 设计与实施计划

目标:PC(USB-485)与 Pharos LPC 控制器共用一条 RS485 总线,实测验证 PC 发命令 → LPC Serial Input 触发器 → Lua 脚本 → 时间线(场景)整体亮度调节 全链路, 以及 LPC→PC 反向应答。判据 = LPC 实际行为(灯光变化 / 日志 / 回包),非文档推断。


0. 前置条件

项 动作 状态
P1 USB-485 插在 Ubuntu(192.168.58.7):/dev/ttyUSB0 = FTDI FT232R(S/N B002S2QN),用户在 dialout 组,pyserial 可用 ✅ 已通
P2 Windows 本机只做离线验证与远程驱动(Posh-SSH/SSH 免密已打通);Windows 板载 COM1~6 与 USB-485 无关(已实测:全为 ACPI\PNP0501) ✅ 已确认
P3 LPC 上电联网,Designer 2 项目可烧录;串口模式选 RS-485,波特率两端一致(先 9600) 待执行
P4 项目内已建测试时间线 1~3(场景素材),可通过 HTTP API 或触发器手动启动 待执行
P5 接线:USB-485 A/B/G ↔ LPC 端子 A(−)/B(+)/G,共地 待执行
P6 参考依据:Serial_Integration.pdf(触发器/缓冲匹配机制)、Pharos Scripting Guide(variable[1]、get_timeline()) 已读

1. 系统架构与接口定义

PC (Test-Rs485.ps1) ──USB── USB-485 ──A/B/G── RS485 总线 ──A/B/G── LPC 串口
     主站,只发命令+收应答                        Serial Input 触发器 → Lua → set_intensity

1.1 命令协议(ASCII,行尾 \n=0x0A 作帧界)

命令 方向 含义 LPC 侧响应
BRT=NNN\n PC→LPC 组 0 整体亮度 = NNN%(3 位补零) 触发器 #2 挂 lpc_serial_brt.lua
LUX=NNNNNN\n →LPC 实测照度 0~200000 Lux(6 位补零)→ 闭环自动调光 触发器 #8 挂 lpc_serial_lux.lua
LXT=NNNNNN\n →LPC 设定目标照度(全局变量 lux_target,默认 500) 触发器 #9 挂 lpc_serial_lxt.lua

注:早期设想的固定五档 BRT_x、OK\n 应答、备选时间线方案均未采用;实测语法以 §6.4 为准。

1.2 LPC 触发器配置(实际部署)

# 类型 Match string 动作
2 Serial Input BRT=<3d> Run Script(Quick Script = lpc_serial_brt.lua)
8 Serial Input LUX=<6d> Run Script(lpc_serial_lux.lua)
9 Serial Input LXT=<6d> Run Script(lpc_serial_lxt.lua)

lpc_serial_brt.lua 实际内容见本目录文件(Designer 2 用 get_trigger_variable(1), variable[1] 为 v1 旧语法已废弃)。


2. 验证项分解(判据=实测)

ID 类型 验证内容 方法 PASS 判据
S1 离线 测试工具帧编码正确 Verify-Rs485.ps1:BRT=80\n → 7 字节含 0x0A,转义替换逻辑与工具一致 字节序列 42 52 54 3D 38 30 0A ✓
S2 离线 行帧解析正确 多行混入 \r\n 混合行尾的缓冲拆分 每行完整、无串包 ✓
S3 离线 Lua 脚本结构完备 静态检查:引用 variable[1]、边界钳位、对每条时间线调用 set_intensity 检查项全过 ✓
S4 离线 工具参数模式完备 -ListPorts/-Send/-Listen/-Interactive 帮助与执行路径 各模式可运行 ✓
H1 硬件·单机 USB-485 发送路径 已执行:端口打开/写入无错,无自回显(FT232+自动收发适配器不发回显属正常,判 TX 通需上真机) ✅ TX 路径 OK
H1b 硬件·总线 被动监听总线流量 已执行:9600 波特率监听 5s 总线静默(LPC 未发包/未接入)
H2 硬件·总线 链路通 + 固定档触发 发 BRT_50\n LPC 触发器日志出现对应触发;灯光变化
H3 硬件·总线 A/B 极性 H2 无反应时对调 A/B 重测 对调后 H2 通过
H4 硬件·总线 连续调光 + 通配符捕获 循环发 BRT=0,25,50,75,100 灯光台阶变化;variable[1] 数值正确
H5 硬件·总线 连续扫描鲁棒性 0→100 步进 5 循环 3 遍,行间隔 100ms 全部命中无丢帧(串行缓冲匹配→清空机制下无粘包)
H6 硬件·总线 反向应答 触发器挂 Output Serial OK\n,PC -Listen 3 PC 收到 OK
N1 负例 波特率不一致 双端 9600/115200 错配 收乱码或无触发(预期现象,作对照)
N2 负例 串口模式误设 RS232 模式错配 无触发(预期现象)

3. 执行阶段

  • 阶段0 离线(本机即可):运行 Verify-Rs485.ps1 → S1~S4 全 PASS。
  • 阶段1 单机:USB-485 单独接总线 → H1(确认 PC 发送路径)。
  • 阶段2 打通:接入 LPC → P3 配置 → H2/H3(固定档,先证明物理链路与触发机制)。
  • 阶段3 连续调光:H4 → H5(通配符 + Lua 连续值)。
  • 阶段4 反向与负例:H6 应答;N1/N2 记录对照现象。
  • 阶段5 收尾:实测结论回填本表状态列,修正文档中"以版本说明为准"的待确认项 (通配符语法、set_intensity 可用性、老 DE-9 机型跳线)。

4. 风险与对策

风险 对策
A/B 标各厂家不统一,接反无响应 H3 对调实验,1 分钟排除
通配符语法随版本差异 首测用固定档触发器(零语法依赖),再看 Log Console 中实际收到的字节核对 Match string
串行缓冲粘包/半包(连续发送过快) 帧尾 \n + 行间隔 ≥100ms;H5 专门验证
RS485 半双工冲突 约定 PC 为主站,LPC 仅应答,不同时发送
set_intensity 不可用 备选:多条固定亮度时间线副本切换(§1.2)
老 LPC(DE-9)RS485 为跳线配置 查对应安装指南;验证前确认跳线
USB-485 被其他程序占用 探测工具报告"端口被占",先关 SymphoLight 等软件

6. 实测发现与自动闭环验证(2026-10-09 更新)

6.1 已确认的环境事实

项 结果
LPC 位置 192.168.58.109(Web 标题 Pharos LPC 0140650,MAC 00:13:B2:01:39:1A)
HTTP API 免认证可用;GET /api/timeline、GET /api/group、GET /api/trigger、POST /api/timeline(HTTP 204)实测通过
项目内容 1 条时间线(Timeline 1,未运行);1 个组:num=0 "All Fixtures"(level:100);触发器仅 1 个 Startup(eDMX 直通)——无串行触发器
亮度 API 修正 Lua Timeline 对象无 set_intensity;正确做法 = get_group(n):set_master_intensity(level[,fade[,delay]])(0.0~1.0),/api/group 的 level 字段可回读 → 闭环判据
灯具 /api/fixtures 返回空 —— 调组亮度可能无可见光效,但 level 回读仍可全自动判定

6.2 闭环自动验证(Ubuntu 上 loop_test.sh)

发送 BRT=<v> (RS485) → sleep 1 → GET /api/group 读 level → 与 v 比对 → PASS/FAIL
用法: bash loop_test.sh 80   (单点)
      bash loop_test.sh loop (扫 100/0/50/80/25 汇总 PASS/FAIL)

6.3 最终验证结果(2026-10-09 全部通过)

验证项 结果
离线 S1~S4 ✅ 16/16 PASS(Verify-Rs485.ps1)
H1 RS485 发送路径 ✅(FT232R 无自回显属正常,LPC 日志证实收包)
H2/H3 链路+触发 ✅ LPC 日志 "RS485 input (N bytes)" + "Trigger 2 (Serial Input)"
H4/H5 连续调光+鲁棒性 ✅ loop_test.sh:PASS=5 FAIL=0(100/0/50/80/25)
H6/N1/N2 按需(协议已闭环,负例未单测)

6.4 实测确认的关键语法(文档未载,逆向自 pharos_designer.exe)

项 结论
串行通配符 尖括号语法 <...>:<3d> = 恰好 3 位数字;类型 [cCdDxXsS];可带 <n,type> 变体;<d> 仅匹配 1 个字符;? * # % 均为普通字符
触发变量 Designer 2 用 get_trigger_variable(1)(v1 的 variable[1] 已废弃)
亮度 API Timeline 无 set_intensity;用 get_group(n):set_master_intensity(level)
最终协议 PC 发 BRT=NNN\n(3 位补零,0~100)→ 组 0 整体亮度 = NNN%
照度协议 发 LUX=NNNNNN\n(6 位补零,0~200000 Lux,仁科大量程)→ 闭环自动调光(lpc_serial_lux.lua);LXT=NNNNNN\n 设定目标照度(默认 500 Lux,全局变量 lux_target)
照度实测 2026-10-09 闭环验证通过:BRT=050→level 50;LXT=000300 设目标 300 Lux;LUX=001000(超目标)→ 亮度 50→30(降 20% 步进);LUX=000100(低于目标)→ 30→50(升 20%),方向与步进均正确。触发器 #8 Lux Auto Dim / #9 Lux Target Set 已上传 LPC
LX2 指示模式 触发器 #10 Lux Display Map LX2=<6d>:照度→亮度对数映射 level=log(lux+1)/log(200001)(0.5s 渐变),灯即照度计;lx2_test.sh 8/8 PASS(0/10/100/500/1k/10k/100k/200k Lux → 0/20/38/51/57/75/94/100%)
仁科寄存器 大量程 0~200000 Lux 型用 32 位寄存器对 0x0002(hi)/0x0003(lo),单位 1 Lux(esp32-voice src/config.rs MODBUS_ILLUMINANCE_REG=0x0002, COUNT=2;poll_illuminance() in src/modbus/master.rs);0~65535 型 reg 0x0006 单位 1 Lux
工具链 Designer 2 GUI 全程自动化操作(截图视觉闭环 + SendKeys/剪贴板);Download/Upload 同步项目

API 无法增改项目触发器,须在 Designer 2 中完成并上传:

  1. LPC 设置:Serial Port → 模式 RS-485,波特率 9600(已完成)
  2. 触发器:#2 BRT=<3d>、#8 LUX=<6d>、#9 LXT=<6d>,各挂对应 Quick Script(已完成并上传)
  3. 回归:bash loop_test.sh loop(BRT 5 项)+ bash lux_test.sh(照度闭环 7 项)

7. 附录

7.1 工程文件

文件 用途
test_rs485.py Ubuntu 侧主工具(pyserial):-l 枚举 / -s 发送 / -w 监听 / -i 交互
Test-Rs485.ps1 Windows 备用工具(当前无 USB-485,仅保留)
lpc_serial_brt.lua / lpc_serial_lux.lua / lpc_serial_lxt.lua LPC 触发器 #2/#8/#9 Quick Script
Verify-Rs485.ps1 Windows 离线验证 S1~S4(已通过 16/16)
loop_test.sh / lux_test.sh Ubuntu 闭环回归:BRT 5 项 / 照度 7 项(均已 PASS)
api_smoke.sh LPC HTTP API 冒烟测试
0140650.pd2 Designer 2 项目文件(已上传 LPC)
ui.ps1 / Run-Remote.ps1 / Get-Remote.ps1 GUI 自动化 / SSH 远程执行 / SFTP 下载
docs/ 仁科 20w 说明书 PDF + Modbus 帧格式实测笔记

7.2 常用命令(Ubuntu 192.168.58.7)

# 枚举串口,确认 /dev/ttyUSB0 存在且权限可读(不在 dialout 组时用 sudo)
python3 test_rs485.py -l

# H1 单机自发自收(确认适配器 TX 路径)
python3 test_rs485.py -p /dev/ttyUSB0 -b 9600 -s 'BRT=80\n' -w 2

# 手动亮度 / 交互
python3 test_rs485.py -p /dev/ttyUSB0 -b 9600 -s 'BRT=080\n' -w 3
python3 test_rs485.py -p /dev/ttyUSB0 -b 9600 -i

# 照度闭环:设目标 500 Lux / 上报实测照度
python3 test_rs485.py -p /dev/ttyUSB0 -b 9600 -s 'LXT=000500\n'
python3 test_rs485.py -p /dev/ttyUSB0 -b 9600 -s 'LUX=001000\n'

# 回归
bash loop_test.sh loop   # BRT 5 项
bash lux_test.sh         # 照度闭环 7 项

# 无 pyserial 时
sudo apt install python3-serial

7.3 参考资料