参考 anfly 的主从机代码
学会了机制和底层,后面大家有需要的话直接用其他主流协议栈也行,后面会把其他主流协议中也加到我的
这篇理论大家需要的话可以直接去安富莱官网下,不用在我这里看一样的。
实战帖子链接:
目录
1 学习modbus主从协议栈需要先学习他的机制然后一般文章都会先介绍modbus是什么,然后介绍modbus实现了什么,再是modbus协议。这里我们也按照这些来讲解把
1 modbus标准介绍
这里偷懒,直接抄了安富莱的文件,大概就是这是一个工业上使用的协议。是基于485 和232这种工业串口的所以抗干扰能力强。
2 协议概述
只有三层:应用层、数据链路层、和物理层
主站:就是发从站id 在需要的时候去问他们要数据 从站:不能主动通讯,只能等待
物理层 主流的是用485,毕竟抗干扰能力比232更强。
3 主从协议栈原理
这里的单播和广播,其实就是设备码:可以指定一个设备。也能直接访问所以子设备。
其实就比如一个总线上:接了10个温湿度采集设备,这10个设备都有自己的地址码从1-10,你想访问几就访问几。最大是256,因为modbus协议里面一个功能码只占1字节
4 modbus的帧描述
简单点说就是:设备号+功能码+数据+CRC
比如:01 03 00 01 00 01 crc 这是设备号是01 功能码是03 然后第3 4字节是想要读取的地址 5 6个为想要读几位 然后是crc冗余校验,这就是一个modbus帧
这是安富莱给出的具体描述。
4.1 RTU传输模式
一般使用的都是RTU模式,大家可以看看介绍
然后是RTU模式下的字节格式 每8位前面都会有一个起始位,后面一个结束位一个停止位和校验位。
帧描述
就是上面举例的那种:这里数据可以很多,比如你主机想一次获取20个字节就0001 0014就行,从第一个字节开始获取20个字节,这种因为功能码不一样,具体的也不一样,后面细说。
4.2 RTU
这里有两个东西很重要
1 帧间隔,若大于3.5个字符就会被判断位报文已经结束
然后帧内:需要小于1.5字符的发送时间,否则会判断为结束,然后校验失败丢包。
然后这是这是安富莱给出的建议:超时时长的设定。
之后是状态图和一些图例的解释,已经算是写的很明白了
然后是是CRC校验
其实大家会算就行了,这东西我们平时基本都是直接拿CRC冗余计算器直接算的值,并不会使用这种方法去手算。方法如下,反正手算挺麻烦的我记得。如果真的有疑惑我可以找纸算一下,然后拍出来举例,打字并不好实现。
4.3 MODBUS 事务处理流程
这个是modbus处理异常指令的流程 首先确认操作码(功能码)有效就继续,确认地址还是有效就确认数据,都是有效的就正常相应,不正常就返回错误
例子
异常描述,大家可以看看。
5 功能码
这里大家了解一下分区
公共功能码定义
然后这里写了最常用的几个是上面,并且后面会对每个功能码做个描述
这里也很重要,需要逐个了解,毕竟后面写代码是要适配所有功能码的。
这里可以结合实战看,这后面大家看实战的时候,看目录找到对应的功能码,对着代码看一下定义和实现就好了。
5.1读线圈寄存器 01H
描述:读MODBUS从机线圈寄存器当前状态。
这里看一下:主机发送,这里访问从13到37的线圈:从13开始访问25个寄存器