这是 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,超出截断 & 0xFFFF | 1 Registers |
set/get_int16(vtype,addr,value) | -32768~+32767,超出截断 & 0xFFFF | 1 Registers |
set/get_uint32(vtype,addr,value) | 0~4294967295,截断 & 0xFFFFFFFF | 2 Registers |
set/get_int32(vtype,addr,value) | -2^31~2^31-1 | 2 Registers |
set/get_uint64(vtype,addr,value) | 0~2^64-1 | 4 Registers |
set/get_int64(vtype,addr,value) | -2^63~2^63-1 | 4 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
整理自 广州大彩科技 VisualHMI 开发ドキュメント(hmi-doc.gz-dc.com)LUA Tutorial「Lua ScriptAPI函数接口」,著作権は大彩科技すべての。
Leave a Reply