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

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

HMI屏lua脚本中怎样获取通过modbus连接的plc寄存器的值?

[复制链接]

24

主题

52

帖子

354

积分

中级会员

Rank: 3Rank: 3

积分
354
发表于 2023-6-28 23:34:54 | 显示全部楼层 |阅读模式
如题,HMI屏做主机,PLC做从机,通过modbus连接,在lua脚本中函数使用了PLC寄存器地址的话,该函数并不生效。但如果界面存在这个寄存器地址的控件数值,这个函数就会生效。如下图,如果界面中有4x0003和4x0004的数值输入控件(应该是系统的API读取了该地址的值了吧),这个函数就会生效,否则不行。

请问怎样在脚本中声明这些地址?谢谢。


本人刚接触Lua,请赐教。

本帖子中包含更多资源

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

x
回复

使用道具 举报

24

主题

52

帖子

354

积分

中级会员

Rank: 3Rank: 3

积分
354
 楼主| 发表于 2023-6-29 00:00:19 | 显示全部楼层
找到了,要用start_read读入就可以了。

本帖子中包含更多资源

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

x
回复

使用道具 举报

2

主题

1253

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
12619
发表于 2023-6-29 09:00:04 | 显示全部楼层
本帖最后由 If后要接end 于 2023-6-29 09:01 编辑

当前界面没有任何PLC类寄存器绑定到控件上,就需要用start_read来发送读取指令,get_开头的api不会主动下发读取指令。原理是start_read下发指令后,会将数据存到对应的区域,用户通过调用get相关api,会去到对应的区域将数值读取出来。


Easy doesn't enter into Grown-up life
成年人的生活里面没有“容易”二字
回复

使用道具 举报

0

主题

2

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2023-6-30 19:56:22 | 显示全部楼层
If后要接end 发表于 2023-6-29 09:00
当前界面没有任何PLC类寄存器绑定到控件上,就需要用start_read来发送读取指令,get_开头的api不会主动下发 ...

师傅能否帮忙看一下为什么这样写串口不发送任何数据出去,用start_read应该怎么写呢,第一个参数index是啥
function on_run(screen)
        set_notify(1)
        select_slave(1)
        set_endian(0)
        local dingsu_1=get_uint16(12,0x0005)  
        local dingsu_2=get_uint16(12,0x0006)
        local xiansu_1=get_uint16(12,0x0007)
        local xiansu_2=get_uint16(12,0x0008)
        if dingsu_2 ~= 0 and xiansu_2 ~= 0
        then
                now_dingsu=(dingsu_1*100000+dingsu_2)/2000
                now_xiansu=(xiansu_1*100000+xiansu_2)/2000
                set_uint16(1,0x1006,now_dingsu)
                set_uint16(1,0x1007,now_xiansu)
        end
        set_run_cycle(100)
end
回复

使用道具 举报

0

主题

2

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2023-6-30 19:57:44 | 显示全部楼层
If后要接end 发表于 2023-6-29 09:00
当前界面没有任何PLC类寄存器绑定到控件上,就需要用start_read来发送读取指令,get_开头的api不会主动下发 ...

这样写了也是一点反应都没有
function on_run(screen)
        set_notify(1)
        select_slave(1)
        set_endian(0)
        start_read(1,12,0x0005,16)
        local dingsu_1=get_uint16(12,0x0005)  
        local dingsu_2=get_uint16(12,0x0006)
        local xiansu_1=get_uint16(12,0x0007)
        local xiansu_2=get_uint16(12,0x0008)
        stop_read(1)
        if dingsu_2 ~= 0 and xiansu_2 ~= 0
        then
                now_dingsu=(dingsu_1*100000+dingsu_2)/2000
                now_xiansu=(xiansu_1*100000+xiansu_2)/2000
                set_uint16(1,0x1006,now_dingsu)
                set_uint16(1,0x1007,now_xiansu)
        end
        set_run_cycle(100)
end
回复

使用道具 举报

2

主题

1253

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
12619
发表于 2023-7-3 09:05:19 | 显示全部楼层
一只程序猿 发表于 2023-6-30 19:57
这样写了也是一点反应都没有
function on_run(screen)
        set_notify(1)

set_notify(1)
select_slave(1)
set_endian(0)
上面这三句写在on_init()初始化回调中就可以了,只需执行一次。

start_read(1,12,0x0005,16),第一个参数是表示索引,可以理解为通道,支持0 ~ 31;第二个参数是变量的类型;第三个参数是起始地址;第四个参数是读取的寄存器数量
Easy doesn't enter into Grown-up life
成年人的生活里面没有“容易”二字
回复

使用道具 举报

2

主题

1253

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
12619
发表于 2023-7-3 10:04:12 | 显示全部楼层
一只程序猿 发表于 2023-6-30 19:57
这样写了也是一点反应都没有
function on_run(screen)
        set_notify(1)

set_notify(1)
select_slave(1)
set_endian(0)
上面这三句写在on_init()初始化回调中就可以了,只需执行一次。

start_read(1,12,0x0005,16),第一个参数是表示索引,可以理解为通道,支持0 ~ 31;第二个参数是变量的类型;第三个参数是起始地址;第四个参数是读取的寄存器数量
Easy doesn't enter into Grown-up life
成年人的生活里面没有“容易”二字
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:01 , Processed in 0.059478 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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