文章仅作为对Modbus的简单了解,如果错误,还请留言指正,谢谢
最近公司项目需要使用到Modbus协议,特意去了解了一下,以下是简单的总结
一、Modbus协议是什么
Modbus协议是工业控制领域的通讯协议,说白了就是为了机器之间通讯用的。
可能有人对于通讯协议还不是很了解,那我们可以将其拆分为通讯和协议两部分,通讯就是交流沟通的意思,就像你和你的朋友平时聊天对话一样,机器之间的沟通就称之为通讯,那既然是沟通,就一定要遵守一个规范吧,就比如我们都是中国人,聊天的时候大多数都是讲普通话的,总不能你讲阿拉伯语,我讲英语吧,可以这么说,双方都认可并且遵守的规约便是协议,所以通讯协议就是机器之间沟通的共同遵守的约定。
二、Modbus存储区
既然是需要沟通交流了,那是不是要有点“墨水”才能更好地交流呢?总不能像一张白纸一样,啥也不知道,别人问话就一直保持沉默吧。
机器之间的沟通同样如此,就比如机器A问机器B:“B同学,你最近都在干啥呢?”,这时机器B就会把它最近的数据发送给A。那涉及到数据这一块,不可能无中生有吧,这样子就需要有一个容器要盛放一些预先存储好的数据,而根据存储内容和可进行的操作可以分为以下四种容器(即存储区)
区号 | 存储区 | 可以进行的操作 | 存储内容 |
0 | 输出线圈 | 可读只写 | 布尔值,一般表示开关状态 |
1 | 输入线圈 | 只读 | 布尔值,一般表示开关状态 |
3 | 输入寄存器 | 只读 | 16位数据,可以表示为温度/湿度等 |
4 | 输出寄存器 | 可读可写 | 16位数据,可以表示为温度/湿度等 |
三、功能码
A机器找B机器时,要想B机器干活,A机器就得让B机器明白A想让B干啥吧(读或者写),总不能我让你往东你偏偏往西吧。这就得讲到功能码了。功能码描述你要对谁(存储区) 进行是什么操作(读/写)
如果你对读和写很陌生,请看该段落,写的过程可以比如老师和学生探讨问题,学生思路想错了,老师会去指正这个错误,这时学生对这道题的思路发生了改变,这就是一个写的过程。而你从你的朋友口中得知最近谁谁谁怎么样了,谁谁谁去哪工作了,这就是一个读的过程。
功能码(注意:0x标识数据是16进制的) | 功能说明 |
0x01 | 读输出线圈 |
0x02 | 读输入线圈 |
0x03 | 读输出寄存器 |
0x04 | 读输入寄存器 |
0x05 | 写单个输出线圈 |
0x06 | 写单个输出寄存器 |
0x0F | 写多个输出线圈 |
0x10 | 写多个输出寄存器 |
四、协议报文!!!重点
大多数网络协议归根到底就是为了明确报文的格式,也就是你发送数据和接受数据的格式,就像请假条有请假条的格式,邀请函有邀请函的格式,保证书有保证书的格式。而Modbus协议也有自己的报文格式
先了解一下,Modbus协议实际上可以分为三种Modbus RTU、Modbus ASCII,Modbus TCP
Modbus RTU会主流一点,这里就将Modbus RTU吧
Modbus RTU协议格式:
站地址(1 byte) | 功能码(1 byte) | 数据(n byte) | 校验码(2 byte) |
站地址: 可以简单理解为设备的大概位置
功能码:对哪种设备(线圈/寄存器)进行哪种操作(读/写)
数据:一些没有规定好的内容,就比如你要去读哪个线圈(第一个还是第九百个)、读多少个线圈,又或者是读到的数据是什么,这些都记录在数据中
校验码:提供校验功能,主要是为了提高数据的安全性
参考网址:详解Modbus通信协议---清晰易懂_Z小旋的博客-CSDN博客_modbus通讯协议