广州大彩串口屏论坛_大彩开发者交流论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 195|回复: 7

HMI中按钮功能的脚本执行怎么实现

[复制链接]

8

主题

21

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2024-10-18 15:24:51 | 显示全部楼层 |阅读模式
在visualHMI中,做了一个保存参数的界面,数值输入参数采用RW区的地址标签,
可以即时保存在RW区,掉电得以保存
但有些如串口,是需要调用函数来配置的,这时就需要通过脚本实现
我是通过字设置按钮关联向LW写了一个触发标识变量,希望通过写这个变量来触发LUA的
function on_update(slave,vtype,addr)
        local baudnum = 0       
        if get_uint16(VT_LW,Flag_SysConfigSave) == 1 then                --系统配置保存
                set_uint16(VT_LW,Flag_SysConfigSave,0)
                -- baudnum = get_uint16(VT_RW,Flag_SysConfigSave)
                --uart_setup(1,Systembaudrate[baudnum + 1],1,0,0)                --设置串口
        end

这样相当于做了一个按键中断
使用on_update()回调来做有什么不良后果吗?
还有什么直接的方式吗?
回复

使用道具 举报

0

主题

366

帖子

1044

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1044
发表于 2024-10-18 18:02:11 | 显示全部楼层
HMI中保存数据直接用RW保存数据就可以的,你说的是串口波特率的话,可以先对系统波特率地址LW01B1修改,之后直接给LW01B0写入0x5501生效。
回复

使用道具 举报

8

主题

21

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2024-10-18 20:26:23 | 显示全部楼层
dctechnology 发表于 2024-10-18 18:02
HMI中保存数据直接用RW保存数据就可以的,你说的是串口波特率的话,可以先对系统波特率地址LW01B1修改,之 ...

你好,我试了下对LW01B1修改,步骤如下

SystemBaudRateAddr        =        0x01B1                                                                --LW 系统串口波特率地址
SystemComSetAddr        =        0x01B0                                                                --LW 串口锁地址
SystemComSetValue        =        0x5501                                                                --LW 串口锁数据
SystemBaudrateNum        =        0x0032                                                                --RW 波特率下拉框选定项数保存地址,这个地址最小为0,所以需要加1才与波特率数组对应


--变量发生改动时调用
function on_update(slave,vtype,addr)
        local baudnum = 0       
        if get_uint16(VT_LW,Flag_SysConfigSave) == 1 then                --系统配置保存
                set_uint16(VT_LW,Flag_SysConfigSave,0)
                baudnum = get_uint16(VT_RW,SystemBaudrateNum)                                        --获取下拉选框选项号
                set_uint32(VT_RW,sysbaud,Systembaudrate[baudnum+1])  --在将当前波特率值写入自定义RW地址
                set_uint32(VT_LW,SystemBaudRateAddr,Systembaudrate[baudnum+1])  --设置LW01B地址的波特率值
                set_uint16(VT_LW,SystemComSetAddr,SystemComSetValue)        --解锁COM口
                --uart_setup(1,Systembaudrate[baudnum + 1],1,0,0)                --设置串口
        end
end


上图是我运行后的程序,下拉框控件上面两个数值分别是下拉框选项号和我保存到RW中的值,这个显示是正确的,但写LW01B1,波特率配置却没有成功,还是按原波特率在发码(我有计数器中断定器发码)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

21

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2024-10-19 00:19:00 | 显示全部楼层
发现一个问题,同样的操作,把它放在on_init()中,虚拟屏调试显示是修改OK的,但放到function on_update(slave,vtype,addr)中是不可以的,也就是在系统初始化时进行初始化是OK的
这个怎么解决?
难道要设置后重新,利用RW保存数据的在初始化中去,这样现场用户使用起来体验肯定不行啊
我具体说一下我的串口流程现况:
1. 我现在正常系统初始化完成后,利用Timer来定时发送查询命令,就是说我在设置操作前,串口已经用工程编译配置在发码了
2. 我的配置修改操作,是我在系统配置界面,设置好新的波特率,然后按保存键,进行用户参数保存,
所以通过检查按钮释放引起的参数变化来触发on_update(),这个触发在上一回复中通过保存RW操作,是可行的
3. 我现在用的VisualHMI的版本是1.1.362,参考的VisualHMI开发手册是1.2版本,在这个版本中,关于串口的操作的API只有三个
uart_setup(), send和recv。
4. 我用的串口协议是自定义,不是MODBUS
5. 同样操作放在on_init()回调中是有效的,但那只在系统上电来一次,可以在操作后再来一次on_init()?
所以这里是不是因为说系统初始化完成后,再修改串口参数是没办法实时实现的?
又或者是还有API函数接口可以进行串口的重新初始化
回复

使用道具 举报

0

主题

366

帖子

1044

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1044
发表于 2024-10-21 18:36:21 | 显示全部楼层
用实体屏测试on_update()可以修改波特率并保存,具体可以参考做的一个简单例程,可以用实体屏测试一下看看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

21

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2024-10-21 18:58:07 | 显示全部楼层
谢谢!!!
回复

使用道具 举报

8

主题

21

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2024-10-21 21:30:06 | 显示全部楼层
你好,你给我的例程我试了下,虚拟屏是没有问题的,我按你们方式修改我的程序,就是使用下拉框的数值转换功能,虚拟屏运行对0x01B1的修改都没有问题
但下载到HMI屏上就出现在操作下拉框时出错重启
然后我把你的例程,把板子型号改为DC10600M070/DC10600KM070,编译运行虚拟屏是正常的,然后下载到我的屏上,没死机,但结果乱了(如下图)
1. 我的屏,板子和塑料壳的标签写的型号都是HMI10600KM070_D011
2. 我之前的代码,包括串口(RS485)的收发都是正常的,出现问题后,我烧回原来的程序,也是正常的
3. 没找到8G TF卡,用了16G的,USB读卡器,插USB口下载的。之前其他功能调试没有问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

21

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2024-10-21 21:37:39 | 显示全部楼层
再帮忙定位下问题,我的工程中板子选DC10600M070/DC10600KM070,这个没问题吧?
关于波特率问题,周末时我试下一下,在RW中保存完波特率后,再谳用on_init()这个回调,
在on_init中利用RW保存的值去再初始化一遍,下载下去是可以用的,相当于设完串口,
这样比较麻烦就是on_init中的其他初始化就得去避开这个操作,后继代码多了怕有不方便处理的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|广州大彩串口屏论坛_大彩开发者交流论坛

GMT+8, 2024-10-31 02:20 , Processed in 0.045157 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表