VisualHMI 레지스터操作:get/set 全시리즈 API 与缓存机制详解

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

레지스터操作 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/11
set/get_uint160~65535,超范围截断 & 0xFFFF1
set/get_int16-32768~+327671
set/get_uint320~4294967295+2
set/get_int32-2^31~2^31-1+2
set/get_uint640~2^64-1+4
set/get_int64-2^63~2^63-1+4
set/get_floatIEEE 754 单精度+2
set/get_doubleIEEE 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_MFX3U 内部릴레이
VT_3x입력 레지스터
VT_4x유지 레지스터
VT_DFX3U 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 튜토리얼「레지스터操作」,版权归大彩科技所有。

실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注