VisualHMI Lua API 大全:回调/Communication/レジスタ読み書き函数クイックチェック·テーブル

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

这是 VisualHMI プラットフォーム Lua 脚本的complete 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(Dregister)等タイプ。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)register/变量值变化时触发データ驱动不ポーリング。serial port/Modbus メインステーション書き込み、on_update 内 set_xxx 不触发(防递归);可用全局 EN_ON_UPDATE_API_CB Control switch
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)告警/data/操作记录表格时间字段格式化control 必须≠0;配 make_datetime(timestamp) 戻る自定义时间串

2. 読み取り/書き込みレジスタ函数(32 个)

2.0 先说2つ关键机制(すべての set/get 通用)

机制一:get_xxx() 是零通信开销的。get 系列すべて从 HMI 本地缓存(内存镜像)读,不产生シリアルポートフレーム。HMI 后台任务按工程設定的ポーリング周期自动从 PLC 读通信变量(如 Modbus 的 VT_3x/VT_4x)并缓存。画面控件绑定了某アドレス,该アドレス就自动进ポーリングリスト;脚本要读没被工程引用的アドレス,用 start_read 显式リクエスト同步。

机制二:set_xxx() 不一定发シリアルポートフレーム。只有2つ条件同时满足才主动发报文:①HMI 是マスターモード(Modbus Master/DCBUS/XGUS);②シリアルポート通知没被 set_notify(0) 禁止。スレーブモード下 set 只更新本地镜像。

2.1 通信控制

函数parameter説明
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リトルエンディアン多Bytesのデータ(uint16/32/float)与スレーブ交換时的バイトオーダー。仅通信プロトコル涉及多バイト时生效
start_read(index,vtype,addr,quantity,cycle,cycle_run,mode)index 0~127;quantity 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 后完全由 start_read 接管
create_resp_que()-作成レスポンス队列,配合 start_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 ビット操作。

函数parameter説明
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 Registers
set/get_int16(vtype,addr,value)-32768~+32767,超出截断 & 0xFFFF1 Registers
set/get_uint32(vtype,addr,value)0~4294967295,截断 & 0xFFFFFFFF2 Registers
set/get_int32(vtype,addr,value)-2^31~2^31-12 Registers
set/get_uint64(vtype,addr,value)0~2^64-14 Registers
set/get_int64(vtype,addr,value)-2^63~2^63-14 Registers
set/get_float(vtype,addr,value)IEEE 754 单精度2 Registers
set/get_double(vtype,addr,value)IEEE 754 双精度4 Registers

すべての get 系列读本地缓存;set 系列通信触发看「机制二」。

2.4 ストリング·ストリング与批量

函数parameter説明
set_string(vtype,addr,str)str 最大 2K byte,UTF-8 或 GBK写ストリング·ストリング到アドレス序列
get_string(vtype,addr,len)len 选填,デフォルト 128 bytes,最大 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 个)

All draw_xxx 必须在 on_draw(screen_id,control_id) 回调里调用才生效,control ID 必须 ≠ 0。图层按控件 Z 轴(編集器叠放顺序)管理,靠判断 control_id 分层绘制。主动リフレッシュ调 redraw()

函数parameter説明
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 读的是缓存ではない实时值——要读没绑控件的アドレス,先 start_read 同步;②set_xxx 在スレーブモード下不发シリアルポートフレーム——MCU 受信できない。是正常的,别查半天ボーレート;③on_run 里严禁 set_run_cycle() 和 delay_ms,调度器会死锁。画图必须放 on_draw 里,control ID 非 0。

整理自 广州大彩科技 VisualHMI 开发ドキュメント(hmi-doc.gz-dc.com)LUA Tutorial「Lua ScriptAPI函数接口」,著作権は大彩科技すべての。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.