RS485通信和Modbus通信协议汇总

1. 主从模式

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

RS485通信和Modbus通信协议汇总
(1) 至少且只有一个主机,其他的都是从机
(2) 不管任何时候,从机都不能主动向主机发送数据
(3) 主机具有访问从机的权限,从机不可以主动访问从机,任何一次数据交换,都要由主机发起
(4)不管是主机还是从机,系统一旦上电,都要把自己置于接收状态(或者称为监听状态)
主从机的数据交互,需要:
a. 主机将自己转为发送状态
b. 主机按照预先约定的格式发出寻址数据帧。
所谓的约定,可是主机开发者和从机开发者约定好的规约,好,例如主机要通过从机控制接在从机的电机,主机要启动电机就往从机发0x1,停止电机就往从机发0x2。这就是一种预先约定好的格式,但是这样做,互换性、兼容性、通用性差,例如其他公司是约定发送0x03让电机转动,发0x04让电机停止。导致不同厂家的主机、从机不能相互通讯。用户需要的,就像网络操作,只要接入有网的网线那么计算机都能上网。
所以说,我们需要一种大家都共同遵循的规则(可以是ModBus,也可以是TCP/IP等上层协议),这种大家认可,共同遵循的软件层协议。软件层协议主要是解决如何解析传输的数据,即传输的目的或者更加可靠的传输数据。
半双工通讯中,都是主机寻找从机,主机的目的无非有: 主机要发数据给从机,或者主机要从从机中获取数据。
c. 主机恢复自身的接收状态
主机等待自身所寻址的从机作回应,也就是说从机接收到主机的寻址命令、数据后一定要回应主机,不然主机会认为从机通讯异常。回应数据包也是要按照ModBus协议规约(其实不局限ModBus,像TCP/IP也需要回应是吧!~)

2. ModBus通讯协议

通俗点来讲,ModBus规约了起停电机,主机要分别发送什么命令给从机。ModBus规定主从机之间数据的交互,需要遵循什么样的格式,如何保证数据在传输过程中不发生冲突。只要都遵循这个协议,那么不同厂家的主从机就可以共用了。
ModBus一般是工作在一主多从的场景,还是这个图:
RS485通信和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码依次发出去,’2’的asc码是0x32,’3’的asc是0x33,转为二进制为0011 0010和0011 0011,同样要加上停止、起始位,共20位数据很明显,asc传输方式比较低,但是由于它传输的是asc码,所以可以利用一些串口终端将其数值打印出来。

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

3.RS-485介绍

RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。RS-485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便,可以省掉许多信号线。应用RS-485可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。在RS232或RS485设备联成的设备网中,如果设备数量超过2台,就必须使用RS485做通讯介质,RS485网的设备间要想互通信息只有通过“主(Master)”设备中转才能实现,这个主设备通常是PC,而这种设备网中只允许存在一个主设备,其余全部是从(Slave)设备。
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓朴结构在同一总线上最多可以挂接32个结点。在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。很多情况下,连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,这有二个原因:

(1)共模干扰问题:RS-485接口采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了。但人们往往忽视了收发器有一定的共模电压范围,RS-485收发器共模电压范围为-7~+12V,只有满足上述条件,整个网络才能正常工作。当网络线路*模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口。

(2)EMI问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。由于PC机默认的只带有RS232接口,有两种方法可以得到PC上位机的RS485电路:(1)通过RS232/RS485转换电路将PC机串口RS232信号转换成RS485信号,对于情况比较复杂的工业环境最好是选用防浪涌带隔离珊的产品。(2)通过PCI多串口卡,可以直接选用输出信号为RS485类型的扩展卡。

4.RTU协议帧数据

Modbus有两种通信传输方式,一种是ASCII模式,一种是RTU模式。由于ASCII模式的数据字节是7bit数据位,51单片机无法实现,而且应用也相对较少,所以这里我们只用RTU模式。两种模式相似,会用一种另外一种也就会了。一条典型的RTU数据帧如图所示。

和我们实用串口通信程序类似,我们一次发送的数据帧必须是作为一个连续的数据流进行传输。我们在实用串口通信程序中采用的方法是定义30ms,如果接收到的数据超过了30ms还没有接收到下一个字节,我们就认为这次的数据结束。而Modbus的RTU模式规定不同数据帧之间的间隔是3.5个字节通信时间以上。如果在一帧数据完成之前有超过3.5个字节时间的停顿,接收设备将刷新当前的消息并假定下一个字节是一个新的数据帧的开始。同样的,如果一个新消息在小于3.5个字节时间内接着前边一个数据开始的,接收的设备将会认为它是前一帧数据的延续。这将会导致一个错误,因此大家看RTU数据帧最后还有16bit的CRC校验。

起始位和结束符:前后都至少有3.5个字节的时间间隔,起始位和结束符实际上没有任何数据,T1-T2-T3-T4代表的是时间间隔3.5个字节以上的时间,而真正有意义的第一个字节是设备地址。

设备地址:在多机通信的时候,数据那么多,我们依靠什么判断这个数据帧是哪个设备的呢?没错,就是依靠这个设备地址字节。每个设备都有一个自己的地址,当设备接收到一帧数据后,程序首先对设备地址字节进行判断比较,如果与自己的地址不同,则对这帧数据直接不予理会,如果如果与自己的地址相同,就要对这帧数据进行解析,按照之后的功能码执行相应的功能。如果地址是0x00,则认为是一个广播命令,就是所有的从机设备都要执行的指令。

功能代码:在第二个字节功能代码字节中,Modbus规定了部分功能代码,此外也保留了一部分功能代码作为备用或者用户自定义,这些功能码大家不需要去记忆,甚至都不用去看,直到你有用到的那天再过来查这个表格即可。

CRC校验:CRC校验是一种数据算法,是用来校验数据对错的。CRC校验函数把一帧数据除最后两个字节外,前边所有的字节进行特定的算法计算,计算完后生成了一个16bit的数据,作为CRC校验码,添加在一帧数据的最后。接收方接收到数据后,同样会把前边的字节进行CRC计算,计算完了再和发过来的CRC的16bit的数据进行比较,如果相同则认为数据正常,没有出错,如果比较不相同,则说明数据在传输中发生了错误,这帧数据将被丢弃,就像没收到一样,而发送方会在得不到回应后做相应的处理错误处理。

上一篇:can网络和rs485网络隔离器LCAN485-Opto产品介绍


下一篇:485. Max Consecutive Ones