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

6.9 KiB
Raw Permalink Blame History

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