6.9 KiB
6.9 KiB
RS485-Pharos LPC 智能照明控制系统 — 概要设计
版本:2026-10-10 | 仓库:http://www.kanghexin.work:3000/tonycao/rs485-lpc.git
1. 系统概述
以 Pharos LPC 控制器为核心的自治照度闭环调光系统。LPC 直接通过 RS485(Modbus RTU) 采集光照度,在控制器本地运行自适应闭环算法调节 DMX 灯具亮度,无需上位机参与控制;Ubuntu 服务器仅承担监控、历史记录与网页控制台(通过 LPC HTTP API 下发参数)。
2. 总体架构
┌─────────────────────────────────────────────┐
│ RS485 总线 (4800 8N1) │
│ 光照传感器(地址2) ◄────► LPC 串口(主机轮询) │
└─────────────────────────────────────────────┘
│
┌──────────────┐ HTTP ▼
│ 浏览器 │◄────────┐│
└──────▲───────┘ ││ ┌──────────────────────────────────┐
│ HTTP :8090 ││ │ Pharos LPC 192.168.58.109 │
┌──────┴───────────────┐ ││ │ ┌──────────────────────────────┐ │
│ Ubuntu 192.168.58.7 ├─┘│ │ │ Trigger #14 LuxPoll │ │
│ lpc_web.py (Flask) │ │ │ │ 每秒发 Modbus 读帧 │ │
│ - /send 指令转发 │ │ │ │ Trigger #15 LuxIn │ │
│ - /luxlink 联动开关 │ │ │ │ 解析响应 → 自适应闭环 → 调光 │ │
│ - /history 历史记录 │ │ │ │ Trigger #2/#8-#13/#16-#20 │ │
└──────┬───────────────┘ │ │ │ 参数设置/手动指令/联动开关 │ │
│ HTTP API │ │ └──────────────┬───────────────┘ │
└───────────────────┴──┤ DMX/eDMX 输出 → 灯具 │
└──────────────────────────────────┘
设计原则:控制闭环全部下沉到 LPC(断网上位机不影响调光);上位机与网页只做监控和参数注入。
3. 硬件与链路
| 项 | 配置 |
|---|---|
| 控制器 | Pharos LPC(SN 0140650,FW 2.16.3,IP 192.168.58.109) |
| 传感器 | 仁科光照度传感器,Modbus RTU 地址 2,输入寄存器 0x0002(32 位 lux) |
| 总线 | RS485,4800 8N1;LPC 串口独占主机,Ubuntu USB-485 已停用(避免双主机冲突) |
| 上位机 | Ubuntu 192.168.58.7,运行 lpc_web.py(:8090) |
4. LPC 触发器设计(Designer 项目 0140650.pd2)
| # | 名称 | 类型/匹配 | 功能 |
|---|---|---|---|
| 1 | Startup | 启动 | eDMX pass-through |
| 2 | BRT | Serial BRT=<2d> |
手动亮度 |
| 8 | LUX | Serial LUX=<3d> |
手动目标照度(旧) |
| 9 | LXT | Serial LXT=<6d> |
设定目标照度 lux_target |
| 10 | LX2 | Serial LX2=<6d> |
显示映射 |
| 11/12 | FX/SC | Serial | 效果/场景选择 |
| 13 | FXLoop | Timeline Ended | 效果循环 |
| 14 | LuxPoll | Real Time 每秒 | Output Serial 发 02 03 00 02 00 02 65 F8 |
| 15 | LuxIn | Serial hex 020304<4c><2c> |
闭环主脚本 lpc_modbus_lux.lua |
| 16/17 | LuxLinkOn/Off | Serial LLON/LLOFF |
联动开关 lux_link_on |
| 18 | LuxFadeSet | Serial FAD=<4d> |
渐变时间 lux_fade(0.1s 单位) |
| 19 | LuxPeriodSet | Serial PER=<4d> |
调节间隔 lux_poll_s(1~60s) |
| 20 | LuxDeadbandSet | Serial DBD=<4d> |
死区 lux_deadband(1~1000,默认 1) |
所有触发器均可 HTTP 触发:POST /api/trigger?num=N&var=V。
5. 闭环控制算法(#15 LuxIn)
采用自适应逆模型控制 + 分段增益调度 + 保守阻尼(对比 PID/bang-bang 后选定,见 SUMMARY 分析):
- 采集闸门:
lux_value全局暴露 →lux_link_on联动开关 →lux_poll_s调节间隔(os.time()pcall 兜底,失败退化计数分频) - 灵敏度在线辨识:k = Δlux/Δlevel,按亮度分 5 档(lux_kb[1..5])分别学习;不对称 EMA(k 涨快×0.5、跌慢×0.1)系统性偏高估 → 偏向欠调;限幅时/变化<3 Lux 时不采样防污染
- 步长计算:
delta = err/k × lux_agg,上限 ±20%;|err|<30 Lux 爬行减半 - 过冲自惩罚:误差变号 → 该档 k×1.3 +
lux_agg×0.5 - 欠调自加速:连续同向 →
lux_agg×1.15(上限 0.9) - 基准亮度累加器
lux_cur_level:避免硬件读回量化吞掉小步长;与实测偏差>5% 自动重同步 - 输出:
grp:set_master_intensity(new, lux_fade),限幅 5%~100%
实测:下行 478→300、上行 300→450 均单调无过冲,3~5 步收敛;稳态波动 ±2 Lux(传感器噪声底)。
Lua 全局变量(GET /api/lua?variables=... 可读):lux_value lux_target lux_deadband lux_fade lux_poll_s lux_link_on lux_k/lux_kb lux_agg lux_cur_level。
6. 上位机与网页控制台(lpc_web.py :8090)
| 端点 | 功能 |
|---|---|
POST /send?cmd=XXX=N |
转发 POST /api/trigger?num=N&var=V(映射 BRT:2 LUX:8 LXT:9 LX2:10 FX:11 SC:12 FAD:18 PER:19 DBD:20) |
GET/POST /luxlink |
联动开关(#16/#17)+ 返回 {on,lux,target,fade,period,deadband} |
GET /history |
历史曲线数据(后台定时采集 lux_value 记录 history.jsonl) |
网页"照度联动"卡:开关、目标照度、轮询周期、渐变时间、死区均可调,即改即生效。
7. 关键设计约束与教训
- LPC Lua 不能直接调
os.time()(静默中断),必须 pcall 兜底 - 上传项目后 Timeline 全停、Lua 全局清零 → 须重启 T1(
POST /api/timeline {"action":"start","num":1}) - RS485 总线只能单主机;Ubuntu 侧串口轮询脚本已全部停用
- 目标照度不能超过灯具物理上限(100% 亮度 ≈ 480 Lux,夜间无环境光时)
8. 文件清单
| 文件 | 说明 |
|---|---|
lpc_modbus_lux.lua |
#15 闭环主脚本(当前运行版本) |
lpc_lux_fade/period/deadband.lua |
#18/#19/#20 参数脚本 |
lpc_serial_*.lua / lpc_fxloop.lua |
#2/#8/#9/#10/#11/#12/#13 脚本 |
lpc_web.py |
网页控制台(部署于 Ubuntu ~/rs485-lpc/) |
0140650.pd2 |
Designer 项目归档(实体在 C:\Users\tonycao\Documents\) |
SETUP/USAGE/SUMMARY/TEST_REPORT.md |
部署/使用/演进/测试文档 |
ui.ps1 Run-Remote.ps1 等 |
Designer GUI 自动化与远程部署工具链 |