modbus主从机(理论+实践)

参考 anfly 的主从机代码

学会了机制和底层,后面大家有需要的话直接用其他主流协议栈也行,后面会把其他主流协议中也加到我的

这篇理论大家需要的话可以直接去安富莱官网下,不用在我这里看一样的。

实战帖子链接:

目录

1 modbus标准介绍

2 协议概述

3 主从协议栈原理

4 modbus的帧描述

4.1 RTU传输模式

4.2 RTU

4.3 MODBUS 事务处理流程

5 功能码

公共功能码定义

5.1读线圈寄存器 01H

5.2 读离散输入寄存器 02H

5.3 读保持寄存器 0 3 H (常用)

5.4 输入寄存器 0 4 H

5.5 写单个线圈寄存器 05H

5.6 写单个保持寄存器 06H

5.7 写多个保持寄存器 10H

5.8 写多个线圈寄存器 0FH

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个寄存器

5.2 读离散输入寄存器 02H

5.3 读保持寄存器 0 3 H (常用)

5.4 输入寄存器 0 4 H

5.5 写单个线圈寄存器 05H

5.6 写单个保持寄存器 06H

5.7 写多个保持寄存器 10H

5.8 写多个线圈寄存器 0FH

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值