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

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

求教:有没有visual HMI的MODBUS收发教程

[复制链接]

10

主题

30

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 2024-11-7 16:00:53 | 显示全部楼层 |阅读模式
你好,有没有VisualHMI的MODBUS教程,官网上的MODBUS教程多针对VisualTFT的
回复

使用道具 举报

0

主题

388

帖子

1120

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1120
发表于 2024-11-7 17:32:27 | 显示全部楼层
回复

使用道具 举报

10

主题

30

帖子

120

积分

注册会员

Rank: 2

积分
120
 楼主| 发表于 2024-11-8 11:52:42 | 显示全部楼层
dctechnology 发表于 2024-11-7 17:32
http://hmi_doc.gz-dc.com/LUA/002_regOperat.html
http://hmi_doc.gz-dc.com/LUA/003_ModbusLua.html

这个看过,有几个疑问
我的HMI作为主机,需要对多个从机的多个数据进行轮巡查询,一次读多个寄存器
采用多条start_read()函数,这个函数使用后,按设置的定时进行轮巡,那返回的数
据在哪里读取?这个函数中的索引号有什么用?
回复

使用道具 举报

10

主题

30

帖子

120

积分

注册会员

Rank: 2

积分
120
 楼主| 发表于 2024-11-8 11:57:04 | 显示全部楼层
我读取的寄存器数据还需要进行处理
回复

使用道具 举报

25

主题

118

帖子

747

积分

高级会员

Rank: 4

积分
747
QQ
发表于 2024-11-8 20:30:13 | 显示全部楼层
wilsonzhou 发表于 2024-11-8 11:57
我读取的寄存器数据还需要进行处理

可以在LUA脚本中代码读取后进行处理,详情可以参考大彩官网-开发文档-VisualHMI-VisualHMI LUA 教程中的Modbus文档
欢迎加入大彩爱好者QQ群:14769485
回复

使用道具 举报

10

主题

30

帖子

120

积分

注册会员

Rank: 2

积分
120
 楼主| 发表于 2024-11-11 09:38:26 | 显示全部楼层
小逸老师 发表于 2024-11-8 20:30
可以在LUA脚本中代码读取后进行处理,详情可以参考大彩官网-开发文档-VisualHMI-VisualHMI LUA 教程中的M ...

这里就有个搞不清,比如我用start_read(1,VT_4x, 0x0000, 5),读5个寄存器数据,这5个寄存器的返回值返回值到哪里获取?
用local var1,var2,var3,var4,var5 = start_read(1,VT_4x, 0x0000, 5)来获取吗?
回复

使用道具 举报

10

主题

30

帖子

120

积分

注册会员

Rank: 2

积分
120
 楼主| 发表于 2024-11-11 09:43:13 | 显示全部楼层
还是说用on_uart_recv(ch,packet)回调通过判断地址去获取?如果用这个,那对同一地址的多次不同寄存器的读取也会产生不好区分的情况
回复

使用道具 举报

25

主题

118

帖子

747

积分

高级会员

Rank: 4

积分
747
QQ
发表于 2024-11-12 19:17:09 | 显示全部楼层
wilsonzhou 发表于 2024-11-11 09:43
还是说用on_uart_recv(ch,packet)回调通过判断地址去获取?如果用这个,那对同一地址的多次不同寄存器的读 ...

start_read是开始进行间隔读取,stop_read是停止读取,在读取过程中使用 get_***指令读取并返回,
例如local tempdata =get_uint16(vtype, addr),具体返回的内容根据get_***对应的类型返回,可以print(tempdata)
欢迎加入大彩爱好者QQ群:14769485
回复

使用道具 举报

10

主题

30

帖子

120

积分

注册会员

Rank: 2

积分
120
 楼主| 发表于 2024-11-12 20:34:54 | 显示全部楼层
小逸老师 发表于 2024-11-12 19:17
start_read是开始进行间隔读取,stop_read是停止读取,在读取过程中使用 get_***指令读取并返回,
例如lo ...

谢谢
我是要从机读取寄存器地址为0x03FC地址的float类型数据,用了一个定时器,3秒钟读一次
我的代码是这样的
--定时器回调函数
function on_timer(timer_id)
        if timer_id == 0
        then
                timecycle = timecycle + 1
                if timecycle == 3                        --每3秒发一次查询
                then
                        --RS485_Cmd_iso_inquire()
                        select_slave(0)
                        start_read(1,VT_4x, 0x03FC, 2)
                        local isr = mb_read_reg_03(0,0x03FC)
                        stop_read(1)
                end
                if timecycle == 6                        --轮巡到UPS查询
                then
                        --RS485_Cmd_ups_inquire()
                        timecycle = 0
                end
        end
end
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--Modbus读从机寄存器
function mb_read_reg_03(slave,addr)
        local onlineState = get_uint16(VT_LW,0x01A3)
        if (onlineState >> slave) & 0x01 == 0x01
        then
                select_slave(slave)
                return get_float(VT_4x,addr)
        else
                return false
        end
end

这个没有触发发指令,我用数值输入控件来关联,是可以正确读取从机数据的,但那样只是读了原始数据,没有处理这个可以给个过程例程吗?
就是每3秒发一次码,获取寄存器数据(float),并把这个数据暂存到LW中
回复

使用道具 举报

10

主题

30

帖子

120

积分

注册会员

Rank: 2

积分
120
 楼主| 发表于 2024-11-13 10:29:32 | 显示全部楼层
搞明白了,后台需要有轮巡在先
function on_init()
        select_slave(0)--选择第1个从站
    start_read(1,VT_4x, 0x040A, 1)--读取保持寄存器,0x040A寄存器
        start_read(2,VT_4x, 0x03FC, 2)--读取保存寄存器0x03FC-0x03FD寄存器

end

function on_run(screen)
        local var1 = mb_read_reg_03_uint16(0,0x040A)
        local var2 = mb_read_reg_03_float(0,0x03FC)
        if var1 ~= false
        then
                set_uint16(VT_LW,0x1100,var1)
                --set_float(VT_LW,0x1200,
        end
        if var2 ~= false
        then
                set_float(VT_LW,0x1200,var2)
                --set_float(VT_LW,0x1200,
        end
end

function on_update(slave,vtype,addr)
end

function on_draw(screen_id,control_id)
end

--读取保存寄存器float
function mb_read_reg_03_float(slave,addr)
        local onlineState = get_uint16(VT_LW,0x01A3)
        if ((onlineState >> slave) & 0x01) == 0x01 --读取从机状态
        then
                select_slave(slave)        --选择从机
                return get_float(VT_4x,addr) --获取寄存器值
        else
                return false
        end
end
--读取保存寄存器uint16
function mb_read_reg_03_uint16(slave,addr)
        local onlineState = get_uint16(VT_LW,0x01A3)  --获取从机在线状态
        if ((onlineState >> slave) & 0x01) == 0x01 --读取从机状态
        then
                select_slave(slave)        --选择从机
                return get_uint16(VT_4x,addr) --获取寄存器值
        else
                return false
        end
end
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 17:26 , Processed in 0.073456 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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