# 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 分析): 1. **采集闸门**:`lux_value` 全局暴露 → `lux_link_on` 联动开关 → `lux_poll_s` 调节间隔(`os.time()` pcall 兜底,失败退化计数分频) 2. **灵敏度在线辨识**:k = Δlux/Δlevel,按亮度分 5 档(lux_kb[1..5])分别学习;不对称 EMA(k 涨快×0.5、跌慢×0.1)系统性偏高估 → 偏向欠调;限幅时/变化<3 Lux 时不采样防污染 3. **步长计算**:`delta = err/k × lux_agg`,上限 ±20%;|err|<30 Lux 爬行减半 4. **过冲自惩罚**:误差变号 → 该档 k×1.3 + `lux_agg`×0.5 5. **欠调自加速**:连续同向 → `lux_agg`×1.15(上限 0.9) 6. **基准亮度累加器** `lux_cur_level`:避免硬件读回量化吞掉小步长;与实测偏差>5% 自动重同步 7. **输出**:`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 自动化与远程部署工具链 |