LUA 是 VisualHMI 的脚本语言,负责把 HMI 从「显示终端」变成「能干活的主机」:协议解析、逻辑判断、数据运算、文件操作全在脚本里。先搞懂 main.lua 的程序结构和系统回调,后面所有 API 才有地方放。
1. main.lua 基本结构
_ENCRYPT_ = 0 -- LUA 脚本加密开关(量产加密置1) -- 数据类型定义(随协议变化,Modbus 常用这些) VT_LW = 1 -- 内部变量(掉电不保存) VT_RW = 2 -- Flash 掉电保存区 VT_0x = 10 -- 线圈 VT_1x = 11 -- 输入 VT_3x = 12 -- 输入寄存器 VT_4x = 13 -- 保持寄存器 -- 系统回调函数(自动被调用,不用自己调) function on_init() end -- 上电加载后执行一次 function on_run(screen) end -- 周期执行 function on_update(slave,vtype,addr) end -- 变量变化 function on_draw(screen,control) end -- 自绘
main.lua 是入口文件,工程编译时一并打包。大工程建议分模块:在 on_init 里 dofile(“xxx.lua”) 拆开,好维护。
2. 编辑工具与编码
官方推荐 NotePad++、Lua editor、VS Code 编辑脚本。编码必须注意:文件编码和 HMI 工程设置要一致(UTF-8 或 GB2312),编码不对中文会乱码,字符串比较也全错。
3. 查错方法(LUA 没有断点调试)
LUA 是解释性语言,不能断点单步。虚拟屏调试常见三类异常:
- nil 值错误:访问了未定义的变量/表元素——先检查变量初始化
- 类型错误:number 当 table 用、string 拼接 nil——print 打印类型确认
- 内存溢出重启:全局累积数据不释放——查循环里是不是一直 table.insert
实体屏调试用 TTL 调试串口 J2,波特率 115200 8N1,print 输出走这个口。

4. dofile 分模块管理
function on_init()
dofile("config.lua") -- 参数配置
dofile("protocol.lua") -- 协议解析
dofile("ui.lua") -- 界面逻辑
end
模块之间共享全局变量,注意命名别冲突(习惯加前缀,如 g_、m_)。
三个坑:①_ENCRYPT_ 置 1 后脚本被加密,改脚本要重新编译下载,调试期保持 0;②文件编码必须和工程一致,UTF-8/GB2312 混用中文全乱;③print 输出走调试串口 J2(115200 8N1),实体屏看日志接 USB-TTL。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「什么是LUA」,版权归大彩科技所有。
发表回复