|
|

楼主 |
发表于 2026-4-28 15:52:35
|
显示全部楼层
自定义协议。环境说明:
软件版本:VisualHMI 最新版
屏型号: M 系列(指令集版本)
配置方式:数值显示控件,ID 为 1,读取地址为 LW0301,数据类型 INT16,小数位 1。
Lua 模式:已开启 uart_free_protocol = 1。
已确认的现象:
Lua 引擎正常运行:在 on_init 中调用 set_screen(2),模拟器能成功自动跳页。说明脚本已加载且能控制系统指令。
API 参数疑云:测试发现 set_uint16 在该固件下表现异常。
执行 set_uint16(1, 301, 1234) 时,屏幕上的 LW0001 变为了 301。
推测参数顺序为 (地址, 数值, 站号),但按照此顺序写 set_uint16(301, 2200, 1),对应的 LW0301 控件没有任何反应(保持 0.0)。
内存空间隔离:
在模拟器运行状态下,手动往 LW0301 框内输入 888,仪表盘指针会动,说明变量绑定成功。
但 Lua 脚本使用 get_uint16(t, 301) 对 t 从 0 到 15 进行全类型扫描,均读不到手动输入的 888。
使用全内存雷达(扫描地址 0-1000,类型 0-15)也搜不到手动输入的 888。
指令直达失败:在 Lua 中尝试 uart_send(0, {0xEE, 0xB1, 0x01, ...}) 直接发送修改控件指令,模拟器 UI 无任何刷新。
刷新函数无效:每次写入后均配合调用了 refresh_screen() 和 redraw(),依然无效。
核心问题: 在 VisualHMI 的 模拟器 环境下,Lua 脚本究竟应该使用哪个 API、哪个站号(Station)、哪个类型(Type)才能读写 LW 变量? 为什么 set_screen 有效而 set_uint16 对特定的 LW 地址(如 301)无效?是否有特定的“变量导出”步骤或者是模拟器本身的内存隔离限制? |
|