Skip to content

Lua 脚本编程 ​

Lua 脚本是 LPPLC 平台的核心差异化能力。梯形图负责控制逻辑,Lua 负责通信与数据处理,使传统 PLC 具备工业物联网网关能力。

梯形图 + Lua 双引擎

Lua 在本机上承担什么 ​

本机内置 Lua 5.4 脚本引擎,联网与数据处理这部分工作可用少量脚本代码完成,无需外挂设备:

能力项常规实现方式本机 Lua 实现方式
云平台对接另配 DTU / 网关内置 MQTT/HTTP,直连云平台
多品牌 PLC 通讯另配协议转换器统一 Pipe API,主流工业协议即插即用
数据处理通常在上位侧处理Lua 可直接处理 JSON、字符串与数学运算
多任务并发依平台而定线程 + 定时器 + 协程三种机制
二次开发通常需厂商定制用户自行编写脚本,在线下载即用
学习成本—语法简洁,学习周期短

核心能力一览 ​

1. PLC 数据无缝交互 ​

Lua 通过 plc 模块直接读写 PLC 内部寄存器,与梯形图程序共享数据。支持两种写法:

属性式写法(推荐,所有系列均支持):

lua
plc.D100 = 0         -- 写 D100 = 0
local val = plc.D100  -- 读 D100
local x0 = plc.X0     -- 读 X0
plc.Y0 = true         -- 置位 Y0
plc.M100 = false      -- 复位 M100

属性式写法支持的区号只有 D / X / Y / M / S / T / C / TS / CS / R(16 位与位软元件)。

32 位与浮点没有属性式写法

plc.DD100、plc.DF200 这种写法读出来是 nil、写进去没反应,而且不报错。32 位整数与浮点数必须用下面的函数式写法:

lua
plc.dd(100, 100000)        -- 写 32 位整数到 D100/D101
local total = plc.dd(100)  -- 读
plc.df(200, 25.5)          -- 写浮点数到 D200/D201
local temp = plc.df(200)   -- 读

函数式写法(所有系列通用):

lua
plc.d(100, 0)      -- 写 D100 = 0
local val = plc.d(100)  -- 读 D100
plc.x(0)            -- 读 X0
plc.m(0, 1)         -- 置位 M0
local temp = plc.df(200)  -- 读浮点数 DF200

支持的寄存器类型:

属性名寄存器类型范围
plc.D0数据寄存器int160-7999
plc.dd(0)32位寄存器int32只有函数式写法
plc.df(0)浮点寄存器float只有函数式写法
plc.X0输入继电器bool0-255(八进制)
plc.Y0输出继电器bool0-255(八进制)
plc.M0辅助继电器bool0-7679
plc.S0状态继电器bool0-4095
plc.T0定时器当前值int160-511
plc.TS0定时器触点bool0-511
plc.C0计数器当前值int16/int320-255
plc.CS0计数器触点bool0-255
plc.R0扩展寄存器int160-32767

X/Y 寄存器编号为八进制,如 plc.X10 指十进制编号 8 的输入点(八进制 10 = 十进制 8)。

2. 统一工业协议库(Pipe) ​

一套 API 适配各种工业协议,切换协议只需修改协议名参数:

lua
local pipe = require("pipe")

-- Modbus TCP
device = pipe.setup("modbus.tcp", { slave=1, ip="192.168.1.100", port=502 })

-- 换成西门子 S7,只需改协议名
device = pipe.setup("siemens.smart", { ip="192.168.1.200", rack=0, slot=1 })

-- 读写操作完全一样
local result = device:read_u16("D1000", 3)
device:write_float("D2000", 3.14)
协议目标设备
Modbus TCP/RTU/ASCII任何 Modbus 设备
三菱 MC 协议FX/Q/L 系列
西门子 S7 (SMART/1200/1500/300/200)S7 全系列
欧姆龙 FINSCP/CJ 系列
台达 / 汇川 / 信捷国产 PLC

3. 丰富的网络通信栈 ​

