485通讯协议_RS485通信和Modbus通信协议详解
前⾔
在⼯业控制、电⼒通讯、智能仪表等领域,通常情况下是采⽤串⼝通信的⽅式进⾏数据交换。最初采⽤的⽅式是RS232接⼝,由于⼯业现场⽐较复杂,各种电⽓设备会在环境中产⽣⽐较多的电磁⼲扰,会导致信号传输错误。除此之外,RS232接⼝只能实现点对点通信,不具备联⽹功能,最⼤传输距离也只能达到⼏⼗⽶,不能满⾜远距离通信要求。
⽽RS485则解决了这些问题,数据信号采⽤差分传输⽅式,可以有效的解决共模⼲扰问题,最⼤距离可以到1200⽶,并且允许多个收发设备接到同⼀条总线上。随着⼯业应⽤通信越来越多,1979年施耐德电⽓制定了⼀个⽤于⼯业现场的总线协议Modbus协议,现在⼯业中使⽤RS485通信场合很多都采⽤Modbus协议,所以今天我们来了解下RS485通信和Modbus通信协议。
1、RS485通信
实际上在RS485之前RS232就已经诞⽣,但是RS232有⼏处不⾜的地⽅:
1、接⼝的信号电平值较⾼,达到⼗⼏V,容易损坏接⼝电路的芯⽚,⽽且和TTL电平不兼容,因此和单⽚机电路接起来的话必须加转换电路。
2、传输速率有局限,不可以过⾼,⼀般到⼏⼗Kb/s就到极限了。
3、接⼝使⽤信号线和GND与其他设备形成共地模式的通信,这种共地模式传输容易产⽣⼲扰,并且抗⼲扰性能也⽐较弱。
4、传输距离有限,最多只能通信⼏⼗⽶。
5、通信的时候只能两点之间进⾏通信,不能够实现多机联⽹通信。
针对RS232接⼝的不⾜,就不断出现了⼀些新的接⼝标准,RS485就是其中之⼀,他具备以下的特点:
1.逻辑“1”以两线间的电压差为+(2—6)V表⽰;逻辑“0”以两线间的电压差为-(2—6)V表⽰。接⼝信号电平⽐RS232C降低了,就不易损坏电路的芯⽚,且该电平与TTL电平兼容,可⽅便与TTL电路连接。
2.RS485通信速度快,数据最⾼传输速率为10Mbps以上
3.RS485内部的物理结构,采⽤的是平衡驱动器和查分接收器的组合,抗⼲扰能⼒⼤⼤增加。
4.传输速率最远可达到1200⽶左右,但是他的传输速率和传输距离是成反⽐的,只有在100KB/s以下的传输速率,才能达到最⼤的通信距离,如果需要传输更远距离可以使⽤中继。
5.可以在总线上进⾏联⽹实现多机通信,总线上允许挂多个收发器,从现有的RS485芯⽚来看,有可以挂32、64、128、256等不同个设备的驱动器。
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类型的扩展卡。
RS-485上的软件层协议ModBus主要依赖于主从模式。主从模式是指在半双⼯通讯⽅式上,2个或者2个以上的设备组成的通讯系统中:
(1) ⾄少且只有⼀个主机,其他的都是从机
(2) 不管任何时候,从机都不能主动向主机发送数据
(3)主机具有访问从机的权限,从机不可以主动访问从机,任何⼀次数据交换,都要由主机发起
(4)不管是主机还是从机,系统⼀旦上电,都要把⾃⼰置于接收状态(或者称为监听状态)
主从机的数据交互,需要:
a. 主机将⾃⼰转为发送状态
b. 主机按照预先约定的格式发出寻址数据帧。
所谓的约定,可是主机开发者和从机开发者约定好的规约,例如主机要通过从机控制接在从机的电机,主机要启动电机就往从机发0x1,停⽌电机就往从机发0x2。这就是⼀种预先约定好的格式,但是这样做,互换性、兼容性、通⽤性差,例如其他公司是约定发送0x03让电机转动,发0x04让电机停⽌。导致不同⼚家的主机、从机不能相互通讯。⽤户需要的,就像⽹络操作,只要接⼊有⽹的⽹线那么计算机都能上⽹。
所以说,我们需要⼀种⼤家都共同遵循的规则(可以是ModBus,也可以是TCP/IP等上层协议),这种⼤家认可,共同遵循的软件层协议。软件层协议主要是解决如何解析传输的数据,即传输的⽬的或者更加可靠的传输数据。
半双⼯通讯中,都是主机寻从机,主机的⽬的⽆⾮有: 主机要发数据给从机,或者主机要从从机中获取数据。
c. 主机恢复⾃⾝的接收状态
主机等待⾃⾝所寻址的从机作回应,也就是说从机接收到主机的寻址命令、数据后⼀定要回应主机,
不然主机会认为从机通讯异常。回应数据包也是要按照ModBus协议规约(其实不局限ModBus,像TCP/IP也需要回应是吧!~)
2. ModBus通讯协议
通讯协议⼜称通信规程,是指通信双⽅对数据传送控制的⼀种约定。约定中包括对数据格式,同步⽅式,传送速度,传送步骤,检纠错⽅式以及控制字符定义等问题做出统⼀规定。
通俗点来讲,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]。
(4)Modbus具有以下⼏个特点:
(1)标准、开放,⽤户可以免费、放⼼地使⽤Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。⽬前,⽀持Modbus的⼚家超过400家,⽀持Modbus的产品超过600种。
(2)Modbus可以⽀持多种电⽓接⼝,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、⽆线等。
(3)Modbus的帧格式简单、紧凑,通俗易懂。⽤户使⽤容易,⼚商开发简单。
R【TU协议帧数据】
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的数据进⾏⽐较,如果相同则认为数据正常,没有出错,如果⽐较不相同,则说明数据在传输中发⽣了错误,这帧数据将被丢弃,就像没收到⼀样,⽽发送⽅会在得不到回应后做相应的处理错误处理。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。