From 74a0cac548d4f5579e53397a0dabfc45b80e2d88 Mon Sep 17 00:00:00 2001 From: tonycao Date: Sat, 10 Oct 2026 21:08:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A6=82=E8=A6=81=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=96=87=E6=A1=A3=20DESIGN.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DESIGN.md | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 DESIGN.md diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..391fc76 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,107 @@ +# 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 自动化与远程部署工具链 |