MODUS通讯协议

第一部分

1. 主从模式

RS-485上的软件层协议ModBus主要依赖于主从模式。主从模式是指在半双工通讯方式上,2个或者2个以上的设备组成的通讯系统中: 

(1) 至少且只有一个主机,其它的都是从机 ;
(2) 不管任何时候,从机都不能主动向主机发送数据 ;
(3) 主机具有访问从机的权限,从机不可以主动访问从机,任何一次数据交换,都要由主机发起 ;
(4)不管是主机还是从机,系统一旦上电,都要把自己置于接收状态(或者称为监听状态) 。
主从机的数据交互,需要: 
a. 主机将自己转为发送状态 ;
b. 主机按照预先约定的格式发出寻址数据帧。 

所谓的约定,可是主机开发者和从机开发者约定好的规约好,例如主机要通过从机控制接在从机的电机,主机要启动电机就往从机发0x1,停止电机就往从机发0x2。这就是一种预先约定好的格式,但是这样做,互换性、兼容性、通用性差,例如其他公司是约定发送0x03让电机转动,发0x04让电机停止。导致不同厂家的主机、从机不能相互通讯。用户需要的,就像网络操作,只要接入有网的网线那么计算机都能上网。 

所以说,我们需要一种大家都共同遵循的规则(可以是ModBus,也可以是TCP/IP等上层协议),这种大家认可,共同遵循的软件层协议。软件层协议主要是解决如何解析传输的数据,即传输的目的或者更加可靠的传输数据。 
半双工通讯中,都是主机寻找从机,主机的目的无非有: 主机要发数据给从机,或者主机要从从机中获取数据。 
c. 主机恢复自身的接收状态 
主机等待自身所寻址的从机作回应,也就是说从机接收到主机的寻址命令、数据后一定要回应主机,不然主机会认为从机通讯异常。回应数据包也是要按照ModBus协议规约(其实不局限ModBus,像TCP/IP也需要回应是吧!~)

2. MODUS通讯协议

俗点来讲,ModBus规约了起停电机,主机要分别发送什么命令给从机。ModBus规定主从机之间数据的交互,需要遵循什么样的格式,如何保证数据在传输过程中不发生冲突。只要都遵循这个协议,那么不同厂家的主从机就可以共用了。 
ModBus一般是工作在一主多从的场景,还是这个图: 

主机和从机之间的连线不一定是非要485来作为载体,也可以是IIC,SPI。因为ModBus是软件层的协议,它既可以规约485硬件接线方式,也可以规约其他硬件接线方式。很多资料会写”基于RS-485的ModBus通讯协议”,意思是底层的0、1数据是通过RS-485方式去传输的,0、1的意义则是通过ModBus去解析的。强调,硬件协议可以确保数据得以传输出去,软件协议保障数据的有序传输,数据不会发生冲突。 

ModBus规定: 
(1) 主从模式 
有的协议规定是多主模式,意思是系统中的设备都是主机,它们并没有主从之分,任何时刻,谁想发送数据都可以往总线上发送,例如网络通信、CAN总线通讯,自然它们自有一套防止数据冲突机制,485由于不具备冲突检测的硬件机制,所以它必须遵循主从模式。主从模式的原则是,整个系统只能有一个主机,每一个从机都必须有一个唯一的地址 
(2) 从机的地址是作为每个从机的唯一标识。

地址取值是0-247,0号地址表示广播地址,广播地址由主机保留,当主机向0号地址发数据包的时候,每一个从机设备都会收到数据包。也就是说,当主机发出的寻址帧的地址是0的时候,所有从机都要执行主机要求的动作。按理说,从机收到主机的寻址帧之后,是要做出应答包的,但是现在是0号地址,也就是要回的话每台从机都要回,那么肯定会造成RS-485通讯线上的数据混乱,因此所有从机在主机发0号地址时候不予返回数据包应答。 
从机的地址有两个作用 
a. 主机向目标从机发寻址帧时其地址部分为从机地址,这样主机才可以检索到目标从机 
b. 对于主机的目标从机,当收到主机发来的非0地址时,要做出数据包应答,假设从机要返回数据包给主机,自然是要把数据包放到RS-485总线上,因为每台从机,其物理连线是在一起的,所以这就会造成其他从机认为数据是要发送给它的现象,所以在从机回复主机的数据包中,加上从机自身的地址,那么其它从机读取到这个地址值跟自己的地址不相同,就不会去响应了。 
(3) ModBus数据包的格式 
主机要寻找某台从机,需要发出相应格式的信息,这就需要谈到ModBus的两种传输方式: 
a. RTU传输方式 
RTU实际上也成为二进制方式。假设主机要发送0x23,那就是发送0010 0011,按照485通讯协议,先发高位,即1100 0100。前后分别加上起始、停止位: “起始位 1100 0100 停止位”共10位数据 
b. ASC传输方式 
同样要发送0x23,它是十六进制数,会将其拆成十位的’2’和个位的’3’,将它们的asc码依次发出去,’0’的asc码是0x32,’3’的asc是0x33,转为二进制为0011 0010和0011 0011,同样要加上停止、起始位,共20位数据
很明显,asc传输方式比较低,但是由于它传输的是asc码,所以可以利用一些串口终端将其数值打印出来。

特别提醒,RS-485硬件协议决定,对于每一个字节数据的传输是先发高位,再发低位,所以假设数组u8型数组revArr[2]存放着接收到的数据,那么接收端解析数据应该是u16型data = revArr[0] * 256 + revArr[1]。

第二部分

1. 简介

MODBUS通讯协议,是1979年由美国Modicon 公司提出的,就是被称为PLC 之父的迪克·莫利先生创造的品牌。MODBUS是世界上第一个用于工业现场的总线协议,可以说,它的出现标志着工业现场从模拟量时代向通讯时代迈进。

MODBUS 是一种主----从通讯机构,因为它只定义了协议层,支持多种电气接口包括 RS-232 RS-485 甚至是以太网,特别是RS-485上的广泛应用,它已经成为事实上的RS-485 通讯标准

Modbus通信协议具有多个变种,其具有支持串口(主要是RS-485总线),以太网多个版本,其中最著名的是Modbus RTU,Modbus ASCII和Modbus TCP三种。其中Modbus RTU与Modbus ASCII均为支持RS-485总线的通信协议,其中Modbus RTU由于其采用二进制表现形式以及紧凑数据结构,通信效率较高,应用比较广泛。而Modbus ASCII由于采用ASCII码传输,并且利用特殊字符作为其字节的开始与结束标识,其传输效率要远远低于Modbus RTU协议,一般只有在通信数据量较小的情况下才考虑使用Modbus ASCII通信协议,在工业现场一般都是采用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.虽然这句话说得不是特别准确,但是也基本上把RTU与TCP之间的区别说得比较清楚了。

猜你喜欢

转载自blog.csdn.net/CSDN4646/article/details/81564741