本文目录
- 1. 1. 读取机制(重要)
- 2. 2. API 总表
- 3. 3. vtype 取值(随协议变化)
- 4. 4. 数据复制案例(12 组模式通用套路)
寄存器操作 API 是 LUA 读写数据的全部家当:set/get 系列覆盖所有数据类型,set_bit 处理位,set_array 批量写。核心机制先记住:get_xxx 全部从 HMI 本地缓存(内存镜像)读,不发串口帧——零通信开销。
1. 读取机制(重要)
get_xxx() 系列函数不会实时向 PLC 发串口请求。HMI 后台任务按工程配置的轮询周期自动从 PLC 读通信变量(Modbus 的 3x/4x 等)并缓存,脚本只读缓存。好处是避免脚本逻辑造成通信风暴——你 get 一万次也不会把总线打爆。
2. API 总表
| 函数 | 范围/说明 | 地址跨度 |
|---|---|---|
set_bit(vtype,addr,value,count) |
批量位写,value 低 count 位对应 addr 起连续位(count 1~16);get_bit 返回 0/1 | 1 |
set/get_uint16 |
0~65535,超范围截断 & 0xFFFF | 1 |
set/get_int16 |
-32768~+32767 | 1 |
set/get_uint32 |
0~4294967295 | +2 |
set/get_int32 |
-2^31~2^31-1 | +2 |
set/get_uint64 |
0~2^64-1 | +4 |
set/get_int64 |
-2^63~2^63-1 | +4 |
set/get_float |
IEEE 754 单精度 | +2 |
set/get_double |
IEEE 754 双精度 | +4 |
set_string(vtype,addr,str) |
最大 2K 字节,UTF-8/GBK;get_string 默认 128 字节最大 2048, 截断 | 按长度 |
set_uint16_ex(vtype,addr,v1,...,vN) |
批量写,最多 120 个寄存器 | N |
set_array(vtype,addr,buff) |
接收 Lua table(word 数组),最多 120 字 | N |
3. vtype 取值(随协议变化)
| 常量 | 含义 |
|---|---|
| VT_0x | 线圈 |
| VT_1x | 输入 |
| VT_M | FX3U 内部继电器 |
| VT_3x | 输入寄存器 |
| VT_4x | 保持寄存器 |
| VT_D | FX3U D 寄存器 |
| VT_LW | 内部变量(掉电不保存) |
| VT_RW | 掉电保存区 |
4. 数据复制案例(12 组模式通用套路)
最常见的需求:外部给 LW 写数据,脚本搬到另一个地址或转换格式。套路是 on_update 里判断 vtype==VT_LW 和源地址,用 get 读、set 写目标:
function on_update(slave, vtype, addr)
if vtype == VT_LW then
if addr == 0x1000 then
set_uint16(VT_LW, 0x1001, get_uint16(VT_LW, 0x1000)) -- uint16 复制
elseif addr == 0x1004 then
set_uint32(VT_LW, 0x1006, get_uint32(VT_LW, 0x1004)) -- uint32(跨度+2)
elseif addr == 0x101C then
set_float(VT_LW, 0x101E, get_float(VT_LW, 0x101C)) -- float(跨度+2)
elseif addr == 0x1030 then
set_string(VT_LW, 0x1040, get_string(VT_LW, 0x1030, 16)) -- string(跨度16)
end
end
end
-- 批量写:addr==0x1050 且值为偶数时写 10 个寄存器
function on_update(slave, vtype, addr)
if vtype == VT_LW and addr == 0x1050 then
local v = get_uint16(VT_LW, 0x1050)
if v % 2 == 0 then
set_uint16_ex(VT_LW, 0x1060, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
-- 或
set_array(VT_LW, 0x1060, {10, 20, 30, 40, 50, 60, 70, 80, 90, 100})
end
end
end
三个坑:①32 位以上数据类型有地址跨度——uint32/float 占 2 个寄存器、uint64/double 占 4 个,连续读写别把地址搞重叠;②set 超范围自动截断(& 0xFFFF 之类),不会报错也不会进位,数值错了你可能不知道;③get_string 默认读 128 字节,要更长显式传 len(最大 2048),字符串在 处截断。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「寄存器操作」,版权归大彩科技所有。
发表回复