Modbus什么是协议? 百度的解释是协议、网络协议的简称,网络协议是通信计算机双方必须共同遵守的一组约定。 如何建立连接,如何识别彼此等。 只有遵守这个约定,计算机才能相互通信交流。 其三个要素是语法、语义和时间序列。
我们所说的modbus协议也有类似的意义,协议遵循一组约定规则,通信的两侧(客户端/服务器端)根据该约定规则发送和接收消息。
举个小例子吧。 我们现在在对话。 我说闽南语,你说福州语。 我不知道你在说什么,你也不知道我在说什么! 因为我们互相听不懂对方的话,所以如果我们想让双方都能听懂,就只能说两个人通用的话。 那就是普通话。 所以,这里“普通话”所体现的作用类似于“协议”。
上面的例子正式理解协议的作用吗? 不知道也没关系。 现在,让我们来具体看看应用于协议的情况:
在这里,我们将创建一个双端的简单协议。 #消息*
在满足这种格式之前,客户端无法接收从服务端发送的消息。 否则,客户端不会处理此消息。 此处的“#”:消息标头、“消息”:消息主体、“*”:消息末尾。 这是一个简单的使用协议完成通信的过程。
图1
图1:中服务端发送的消息客户端可以正常接收,而中服务端发送的消息客户端不能正常接收。 因为发送的消息遵循协议。 因为#…*,的服务端发送的消息遵循协议。 #…#由于双方的协议不一致,的客户端无法正常处理数据。
现在我们知道什么是协议,但我们的重点是modbus协议。 modbus协议是什么? 虽然以前知道什么是协议,但modbus协议是一个具有强大规则的协议体系。 广泛用于plc等工业控制器的数据收集和设定。
1、在了解请求和响应modbus协议之前,了解“请求/响应”模式。 什么是“请求/响应”? 这对应着两个词。 也就是两端。
列举一下列子吧。 我问thdbm。 “你叫什么名字? “”,thdbm回答“我的名字是thdbm”,“thdbm几岁了? ”。 thdbm回答说:“我4岁。” 其中,即使我请求了我听到的流程,thdbm回答的流程也是响应。 如下图2所示:
图2
我们的意见理解了什么要求和响应模式? 为什么要说这个模型呢? 为什么这么说,是因为modbus协议采用了这样的模式。 例如,现在计算机等上位机获取设备的数据。 那么,我们不能总是让设备向上位机发送数据吗? 这种方式消耗资源过多,设备连接量和数据量大,上位机接收也存在问题,不太现实。 所以modbus采用请求和响应模式,比较符合实际需求。
Modbus协议中常用的协议版本是modbus-rtu、modbus-ascii和modbus-tcp。 以modbus-rtu为例。 服务器当前温湿度传感器的收集值如下图3所示。
图3
你不觉得看了上面的图就能明白一点吗? 不是有几个问题吗? 框架是什么? 什么是咨询帧、应答帧? 什么是地址码? 等问题。 我们一次解答。
2、首先是几帧? 请注意,这里所说的帧是“数据帧”而不是“视频帧”,它由三部分组成:帧头、数据部分和帧尾。 我们之前列举过一个例子吗? “#message*”,这是一个简单的数据帧,有头、尾和数据部分。
3、什么是咨询帧和应答帧? 还记得我们说的话吗? 请求和响应,询问帧对应于请求,响应帧对应于响应。 有问题和回答呢。 引入框架概念的是以规定的格式提问和回答。
4、什么是地址码?地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。怎么理解呢?就是比如说我有好几个温湿度传感器,那我要取数据的时候要指定一个而这个地址码的功能类似于给设备标号。
5、什么是功能代码呢?通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。作为主机请求发送,通过功能码告诉从机执行什么动作。
这个表中的0x03既是获取保存寄存器数据的功能码。其他常用的功能码还有
01(0x01 )读线圈02 )0x02 )读离散量输入03 )0x03 )读保持寄存器04 )0x04 )读输入寄存器05 )0x05 )写单一线圈06 )0x06 )写单一寄存器15 )0x06 里面有zydzt数据是我们真正想得到的内容。 数据位需要根据情况分析数据。
7、最后的奇偶校验位是什么? 奇偶校验位的作用是检查数据的完整性。 这样说好像有点听不懂,实际上如果再数据传输中万一数据丢失,出现了错误的信息,我们接收到的数据该怎么办呢? 需要验证奇偶校验位是否正确,并告诉我这个数据是否可用。 检查的原理是什么呢? 以请求帧为例,最后两个人是奇偶校验位。 它是怎么来的? 这在服务端发送请求帧之前,用crc16算法在检查比特的前6个字节中计算一个分,得分必须是16
位的也就是2个字节。然后发送出去的数据帧就是一共就是8个字节。而客户端设备在收到请求帧以后先根据crc16算法计算前6个字节数据得出来两个字节的得数,和收到的数据的最末尾两个字节是否一致来判断数据的正确与否。 Modbus协议举例 1、获取数字量数据现在我们解开了各种问题。那么我们来分析一个具体案例。就拿图3的温湿度数据表了说吧:
(1)服务器端发起向客户端发起请求:数据帧就整如上图所示,
怎么接读这条数据信息询问帧呢?我们要让地址位为0x01的设备告诉我们它现在收集(0x03)到的数据是什么?
(2)然后客户端接收到问询帧的时候,先判断地址码是不是自己的然后计算最后的校验位看看数据是否正确。最后解析数位,功能码为03要把自己的此时收集到数据交给服务端。
(3)客户端将采集到的数据按照协议格式封包发送给服务器端;
(4)服务器端解析协议包中的数据,获得最终数据;
下面是图解:
客户端接收到数据帧后有自然有正确也有错误的分别了,正确的上面的介绍过了,但是如果出现数据错误呢?那自然也要告诉服务器数据出错了,及出错的原因如下表所示:
Rtu回应请求错误报文
从机地址功能号错误代码CRC校验1byte1byte1byte2byte018102C1 91错误代码所表达的意思:
MODBUS_RTU错误代码:
代码名称含义01不合法功能代码从机接收的是一种不能执行功能代码。发出查询命令后,该代码指示无程序功能。02不合法数据地址接收的数据地址,是从机不允许的地址。03Crc校验出错从机读扩展内存中的数据时,发现有crc校验错误,主机按从机的要求重新发送数据请求。04发送请求报文长度不正确收到的请求帧长度总长度不正确2、设置数字量Modbus协议支持读取一个数字量的数据同样也支持设置一个数字量。
主机发送报文格式:
从机地址功能码起始地址写入数据CRC校验010600 2C07 D04B AF我们需要在开始地址0x2c的位置写入一个数值为2000(0x07 0xD0)的数据。
从机响应返回的报文格式:
从机地址功能码起始地址写入数据CRC校验010600 2C07 D04B AF从机接收到报文后返回与请求报文一致的报文。
图解:
3、读取开关量设备Modbus不仅支持数字量设备也支持开关量设备读写操作,现在我们来试试读取一个开关量设备(如人体红外,火焰报警等)的开/关状态。
主机发送报文格式:
从机地址功能码起始地址读数据长度CRC校验010200 0000 0479 C9主机发送一个请求为要获取地址0x00的开关量设备的状态。读取数据长度为04即同时读取4个开关量设备的状态。
从机响应返回的报文格式:
从机地址功能码数据长度DI状态数据CRC校验0102010BE0 4F返回的DI状态数据既是开关量的开关状态,0B即为DI0到DI4是开起状态,0x0B解析转换为2进制为1011 ,表示DI0:开,DI1:开,DI2:关,DI3:开。
图解:
4、设置开关量的设备但我们想设置一个开关量设备(继电器)的开关状态时该怎么做呢?
主机发送报文格式:
从机地址功能码输出bit地址控制命令CRC校验010500 00FF 008C 3A主机需要向DO0发送一个开启指令0xFF 0x00。Bit地址:需更改状态的数据位 00 00即为DO0, DO1就是00 01。而控制命令 FF 00为开启指令, 00 00为关闭指令。
从机响应返回的报文格式:
从机地址功能码输出bit地址控制命令CRC校验010500 00FF 008C 3A和发送的报文一样。
图解:
好了到这里我们对modbus-rtu协议介绍就结束了,其实modbus-ascii和modbus-tcp也是类似了。Modbus协议只要它有协议两个字那么它的本质就不会变还是那句话:协议要遵循一套约定的规则。