原文链接:https://blog.csdn.net/byxdaz/article/details/77892778
介绍:
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。
Modbus 是一个请求/应答协议。也叫做Slave和Master与Server和Client。
同一种设备在不同领域的不同叫法。
Slave:工业自动化用语;响应请求;
Master:工业自动化用语;发送请求;
Server:IT用语;响应请求;
Client:IT用语;发送请求;
在Modbus中,Slave和Server意思相同,Master和Client意思相同。
协议分类
ModBus协议是应用层报文传输协议(OSI模型第7层),它定义了一个与通信层无关的协议数据单元(PDU),即PDU=功能码+数据域。
ModBus协议能够应用在不同类型的总线或网络。对应不同的总线或网络,Modbus协议引入一些附加域映射成应用数据单元(ADU),即ADU=附加域+PDU。目前,
Modbus有下列三种通信方式:
1.以太网,对应的通信模式是MODBUS TCP。
2.异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等),对应的通信模式是MODBUS RTU或MODBUS ASCII。
3.高速令牌传递网络,对应的通信模式是Modbus PLUS。
Modbus消息帧
ASCII帧:
使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。
其它域可以使用的传输字符是十六进制的0…9,A…F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。
消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:
起始位 | 设备地址 | 功能代码 | 数据 | LRC效验 | 结束符 |
---|---|---|---|---|---|
1个字符 | 2个字符 | 2个字符 | n个字符 | 2个字符 | 2个字符 |
2、RTU帧
使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0…9,A…F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。
整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:
起始位 | 设备地址 | 功能代码 | 数据 | LRC效验 | 结束符 |
---|---|---|---|---|---|
T1 -T2-T3-T4 | 8bit | 8bit | n个8bit | 16bit | T1-T2-T3-T4 |