如何在UIFlow中使用ModBus协议-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1719|回复: 0

如何在UIFlow中使用ModBus协议

[复制链接]
发表于 2020-5-12 18:33 | 显示全部楼层 |阅读模式
最新的UIFlow1.5.2版本加入了ModBus的支持,使得串口数据有了数据包形式的封装,当串行总线上有多个设备时可利用星型/树型/菊花链型拓扑结构实现多机通讯。下面将以实例进行示范如何使用ModBus协议。一、了解ModBus
如果你是主机(主子),你需要发送数据包(命令)控制从机(仆人),数据包中需要包含从机地址(名字),功能码(做什么事),寄存器地址(在哪做),数据(怎么做),CRC校验(看看你听明白没有),如果从机收到了正确的数据包,就按照数据包的指示去执行,执行完以后需要向主机发送应答数据包(向主人报告结果)。以上就是ModBus协议对数据处理的基本过程。

二、实现

在UIFlow中主机和从机分别提供了两种方式来接收数据包,一种是利用回调轮循获取数据,一种是在主循环中主动获取数据,两种方式不可同时使用,否则程序在主循环中无法跳出执行回调。下面通过两台M5Stack Fire建立主从机实现ModBus通讯,当主机可以通过A/B按键发送命令控制从机的LED点亮和熄灭,从机也可以通过自身的A/B按键点亮和熄灭LED,并发送数据包主动上报自己的状态。接收和发送的数据都可以通过屏幕来进行查看。


1.主机在Loop中接收响应数据包
modbus_loop_master_user.jpg
为了降低串口数据干扰,对接收内容进行判断,数据包大于3字节视为有效数据,由于主机接收的是字节流,为了直观显示从机地址和功能码,利用列表内置的类型转换对数据进行处理,将最终结果显示到屏幕上。按下A键时将发送一个包含数据命令(2)熄灭LED的数据包,按下按键B将发送包含数据命令(1)点亮LED的数据包。

2.主机在回调函数中接收响应数据包
modbus_callback_master_user.jpg
定义3个变量add,fun,data分别用于接收从机返回的数据,将数据显示在屏幕上。如果未来你的程序需要频繁进行数据收发处理,可以直接在回调中对3个变量值进行判断进行校验检查。

1.从机在Loop中接收数据包
modbus_loop_slave_user.jpg
先进行初始化设置端口与地址,利用功能码、寄存器地址为从机设定可接收的数据包格式与功能。分析指定数据包的内容并进行判断操作,根据包内的值更新自身的数据并回应主机。Get rx buffer date 将读取原始数据。按下A键熄灭自身的LED,更新状态并报告主机,按下B键点亮自身LED,更新状态并报告主机。

2.从机利用回调函数接收数据包
modbus_callback_slave_user.jpg
定义变量接收主机数据包,筛选指定数据包并通过数据参数控制LED,同时上报主机。如果按下A键熄灭自身LED更新状态上报主机,如果按下B键点亮LED,更新状态上报主机。

总结:主机发送指定格式的数据包并接收从机应答数据包。从机接收指定格式数据包并执行操作,同时更新自身的数据内容最后以数据包形式上报主机。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:34 , Processed in 0.101652 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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