VisualHMI 寄存器操作:get/set 全系列 API 与缓存机制详解

免费免费技术资料

这篇内容可直接阅读,适合用于基础学习和搜索引流。

本文目录
  1. 1. 1. 读取机制(重要)
  2. 2. 2. API 总表
  3. 3. 3. vtype 取值(随协议变化)
  4. 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 教程「寄存器操作」,版权归大彩科技所有。

技术术语(共 5 个)—— 点击展开
寄存器Modbus 寄存器存储数据单元,分线圈/离散输入/保持/输入寄存器四类
PLC可编程逻辑控制器,工业自动化控制的核心设备
串口计算机与外部设备进行串行通信的物理接口
线圈Modbus位可读写数据,地址从00001开始
保持寄存器Modbus 16位可读写数据,地址从40001开始
来源/工具信息 —— 点击展开
来源 Modbus中文网(modbus.cn) —— 国内领先的Modbus通信协议技术社区 分类 LUA 脚本 / 串口屏/HMI 开发 字数 1810 字 · 阅读约 5 分钟 更新 2026-08-05 永久链接 https://www.modbus.cn/51495.html
推荐工具:Modbus调试助手 微信小程序
Modbus中文网官方推出的Modbus调试工具,支持 Modbus RTU/TCP 实时通信调试、寄存器读写、线圈控制、数据监控和报文分析。 无需安装,微信搜索「Modbus调试助手」即可使用。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
📝 作者声明
本文由 Modbus中文网技术团队 原创撰写,内容基于实际项目案例与技术文档,力求为读者提供准确、实用的参考信息。
把这篇资料用于真实项目?

进入工具中心进行报文解析、CRC 校验和设备调试,或提交需求获取选型与接入建议。

工程师会员

把这篇文章变成可执行的调试资料

开通后可使用高级报文解析、资料包下载、代码示例、工程案例和优先技术支持,适合真实项目交付。

高级工具不限次
资料包与代码包
完整工程案例库
优先技术支持入口

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注