一、简述
1、Modbus是什么?
Modbus是一种通信协议,相当于机器之间经过一定规范的一种语言,它属于一种串行通信协议。
问题:什么是串行通信?
2、Modbus RTU、Modbus TCP是什么?
Modbus RTU、Modbus ASCII、Modbus TCP、Modbus Plus都属于通信协议,都是由Modbus协议变换来的,在Modbus的基础上进行改变所衍变出Modbus RTU、Modbus ASCII、Modbus TCP、Modbus Plus。
3、RS485、RS232是什么?
RS:推荐标准
485、232:标识号
RS485、RS232指的是不同的电平标准。他们属于通信接口标准。
二、详解
1、Modbus、Modbus RTU、Modbus TCP都是通信协议。
归纳:Modbus 通信协议就是一种用在工业上的简单协议!
2、通讯过程
Modbus是主从方式通信,且是一主多从的通信协议,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。从机不会自己发送消息给主站,只能回复从主机发送的消息请求。
Modbus并没有忙机制判断,比方说主机给从机发送命令, 从机没有收到或者正在处理其他东西,这时候就不能响应主机,因为modbus的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。
举例:就像你给同学打电话(电话就是唯一地址),然后打电话过去,相当于主机找从机,然后对方方接通给你回复信息。(大概意思是这样)
3、Modbus协议存储区及功能码
代码 | 名称 | 英文 | 寄存器PLC地址 | 位/字操作 | 操作数量 |
01 | 读线圈状态 | Read Coils | 00001~09999 | 位操作 | 单个或多个 |
02 | 读离散输入状态 | Read Discrete Inputs | 10001~19999 | 位操作 | 单个或多个 |
03 | 读保持寄存器 | Read Holding Registers | 40001~49999 | 字操作 | 单个或多个 |
04 | 读输入寄存器 | Read Input Registers | 30001~39999 | 字操作 | 单个或多个 |
05 | 写单个线圈 | Write Single Coil | 00001~09999 | 位操作 | 单个 |
06 | 写单个保持寄存器 | Write Single Register | 40001~49999 | 字操作 | 单个 |
15 | 写多个线圈 | Write Multiple Coils | 00001~09999 | 位操作 | 多个 |
16 | 写多个保持寄存器 | Write Multiple Registers | 40001~49999 | 字操作 | 多个 |
功能码的操作可分为两种:
位操作 —— 最小单位为一位(bit),包括读线圈状态功能码 01、读离散输入状态功能码 02、写单个线圈功能码 05 和写多个线圈功能码 15;
字操作 —— 最小单位为两个字节,包括读保持寄存器功能码 03、读输入寄存器功能码 04、写单个保持寄存器功能码 06 和写多个保持寄存器功能码 16。
4、Modbus 协议类型
Modbus协议的传输模式一般分为三种,包括。包括ASCII、RTU、TCP三种报文类型
串行端口存在多个版本的Modbus协议,而最常见的是下面四种:
Modbus-Rtu
Modbus-Ascll
Modbus-Tcp
5、Modbus RTU协议
Modbus协议上规定,设备上必须要有Modbus RTU协议,且默认模式必须是Modbus RTU。
ModbusPlus在工业现场一般都是采用Modbus RTU协议,一般大家说的基于串口通信的Modbus通信协议都是指Modbus RTU通信协议。
与Modbus RTU协议相比较,Modbus TCP协议则是在RTU协议上加一个MBAP报文头,并且由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码的,所以就常用一句比较通俗的话来说:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码字节就OK。
6、Modbus报文帧结构
RTU协议中的指令由地址码(一个字节),功能码(一个字节),起始地址(两个字节),数据(N个字节),校验码(两个字节)五个部分组成。
帧结构 = 地址 + 功能码 +数据 + 校验
从站地址 | 功能码 | 数据 | CRC校验 |
1 byte(字节) | 1 byte(字节) | N bytes(字节) | 2 bytes(字节) |
从机地址:每个从机都有一个唯一地址,占用一个字节,主机发送的地址码,相对应地址码的从机进行应答。地址码为0时,为广播地址,所有从机均能识别,从站不做应答。
功能码:占用一个字节,ModBus通讯规约定义功能号为1到127。通过功能码告诉从机,要进行什么操作。
数据区:根据功能码不同,有不同功能。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。
校验:在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确。
7、Modbus RTU数据报文结构
主机请求(发送):01 03 01 8E 00 04 25 DE //读(0x03),从寄存器地址01 8E 开始读,读4个寄存器00 04
从机响应(返回):01 03 08 00 01 00 01 00 01 00 01 28 D7 // 08表示数据长度 ,00 01 00 01 00 01 00 01读到的数据
从左向右分析该数据报文:
主机请求:
01为设备地址,指的是请求从机的地址;
03为功能码,此时代码03为读取保持寄存器数据;
01 8E为起始地址;
00 04为寄存器数量;
25 DE表示CRC校验位 ;
从机响应:
01为设备地址,从机地址;
03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;
08指示接下来数据的字节长度;
00 01 00 01 00 01 00 01为被读取的保持寄存器中的数据值;
28 D7表示CRC校验位;
主机请求(发送):00 10 00 20 00 01 02 00 00 AC A0 // 写(0x10),从寄存器地址 00 20开始写,写一个寄存器 00 01,写入值 00 00
从机响应(返回):00 10 00 20 00 01 01 D2
从左向右分析该数据报文:
主机请求:
00为设备地址,指的是请求从机的地址;
10为功能码,此时代码10为写多个保持寄存器数据;
00 20为起始地址;
00 01为寄存器数量;
02为写入字节数
00 00写入数值
AC A0表示CRC校验位 ;
从机响应:
00为设备地址,从机地址;
10为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;
00 20寄存器的起始地址;
00 01为被写入保持寄存器的数量;
01D2表示CRC校验位;
8、常用功能码数据帧格式
1) 功能码-0x04(读输入寄存器)
举例:读取2号站,30008~30009 2个输入寄存器的数值。
Modbus RTU主站设备请求帧格式:
设备 地址 [1字节] | 功能码 [1字节] | 起始地址 [2字节] | 寄存器数量 [2字节] | 校验 [2字节] | |||
高8位 | 低8位 | 高8位 | 低8位 | 高8位 | 低8位 | ||
0X02 | 0X04 | 0X00 | 0X07 | 0X00 | 0X02 | 0XC0 | 0X39 |
2号站设备响应帧格式:
设备 地址 [1字节] | 功能码 [1字节] | 字节数 [1字节] | 寄存器值 [寄存器数量*2字节] | 校验 [2字节] | |||||
寄存器1 [高8位] | 寄存器1 [低8位] | .... | 寄存器N [高8位] | 寄存器N [低8位] | 高8位 | 低8位 | |||
0x02 | 0x04 | 0x04 | 0x08 | 0x20 | 0x1A | 0x43 | 0X81 | 0XBF | |
寄存器 30008数值 | 寄存器 30009数值 |
2) 功能码-0x10(写多个寄存器)
举例:向2号站,40002~40003 2个保持寄存器分别写入0x000A,0x0102数值
Modbus RTU主站设备请求帧格式:
设备 地址 [1字节] | 功能码 [1字节] | 起始地址 [2字节] | 寄存器数量 [2字节] | 字节数 [1字节] | 寄存器值 [寄存器数量*2字节] | 校验 [2字节] | |||||||||
高8位 | 低8位 | 高8位 | 低8位 | 寄存器1 [高8位] | 寄存器1 [低8位] | .... | 寄存器N [高8位] | 寄存器N [低8位] | 高8位 | 低8位 | |||||
0x02 | 0x10 | 0x00 | 0x01 | 0x00 | 0x02 | 0x04 | 0x00 | 0x0A | 0x01 | 0x02 | 0x9D | 0x74 | |||
写入寄存器40002 | 写入寄存器40003 |
2号站设备响应帧格式:
设备 地址 [1字节] | 功能码 [1字节] | 起始地址 [2字节] | 寄存器数量 [2字节] | 校验 [2字节] | |||
高8位 | 低8位 | 高8位 | 低8位 | 高8位 | 低8位 | ||
0x02 | 0x10 | 0x00 | 0x01 | 0x00 | 0x02 | 0x10 | 0x3B |
3) 功能码-0x02(读离散量输入)
举例:读取2号站,10197~10218 22个离散量的状态。
Modbus RTU主站设备请求帧格式:
设备 地址 [1字节] | 功能码 [1字节] | 起始地址 [2字节] | 离散输入数量 [2字节] | 校验 [2字节] | |||
高8位 | 低8位 | 高8位 | 低8位 | 高8位 | 低8位 | ||
0x02 | 0x02 | 0x00 | 0xC4 | 0x00 | 0x16 | 0xB8 | 0x0A |
2号站设备响应帧格式:
设备 地址 [1字节] | 功能码 [1字节] | 字节数 [1字节] | 离散量输入状态 | 校验 [2字节] | ||||
离散量 1-8 | 离散量 9-16 | ... | 离散量 N~N+7 | 高8位 | 低8位 | |||
0X02 | 0X02 | 0x03 | 0xAC | 0xDB | 0x35 | 0x22 | 0xBB |
通过前面的介绍,可以看到Modbus RTU协议数据帧是没有起始符和结束符,所以两个数据帧之间需要靠时间间隔来区分。协议中规定信息帧发送至少要有3.5个字符时间的停顿间隔。即在一个数据帧的最后一个字符传输完成之后,需要至少3.5个字符时间的停顿标定数据帧的结束,一个新的数据帧可在此停顿之后开始。如果一个新消息在小于3.5个字符时间内接着前个消息开始,接受的设备将认为它是前一数据帧的延续,这将导致CRC校验出错。同时整个数据帧必须作为一连续的流传输。如果在帧完成之前有超过1.5字符时间的停顿时间,接受设备将刷新不完整的数据帧从而认为存在丢包现象。
那么一个字符是什么呢,他由1个bit起始位,8bit数据位,1个bit奇偶校验位,1个bit停止位组成,在发送时从起始位开始。
9、modbus TCP数据报文结构
Modbus TCP协议是在RTU协议前面添加MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码。
MBAP报文头:
事务处理标识 | 协议标识 | 长度 | 单元标识符 |
2字节 | 2字节 | 2字节 | 1字节 |
事务处理标识 | 可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文 |
协议标识 | 00 00表示ModbusTCP协议 |
长度 | 表示接下来的数据长度,单位为字节 |
单元标识符 | 可以理解为设备地址 |
主机请求(发送):00 00 00 00 00 06 00 03 00 20 00 01
从机响应(返回):00 00 00 00 00 05 00 03 02 00 00
主机请求(发送):00 00 00 00 00 06 00 04 00 30 00 01
从机响应(返回):00 00 00 00 00 05 00 04 02 00 08
主机请求(发送):00 00 00 00 00 09 00 10 00 20 00 01 02 00 00
从机响应(返回):00 00 00 00 00 06 00 10 00 20 00 01
三、modbus TCP、modbus RTU数据报文结构比较(16进制)
1、读指令对比(0x04)
MBAP报文头 | 地址码 | 功能码 | 寄存器地址 | 寄存器数量 | CRC校验 | |
Modbus RTU | 无 | 01 | 04 | 00 00 | 00 16 | 71 C4 |
Modbus TCP | 00 00 00 00 00 06 01 | 04 | 00 00 | 00 16 | 无 |
2、写指令对比(0x10)
MBAP报文头 | 地址码 | 功能码 | 寄存器地址 | 寄存器数量 | 数据长度 | 正文 | CRC校验 | |
Modbus RTU | 无 | 00 | 10 | 00 20 | 00 01 | 02 | 00 | AC A0 |
Modbus TCP | 00 00 00 00 00 09 00 | 10 | 00 20 | 00 01 | 02 | 00 | 无 |
四、RS485、RS232介绍
1、由来
RS-232是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-422由RS-232发展而来,它是为弥补RS-232之不足而提出的。为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到1219米(速率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。由于EIA提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS作前缀称谓。
2、RS232介绍
RS232通讯又叫串口通讯方式。是指计算机通过RS232国际标准协议用串口连接线和单台设备(控制器)进行通讯的方式。
通讯距离:9600波特率下建议在13米以内。
通讯速率(波特率 Baud Rate):缺省常用的是 9600 bps,常见的还有 1200 2400 4800 19200 38400等。波特率越大,传输速度越快,但稳定的传输距离越短,抗干扰能力越差。
串口连接线:一般标配是3米以内。
3、RS485介绍
RS485和RS232的基本的通讯机理是一致的,他的优点在于弥补了RS232通讯距离短,不能进行多台设备同时进行联网管理的缺点。
计算机通过 RS232、RS485转换器,依次连接多台485设备(门禁控制器),采用轮询的方式,对总线上的设备轮流进行通讯。
接线标示是 485+ 485-,分别对应链接设备(控制器)的 485+ 485-。
通讯距离:最远的设备(控制器)到计算机的连线理论上的距离是1200米,建议客户控制在800米以内,能控制在300米以内效果最好。如果距离超长,可以选购 485中继器(延长器)(请向专业的转换器生产公司购买,中继器的放置位置是在总线中间还是开始,请参考相关厂家的说明书。)选购中继器理论上可以延长到 3000米。
负载数量:即一条485总线可以带多少台设备(控制器),这个取决于控制器的通讯芯片和485转换器的通讯芯片的选型,一般有 32台,64台,128台,256台几种选择,这个是理论的数字,实际应用时,根据现场环境,通讯距离等因素,负载数量达不到指标数。微耕公司控制器和转换器按256台设计,实际建议客户每条总线控制在80台以内。如果有几百上千台控制器,请采用 多串口卡 或者 485HUB来解决,具体 请参考“如果系统控制器数成百上千台,如何组网?”坚决禁止使用无源485转换器,具体请参考“为什么禁止使用无源485转换器?”
485通讯总线(必须用双绞线,或者网线的其中一组),如果用普通的电线(没有双绞)干扰将非常大,通讯不畅,甚至通讯不上。
每台控制器设备必须手牵手地串下去,不可以有星型连接或者分叉。如果有星型连接或者分叉,干扰将非常大,通讯不畅,甚至通讯不上。
4、RS422介绍
他的通讯原理和RS485类似,区别在于他的总线是两组双绞线(4根线),分别标示为 R+ R- T+ T- 。缺点是布线成本高,容易搞错。现在用得比较少了。
RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。图5是典型的RS-422四线接口。实际上还有一根信号地线,共5根线。图4是其DB9连接器引脚定义。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。
RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。
RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。