VisualHMI Lua API 大全:回调/통신/레지스터读写函数速查表

무료무료 기술 자료

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

这是 VisualHMI 平台 Lua 스크립트的完整 API 手册:10 个系统回调 + 32 个读写레지스터函数 + 10 个绘图函数,共 52 个인터페이스。写스크립트前先翻这篇,比逐个翻튜토리얼快。平台基于 Lua 5.3。

0. 基础:自动生成的 main.lua

菜单 엔지니어링→스크립트编程 默认生成 main.lua,自动带프로토콜对应的데이터유형定义:

ENCRYPT_ = 0        -- LUA스크립트加密开关
-- 데이터유형定义(随프로토콜变化,以下为 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_id,control_id) end

FX3U 프로토콜下还会有 VT_M(内部릴레이)、VT_D(D레지스터)等유형。on_update 里的 vtype、get/set 函数第一个매개변수都用这些常量。

1. 常用回调函数(10 个)

回调触发时机要点
on_init()系统불러오기 LUA 后바로执行一次初始化、dofile 불러오기其他 lua、写初值
on_run(screen)每个主循环周期自动调用核心周期调度。禁止 delay_ms/长循环/네트워크同步/内部 set_run_cycle();Modbus 마스터时别高频写从机(总线堵塞)
on_update(slave,vtype,addr)레지스터/변수值变化时触发데이터驱动不轮询。시리얼 포트/Modbus 마스터쓰기、on_update 内 set_xxx 不触发(防递归);可用全局 EN_ON_UPDATE_API_CB 控制开关
on_screen_change(screen)화면전환完成后初始化/状态同步/자료불러오기
on_press(state,x,y)触摸状态变化,每 100ms 最多一次state: 0抬起/1按下/2长按(按下只触发一次);底层坐标,点空白也触发
on_usb_inserted(driver)U 盘插入识别driver 为盘符,M 시리즈是 "2:",用全局변수记录
on_usb_removed()U 盘拔出清盘符全局변수
on_sd_inserted(dir)SD 卡插入识别dir 盘符,M 시리즈是 "1:"
on_sd_removed()SD 卡拔出清盘符全局변수
on_parse_timestamp(screen,control,timestamp)告警/데이터/操作记录表格时间필드형식化control 必须≠0;配 make_datetime(timestamp) 返回自定义时间串

2. 读写레지스터函数(32 个)

2.0 先说两个关键机制(所有 set/get 通用)

机制一:get_xxx() 是零통신开销的。get 시리즈전체从 HMI 本地缓存(内存镜像)读,不产生시리얼 포트帧。HMI 后台任务按엔지니어링설정的轮询周期自动从 PLC 读통신변수(如 Modbus 的 VT_3x/VT_4x)并缓存。화면控件绑定了某주소,该주소就自动进轮询列表;스크립트要读没被엔지니어링引用的주소,用 시작_read 显式请求同步。

机制二:set_xxx() 不一定发시리얼 포트帧。只有两个条件同时满足才主动发프레임:①HMI 是主机모드(Modbus Master/DCBUS/XGUS);②시리얼 포트通知没被 set_notify(0) 禁止。从机모드下 set 只更新本地镜像。

2.1 통신控制

函数매개변수설명
set_notify(enable)0禁止/1使能(默认)全局시리얼 포트보내기通知开关。set_notify(0) 后 set_xxx 不发시리얼 포트指令,改完恢复 set_notify(1)
select_slave(slave_id)从机索引 0 起多从机모드下전환后续 get/set 访问的从机。slave_id 是엔지니어링从机列表数组下标,不是 Modbus 站号
set_endian(en)0大端(默认)/1小端多바이트데이터(uint16/32/float)与从机交换时的바이트序。仅통신 프로토콜涉及多바이트时生效
시작_read(index,vtype,addr,수량,cycle,cycle_run,mode)index 0~127;수량 1~120;cycle 轮询倍数(默认0=每周期);cycle_run 周期内第几次(0-based);mode 0持续/1仅一次主机모드后台自动轮询。无返回值,데이터用 get_xxx 读缓存。mode=1 需先 create_resp_que()
stop_read(index)任务索引정지指定后台읽기任务,缓存保留最后值
stop_all_read()-停掉所有스크립트启动的읽기任务
set_auto_read(en)1활성화(默认)/0禁止화면绑定변수自动轮询的总开关。0 后完全由 시작_read 接管
create_resp_que()-创建响应队列,配合 시작_read(mode=1) 做单次按需읽기
on_cmd_resp(slave,vtype,addr,count,ret,wr)ret 0成功/1异常;wr 0读/1写主机모드통신结果异步回调,收到响应或超时触发。判断单次读写成败
set_slave_site(idx,slave_id)idx 从机索引;slave_id 新站号(Modbus 1~247)运行时动态改从机站号,适应现场组网

2.2 位操作

函数매개변수설명
set_bit(vtype,addr,value,count)value 16位无符号,低 count 位对应目标位(bit0→addr,bit1→addr+1…);count 选填 1~16批量位쓰기。Modbus 코일、FX3U 的 X/Y/S/M 都行。一次통신写多个开关
get_bit(vtype,addr)-读单一位,返回 0/1。从本地缓存读,零통신开销

