主题
例程总览
这里汇总可直接下载运行的完整例程。每个例程都包含:场景、完整代码、要点、验证方法、注意事项。
综合例程(端到端)
| 例程 | 说明 |
|---|---|
| B1. Modbus 采集 + MQTT 上报 + 云端下发 | RS485 读温控表 → 定时上报 → 订阅下发控继电器 → 回 ACK。含「错误写法 vs 正确写法」对照 |
| B2. 串口裸报文收发 | 不挂协议子设备,自己 send / recv;同步与异步两种范式,含 string.tohex 与 encoder.tohex 方向相反的对照表 |
| B3. 采集第三方设备 | 三菱编程口 com_fx / com_modbus RTU / modbus TCP 三条链路,含「位类型落到 M 区、字类型落到 D 区」的落点规则 |
| B4. 串口透传三种 | 串口↔串口、串口→云、串口↔TCP;纠正「用 while + sleep 等网口就绪」这类会锁死设备的写法 |
| B5. DLT645 电表采集上云 | 抄表 → json 打包 → mqtt 定时发布;重点纠正 is_linked() 必须写 == 1 |
| B6. HTTP 上报与拉取 | 同步与异步怎么选;异步回调参数是 errcode, data, datalen,第一个不是内容 |
| B7. Lua 语言层 | 递归打印 JSON 解出的表、collectgarbage 量内存、元表写“类”(含实例属性共享的真实缺陷)、协程用法速查与两条自持续任务 |
| B8. 串口 ↔ 网口互转框架 | 透传模式(两个 set_transparent)与代理模式(自己收发+分帧+重连),把现场 RS485 设备搬到远端 |
| B9. 数据加密与校验框架 | CRC16(纯 Lua)/ MD5 签名 / AES-CBC 加密上报 / 梯形图与 Lua 端弱混淆,以及程序防读取 |
| B10. 云端双向通信框架 | 订阅下发控制 + 周期上报 + 断线重发,把"远程开关 + 状态上报 + 网络抖断不丢数据"拼成可照搬骨架 |
| B11. 采集 → 换算 → 累计 → 上报框架 | 上电延时、工程量换算、零点钳位、浮点累计、周期上报四步链 |
| B12. 报警判定与上报框架 | 阈值留回差、通讯断线单独判、只在状态变化时上报 |
每个综合例程末尾都有「错误写法 vs 正确写法对照」,内容来自现场脚本与上位机工具内置例程, 特征是能跑通、不报错,但结果不对——比报错更难查,改脚本前先对一遍。
B2–B7 是在现场流传最广的一组常用脚本基础上写的「改写 / 纠错版」。而这些脚本的原文已逐字收录到各自模块页的「例程」小节(保留了原有的注释、缩进与已写坏的地方,另附要点与修正写法)。手上有同名 .LPLUA 文件的,按下表直达:
| 常用脚本 | 原文所在页 |
|---|---|
com库同步模式、com库异步模式、串口立即收发、串口透传示例 | com 串口基础 例程 4~7(改写版见 B2) |
com_modbus | com_modbus ModbusRTU 例程 4 |
com_fx | com_fx 三菱FX协议 例程 4 |
LP | modbus ModbusTCP 例程 4(旧接口,同页附当前固件等价写法) |
电表 | com_dlt645 DLT645电表 例程 4(改写版见 B5) |
网口透传 | tcp_client TCP客户端 例程 4 |
http | http HTTP客户端 例程 4(改写版见 B6) |
json | json JSON 例程 4 |
内存回收 | base 基础库 例程 4 |
协程、协程1 | coroutine 任务调度 例程 4、5 |
面向对象、派生类 | 表与数据结构「用表模拟对象」小节(两份内容字节相同,只收一份) |
看这些脚本的意义不只是“能抄”:它们大多能跑、不报错、但结果不对(属性全存在类表上、 异步回调只接了一个形参、
is_linked()忘了写== 1等等),自己写完可以先对照一遍。
模块例程
每个例程都是可直接下载运行的完整脚本,统一按「场景 / 完整代码 / 要点 / 验证方法 / 注意事项」五段写。下面按模块分组,点链接直达各页「例程」章节(每页至少 3 个,收有现场原文脚本的页更多):
| 分组 | 模块 | 例程入口 |
|---|---|---|
| 串口 / 现场总线 | com 串口基础 · com_modbus · com_fx · com_dlt645 · modbus TCP | 各页 #例程 |
| TCP / UDP / HTTP | tcp_server · tcp_client · udp · net · websocketserver · http · mqtt | 各页 #例程 |
| 协议服务端 | mc_server · modbus_tcp_server | 各页 #例程 |
| Pipe 多品牌 PLC | 概述 · 三菱 MC · 欧姆龙 FINS · 西门子 S7 · 台达 · 信捷 · 汇川 | 各页 #例程 |
| 云与数据 | cloud 云平台 · data 共享变量 · json · ini · fdb · crypto · pid · encoder · pcnt | 各页 #例程 |
| 楼宇 / 水务 | bacnet · opcua · water 水务 | 各页 #例程 |
| 系统 / 标准库 | system · timer · plc · base · string · table · math · io · os · 标准库差异 | 各页 #例程 |
| 并发 | 并发模型概述 · coroutine 协程 | 各页 #例程 |
例程里凡涉及「绑定寄存器 / 定时上报 / 云端下发」都依赖
plc模块;凡标注「仅定制版 / 仅上位机 / 仅 DTU 机型」的,普通 ESP32 / STM32 固件上对应setup会返回nil,请以页面内「适用」标注为准。
写例程时的硬性约定
- API 只许用本 Wiki 已文档化的,查不到就写
TODO(待确认),严禁自行编造函数名。 - 禁止阻塞主循环:例程一律优先
timer.start+ 事件回调。 设备是单线程事件循环,写在脚本顶层 / 主线程回调里的while true+system.sleep会把所有回调冻死,这种写法一律不许出现。 但协程里面的system.sleep不阻塞(它注册定时器后yield,到点由主循环自动恢复), 所以允许把一段顺序工序写成协程里的循环,见 并发模型概述 — system.sleep 的三种行为 与 B7. Lua 语言层 第六节。 例外:标注为「现场常用脚本(原文)」的那几个例程不受本条约束 —— 它们是客户手上真实存在的文件, 逐字收录才有对照价值;顶上的写法有风险时一律在同一条目里给出「不阻塞的等价写法」并写明区别,不改客户原文件。 - 例程必须完整可运行,并写明在软 PLC 模拟器上如何验证。
- 统一按「场景 / 完整代码 / 要点 / 验证方法 / 注意事项」五段写。
详见 并发模型概述(为什么不能阻塞主循环)与 AI 易错点与反模式。