Modbus协议栈应用实例之一:Modbus RTU主站应用

本文详细介绍如何使用自研Modbus协议栈实现ModbusRTU主站,包括主站对象定义、数据请求生成及响应解析等关键步骤,通过实例演示了与从站的数据通讯流程。

自从开源了我们自己开发的Modbus协议栈之后,有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例,在这一篇中我们先来使用协议栈实现Modbus RTU主站的示例。

1、何为RTU主站

Modbus协议是一个主从协议,那肯定就有主站和从站之分。所谓主站说的简单一点就是能够主动发起通讯的对象,所以主站就是发起通讯的一方。

对于RTU主站来说,自己并不会产生数据,而是要从从站获取数据。在Modbus RTU协议中从站不会主动向外发送数据,所以需要主站发送数据请求,从站才会向其返回请求的数据。这一过程如下图所示:

从上图我们不难看出,首先主站要主动发起数据请求,这也是它为什么被称之为主站的缘由。它首先告诉从站我需要哪些数据。然后从站按照主站的请求返回数据。主站得到响应后解析数据,这样就完成了主从站之间的一次数据通讯。所以主站就需要主动发起每一次数据通讯的对象。

2、如何实现RTU主站

我们已经简单的说明了什么是RTU的主站,那么如何实现这一主站呢?其实在协议栈中,我们已经实现了主站的数据请求命令的合成以及响应数据的解析,所以我们使用协议栈时就是要控制何时将协议栈合成的主站请求命令发出以及如何解析数据响应进而得到想要的数据的过程。

在我们的协议栈中实现了0x01、0x02、0x03、0x04、0x05、0x06、0x0F以及0x10等功能码。也就是说主站对象可以生成面向这些功能码的从站数据请求。也可以解析面向这些功能码的从站数据响应。可以表示为下图所示:

从上图我们很清楚,协议栈已经实现了面向这些功能码的数据请求命令的生成以及数据响应消息的解析。我们使用协议栈时需要做的就是要告诉协议栈我要生成哪些数据请求命令以及如何解析数据响应消息。

2.1、怎么生成数据请求

对于数据请求,我们不一定需要面向全部功能码的请求,我们只需要根据我们的需求合成我们想要的请求。

在协议栈中,针对数据请求的生成我们定义了一个从站访问命令生成函数。该函数的原型如下:

uint16_t CreateAccessSlaveCommand(ObjAccessInfo objInfo,void *dataList,uint8_t *commandBytes)

该函数有3个参数,其中ObjAccessInfo objInfo为对象访问信息;void *dataList为数据列表指针,该参数主要用于写从站功能的命令生成;uint8_t *commandBytes为返回的从站访问命令。

ObjAccessInfo是一个结构体,向函数传递我们想要生成的从站访问命令的相关信息,包括站地址,功能码,起始地址和数量。该结构体的定义如下:

/*定义用于传递要访问从站(服务器)的信息*/
typedef struct{
  uint8_t unitID;
  FunctionCode functionCode;
  uint16_t startingAddress;
  uint16_t quantity;
}ObjAccessInfo;

2.2、怎么解析数据响应

对于数据响应,我们同样不需要考虑全部的操作码,我们一般需要考虑读请求的响应,因为他们的数据需要解析。而对于写请求返回数响应只是告诉主站成功或者不成功,即使不成功只需要在写一次就可以了,不存在数据更新的问题。

在协议栈中,我们实现了主站解析从站数据响应的解析函数。使用这一函数我们只需要将收到的数据响应报文传递给解析函数就可以完成解析。该函数的原型定义如下:

void ParsingSlaveRespondMessage(RTULocalMasterType *master,uint8_t *recievedMessage,uint8_t *command)

这个函数有3个参数,其中RTULocalMasterType *master为主站对象;uint8_t *recievedMessage为接收到的响应消息;uint8_t *command为发送的命令序列。将这几个参数传递给解析函数就可实现数据响应的解析。

RTULocalMasterT

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值