2.3 数值读写(16/32/64 位)

函数数值范围주소跨度
set/get_uint16(vtype,addr,value)0~65535,超出截断 & 0xFFFF1 个레지스터
set/get_int16(vtype,addr,value)-32768~+32767,超出截断 & 0xFFFF1 个레지스터
set/get_uint32(vtype,addr,value)0~4294967295,截断 & 0xFFFFFFFF2 个레지스터
set/get_int32(vtype,addr,value)-2^31~2^31-12 个레지스터
set/get_uint64(vtype,addr,value)0~2^64-14 个레지스터
set/get_int64(vtype,addr,value)-2^63~2^63-14 个레지스터
set/get_float(vtype,addr,value)IEEE 754 单精度2 个레지스터
set/get_double(vtype,addr,value)IEEE 754 双精度4 个레지스터

所有 get 시리즈读本地缓存;set 시리즈통신触发看「机制二」。

2.4 문자串与批量

函数매개변수설명
set_string(vtype,addr,str)str 最大 2K 바이트,UTF-8 或 GBK写문자串到주소시퀀스
get_string(vtype,addr,len)len 选填,默认 128 바이트,最大 2048读문자串,自动在 截断
set_uint16_ex(vtype,addr,value1,...,valueN)最多 120 个值可变매개변수批量写连续레지스터,适合固定매개변수集
set_array(vtype,addr,buff)buff 为 Lua table(word 数组),最多 120 字table 批量写,适合程序化生成/动态데이터。与 set_uint16_ex 区别在传参방식

3. 绘图函数(10 个)

전체 draw_xxx 必须在 on_draw(screen_id,control_id) 回调里调用才生效,控件 ID 必须 ≠ 0。图层按控件 Z 轴(편집器叠放顺序)管理,靠判断 control_id 分层绘制。主动새로고침调 redraw()。

函数매개변수설명
set_pen_color(color)RGB565:高5位R(0~31)/中6位G(0~63)/低5位B(0~31)设置画笔(前景)颜色。红 0xF800、绿 0x07E0、蓝 0x001F、白 0xFFFF、黑 0x0000
draw_line(x0,y0,x1,y1,width)width 1~10画直线,颜色取当前画笔
draw_rect(x0,y0,x1,y1,fill)fill 1填充/0边框左上角+右下角坐标
draw_rect_alpha(x0,y0,x1,y1,alpha)alpha 0~255(0透明/255不透明)半透明实心矩形,遮罩层常用
draw_circle(x,y,r,fill)fill 0实心/非0空心(值作线厚)圆心+半径
draw_ellipse(x0,y0,x1,y1,fill)fill 0实心/非0空心外接矩形定义椭圆
draw_image(image_id,frame_id,dstx,dsty,width,height,srcx,srcy)image_id 查 build/image.xml;frame_id 动画帧(非动画=0)绘制图片,支持缩放+裁剪。image_id 在엔지니어링 build 目录 image.xml 里查
draw_text(text,x,y,w,h,font_id,size,color,align,charcode)align 0左/1中/2右;charcode 0=UTF-8(默认)/1=GBK区域文字绘制,支持多바이트문자
draw_surface(surface,x,y,w,h,srcx,srcy)surface 为화면/画布자료화면裁剪显示,多图层合成用

4. 绘图实例:switch 表驱动

源文所有绘图예제都是一个套路:on_update 读버튼键值 → redraw() → on_draw 里按键值查 switch 表选绘制函数。以画线+画圆为例:

draw_type = 0
mode = { line = 1, rect = 2, rect_alpha = 3, circle = 4, ellipse = 5, imageId = 6, text = 7 }

function on_update(slave,vtype,addr)
  if addr == 0x1000 then
    draw_type = get_uint16(VT_LW, addr)  -- 字设置버튼键值
    redraw()
  end
end

function on_draw(screen_id, control_id)
  local switch = {
    [mode.line] = function(control)
      if screen_id == 0 and control == 1 then
        set_pen_color(0xFFE0)          -- 黄色
        draw_line(225, 253, 405, 253)
        set_pen_color(0xF800)          -- 红色
        draw_line(508, 128, 508, 378, 5)
      end
    end,
    [mode.circle] = function(control)
      if screen_id == 0 and control == 1 then
        draw_circle(300, 253, 100, 0)  -- 实心圆
        draw_circle(450, 253, 150, 1)  -- 空心圆,线厚1
      end
    end,
  }
  if switch[draw_type] then switch[draw_type](control_id) end
end
三个最容易翻车的点:①get_xxx 读的是缓存不是实时值——要读没绑控件的주소,先 시작_read 同步;②set_xxx 在从机모드下不发시리얼 포트帧——MCU 收不到是正常的,别查半天통신 속도;③on_run 里严禁 set_run_cycle() 和 delay_ms,调度器会死锁。画图必须放 on_draw 里,控件 ID 非 0。

整理自 广州大彩科技 VisualHMI 개발문서(hmi-doc.gz-dc.com)LUA 튜토리얼「Lua 스크립트API函数인터페이스」,版权归大彩科技所有。

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

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

엔지니어 회원

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

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

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

답글 작성

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