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

vany5921 发表于 2020-5-12 18:33

如何在UIFlow中使用ModBus协议

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

二、实现

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


1.主机在Loop中接收响应数据包

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

2.主机在回调函数中接收响应数据包

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

1.从机在Loop中接收数据包

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

2.从机利用回调函数接收数据包

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

总结:主机发送指定格式的数据包并接收从机应答数据包。从机接收指定格式数据包并执行操作,同时更新自身的数据内容最后以数据包形式上报主机。
页: [1]
查看完整版本: 如何在UIFlow中使用ModBus协议