modbus最多可以有几个站点(看完这个如果还不懂Modbus)
modbus最多可以有几个站点(看完这个如果还不懂Modbus)5.既然功能码知道了,肯定还要知道该怎么发送请求吧,既然是MODBUS通讯协议,那就有Modbus的规则。下面我就以一个读保持寄存器来详细描述整个过程。0x01: 读线圈寄存器0x02: 读离散输入寄存器0x03: 读保持寄存器0x04: 读输入寄存器0x05: 写单个线圈寄存器0x06: 写单个保持寄存器0x0f: 写多个线圈寄存器0x10: 写多个保持寄存器2.从站里面数据分很多的存储区,大致分为离散(就是开关量)、线圈、寄存器输入、寄存器输出。3.主站需要去从站里面取数据,首先要知道自己去哪里取,取得数据是什么内容。(就像你要从你老婆那里偷偷的拿钱,总要知道老婆把钱放那里了吧!)4.如果主站知道了要取什么数据了,就要有对应的指令,下面列举Modbus主要功能码,
MODBUS协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。
主要协议不再详细赘述,网上一找一大把,也浪费文章篇幅,相信搞工控的人,这点能力还是有的。
重要的几点:
1.Modbus分主站和从站,所有的数据内容其实都存在从站里面(相当于服务器),主站只不过是请求从站中某个地址的数据内容(读和写),也就是主站请求,从站应答。主站不发请求信号,从站屁都不能放一个,这一点对于初学者的理解十分重要,一定要心里有一个概念。
2.从站里面数据分很多的存储区,大致分为离散(就是开关量)、线圈、寄存器输入、寄存器输出。
3.主站需要去从站里面取数据,首先要知道自己去哪里取,取得数据是什么内容。(就像你要从你老婆那里偷偷的拿钱,总要知道老婆把钱放那里了吧!)
4.如果主站知道了要取什么数据了,就要有对应的指令,下面列举Modbus主要功能码,
0x01: 读线圈寄存器
0x02: 读离散输入寄存器
0x03: 读保持寄存器
0x04: 读输入寄存器
0x05: 写单个线圈寄存器
0x06: 写单个保持寄存器
0x0f: 写多个线圈寄存器
0x10: 写多个保持寄存器
5.既然功能码知道了,肯定还要知道该怎么发送请求吧,既然是MODBUS通讯协议,那就有Modbus的规则。下面我就以一个读保持寄存器来详细描述整个过程。
6.以ModbusRTU为例 03号功能码对应的发送报文如下:
主站发送
主机发送表示的内容,想要读取1号从机从0x32开始的2个寄存器的内容。
ox01: 从站地址
0x03:功能码
0x00 0x32:需要读取存储区的起始地址(从0x32)开始
0x00 0x02:需要读取的数量,要读几个存储区。
0x65 0xC4(上图列举错误):CRC校验码(不知道CRC校验是什么的,看我其他文章)
从站应答
从站应答的内容主要表示为我收到了,返回4个字节,前面2个字节是要请求的第一个寄存器数据,后面2个字节是请求的第二个寄存器数据。
6.整个发送应答就是这样一个过程。
7.如果还有人不明白的话,那我就以波形分析,串口到底是怎么发送应答的。
站地址01
串口硬件发送的规定如下:波特率9600bps 起始位1位,数据位8位,校验位1位(无校验),停止位1位
所以发送一次,一共要发8 1 1=10位
上面说到主站发送报文:01 、03、00、32、00、02、 65、 C4(都是16进制)
那要发送那么多数据,总要一个字节,一个字节来发吧(初学者,这里面会混淆),所以串口要首先发送01:怎么发01这个数据呢?
0X01的二进制:000 000 01
这里面注意几点:空闲位一直是高电平,起始位是低电平,停止位是高电平,还有一点发送数据的时候是低位先发,就是00000001 ,发送的时候是10000000.低位在前!低位在前!低位在前!
发完第一个接下去就是发第二个03、00、32、00、02、65、C4.
然后等待从站应答。
以上是个人的理解,也有助于大家能透彻理解整个过程,谢谢大家,原创不容易,且行且珍惜,记得点赞关注,我是工控小桥。