rs485-lpc/DESIGN.md
2026-10-10 21:08:23 +08:00

108 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 自动化与远程部署工具链 |