3.Modbus介绍【工业控制系列】
一、Modbus协议介绍
Modbus协议最初由Modicon公司开发,此协议支持传统的RS-232、 RS-422、RS-485和以太网。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。
Modbus协议种类
Modbus常见的类型包括:ASCII、RTU、TCP。标准的Modicon控制器使用RS232实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息与数据的结构、命令和就答的方式,数据通讯采用Master/Slave方式。
如图所示就是RS232的通讯线

Modbus协议校验
Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外;ASCII模式采用LRC校验,LRC包含一个8位二进制的字节;RTU模式采用16位CRC校验,CRC域是两个字节,,包含一个16位的二进制值;TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。
二、Modbus功能码介绍
Modbus协议在设计之初中定义了三类功能码,分别是:公共功能码、用户定义功能码、保留功能码。
- 公共功能码
由MODBUS基金会进行设定,其中包含已被定义的功能码和未来使用的未指配保留供功能码;所有使用Modbus协议设备需要遵守相关功能码设定。
- 用户定义功能码
因为Modbus协议中设定的设定功能码主要针对的是对设备控制管理使用的是公共功能码。而对于设备使用内部上传下载程序使用多为用户自定义的功能码,为十进制的65至72和十进制100至110。用户没有MODBUS组织的任何批准就可以选择和实现一个功能码,也无法保证被选功能码的使用是唯一的。
- 保留功能码
一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。例如施耐德PLC设备使用的90功能码;国内安控PLC使用的89功能码。
更多的Modbus功能码

三、Modbus通讯示例
在TCP连接后,通过Modbus功能码进行确定相关操作请求。03功能码进行读内部输出量的寄存器,从0000开始读取5个寄存器内部数据;在Modbus设备响应Modbus数据层首先是寄存器为03,数据长度为0a(也就是十进制的10),然后为每一个寄存器内的值。

如下是另一个例子,首先确定功能码为01为读内部比特量输出状态;从0000寄存器开始读取到0003寄存器

返回内容首先也为数据通讯的功能码01,长度01,因Wireshark使用的为十六进制,使用2进制转换得到结果即为服务端返回101,为寄存器数据信息。

四、Modbus协议工作流程
刚才的是正常的Modbus的响应流程对于异常通讯用Modbus协议中规定响应功能码=请求功能码+0x80,用来为客户机提供处理过程中与被发现的差错相关的信息。
详细的处理错误过程为:输入有效的功能码然后进行判断是否为有效的数据地址,是否为有效的数据值,是否为有效的MB功能,如果说都正常的话会响应Modbus结果,每一次异常都会在功能码加上_1,_2,_3,_4....加上0x80作为异常响应