能力模块用途
MQTT 客户端mqtt物联网消息,发布/订阅
HTTP 客户端httpREST API 调用,同步/异步
TCP 客户端/服务端tcp_client / tcp_server双向 TCP 通信
UDPudp无连接数据传输
WebSocketws实时双向通信
网络工具netDNS、Ping、NTP、IP 操作

4. 串口通信协议 ​

协议用途
UART通用串口收发
Modbus RTU串行 Modbus
三菱 FX 协议FX 系列串口通信
DLT645电表协议

5. PLC 作为从站 ​

LPPLC 可以作为被控设备,被上位机/SCADA 系统通过标准协议读写:

  • MC 协议服务端:作为三菱 MC 从站
  • Modbus TCP 服务端:作为 Modbus 从站
  • BACnet/IP 从站 与 OPC UA 服务端:见下一节(仅 ESP32-S3 机型和软 PLC 模拟器)

6. 楼宇与 OT 协议(主从双角色) ​

BACnet 和 OPC UA 各由一个模块同时提供主站与从站能力,仅 ESP32-S3 机型和软 PLC 模拟器支持:

协议传输做从站 / 服务端做主站 / 客户端
BACnetMS/TP(RS-485)与 BACnet/IP(UDP 47808)寄存器包装成 AI/AO/AV/BI/BO/BV/MSI/MSO/MSV 对象给 BMS 采集,可写对象支持 16 级优先级按周期读别的 BACnet 设备,值落进寄存器
OPC UAopc.tcp(以太网)寄存器做成变量节点,组态软件可读写、可订阅主动读别人的 OPC UA 服务器

两者都需要与上位系统在同一网段(不支持 BBMD 跨子网);OPC UA 当前只提供 SecurityPolicy None,可配用户名 / 密码,暂不支持证书加密。详见 BACnet 楼宇自控 与 OPC UA。

7. 云平台一键对接 ​

通过 cloud_bind 一行代码绑定寄存器到云端,自动上传/下发:

lua
plc.cloud_bind({
    {name = "temperature", reg = "D100", type = plc.FLOAT, mode = plc.CLOUD_UP},
    {name = "start",       reg = "Y0",   type = plc.BITE,  mode = plc.CLOUD_DOWN}
})

支持三种模式:CLOUD_UP(本地上云)、CLOUD_DOWN(云控本地)、CLOUD_AUTO(双向)。

8. 三种并发机制 ​

机制特点适用场景
线程 (Thread)抢占式,独立 Lua 状态机CPU 密集、需要真正并行
定时器 (Timer)事件驱动,最小 10ms周期性采集、心跳
协程任务 (Task)轻量协作式,事件驱动生产者-消费者、异步流程

9. 专业工业功能 ​

  • PID 控制器:内置 PID 算法,支持自整定
  • FlashDB:掉电保存的键值存储,支持时序数据
  • INI 配置:读写 INI 配置文件
  • AES 加密:内置加解密
  • RTC 时钟:实时时钟管理

开发方式 ​

  1. 浏览器访问 PLC 的 Web 管理页面
  2. 在线编写 Lua 脚本
  3. 一键下载运行,在线查看日志
  4. 三种写法:注册定时器与事件回调(推荐,脚本注册完即可结束,固件自动泵消息)、协程(把多步等待写成顺序代码)、任务(task.start 起后台任务,一直跑、中间还能等)—— 无论哪种,都不要在主线程里写 while true do ... sleep ... end,详见并发模型概述

典型应用场景 ​

  • 工业物联网网关:采集多品牌 PLC 数据,统一上云
  • 协议转换器:Modbus ↔ 西门子 ↔ 三菱,自由转换
  • 远程监控:MQTT 上报设备状态,HTTP 调用云端 API
  • 数据采集终端:串口/网口采集传感器数据,本地存储 + 定时上报
  • 边缘计算:本地 PID 控制、数据过滤、报警判断

相关例程 ​

想直接抄可运行的脚本,去 例程总览 B-0:按模块分组列出了每个页面里的 3 个完整例程(场景 / 代码 / 要点 / 验证 / 注意事项)。

写例程的硬规矩(禁止阻塞主循环、API 不编造等)见 B-0 的「写例程时的硬性约定」。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研