最近用485+modbus协议+芯片MAX485
首先是485的通信协议。485通信的时候必须采用轮询的方式。我采用的方式是主机先广播要询问的从机的地址,从机收到地址后验证与自己的地址匹配,再发送自己的数据。主机完成这一个之后,再跳转到下一个地址,重复上面的通信。
关于485收发切换延时的问题
MAX485芯片。这个芯片收发是分时的。有控制端控制,接收的时候只能接收,发送的时候只能发送。这就出现一个问题,在主从机交互通信的时候,要与MAX485的通信状态切换相同步。数字电路总会有延时和干扰。因此总结为:芯片切换为发送之后,等待1ms,等待总线稳定之后再发送数据。这个是比较容易注意的。半双工总线收发切换延时问题
具体的做法是在数据发送状态下,先将控制端置“1”,延时1ms左右的时间,再发送有效的数据,一包数据发送结束后再延时1ms后,将控制端置“0”。这样的处理会使总线在状态切换时,有一个稳定的工作过程。
值得注意的是,当最后一个要发送的数据发出之后,不要立马切换芯片的发送状态。因为单片机的发送完成,是根据串口发送中断的标志位,而这个标志位是指8位数据在移位寄存器中移出。然后对于通信来说,总还会有奇偶校验位,停止位等等,这些还没有被发送到总线上。因此如果在最后一个字节的发送中断产生之后,就立马切换MAX485的状态,会造成最后一个字节无法接收。会被接收端认为错误帧而丢弃。
下图为典型的485收发自动切换的原理图(也是网络上很流传的一种做法)
关于485上拉下拉电阻的问题
这个问题让人很纠结,我也见到很多不要如果不加上拉下拉,在所有终端都是接收态(高阻),就有可能 因为干扰,产生假的开始位。如果干扰不大,软件协议有纠错,配合紧密,不加这两个电阻也经常可以工作。但是还是加一对把。上下拉1K,终端电阻120,这样AB两端电压就是5/(1000+1000+120)=283mV么
而485处于接收状态,AB电压又一直大于200ma,
关于485总线的接地问题
在485总线的应用中,如果简单地只用一对双绞线将各个接口的“A”、“B”端连接起来,而忽略了信号地的互连,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,这有下面二个原因:
1.共模干扰问题:485总线虽采用差分方式传输信号,似乎并不需要相对于某个参照点来判定信号,系统只需检测两线之间的电位差就可以了,但有人往往忽视了任何485接口IC总有一定的共模电压承受范围,如一般的-7~+12V,只有满足这个条件,整个网络才能正常工作。当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口。比如当发送器A向接收器B发送数据时,发送器A的输出共模电压为VOS,由于两个系统具有各自独立的接地系统,存在着地电位差VGPD,那么接收器输入端的共模电压VCM就会达到VCM=VOS+VGPD。RS-485标准规定VOS≤3V,但VGPD可能会有很大幅度如十几伏甚至上百伏,且可能伴有强干扰(快速波动),致使接收器共模输入超出正常范围并在传输线路上产生干扰电流,轻则影响正常通信,重则损坏通信接口电路。
2.EMI问题:发送器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端(注意485的交流模型),整个总线就会像一个巨大的天线向外辐射电磁波。
由于上述原因,尽管485采用了差分平衡传输方式,但对整个485网络而言,必须有一条低阻的信号地将各个接口的工作地连接起来,使共模干扰电压VGPD被短路。这条信号地可以是额外的一条线(非屏蔽双绞线),或者是屏蔽双绞线的屏蔽层。这是最通常的接地方法。
值得注意的是,这种做法仅对高阻型共模干扰有效,由于干扰源内阻大,短接后不会形成很大的接地环路电流,对于通信不会有很大影响。若共模干扰源内阻较低时,则会在接地线上形成较大的环路电流,影响正常通信,这时应采用下述解决方案:
(1) 采用浮地技术,隔断接地环路。这是较常用也是十分有效的一种方法,当共模干扰内阻很小时上述方法已不能奏效,此时可以考虑将引入干扰的节点(例如处于恶劣的工作环境的现场设备)浮置起来(也就是系统的电路地与机壳或大地隔离),这样就隔断了接地环路,不会形成很大的环路电流。
(2) 采用隔离接口。有些情况下,出于安全或其它方面的考虑,电路地必须与机壳或大地相连,不能悬浮,这时可以采用隔离接口来隔断接地回路,但是仍然应该有一条地线将隔离侧的公共端与其它接口的工作地相连。
关于提高485通信效率
RS-485通常应用于一对多点的主从应答式通信系统中,相对于RS-232等全双工总线效率低了许多,因此选用合适的通信协议及控制方式非常重要。
1.总线稳态控制(握手信号)。大多数使用者选择在数据发送前1ms将收发控制端TC置成高电平,使总线进入稳定的发送状态后才发送数据;数据发送完毕再延迟1ms后置TC端成低电平,使可靠发送完毕后才转入接收状态。据笔者使用TC端的延时有4个机器周期已满足要求;
2.为保证数据传输质量,对每个字节进行校验的同时,应尽量减少特征字和校验字。惯用的数据包格式由引导码、长度码、地址码、命令码、数据、校验码、尾码组成,每个数据包长度达20~30字节。在RS-485系统中这样的协议不太简练。推荐用户使用MODBUS协议,该协议已广泛应用于水利、水文、电力等行业设备及系统的国际标准中。
关于RS-485网络配置
1)网络节点数。网络节点数与所选RS-485芯片驱动能力和接收器的输入阻抗有关,如75LBC184标称最大值为64点,SP485R标称最大值为400点。实际使用时,因线缆长度、线径、网络分布、传输速率不同,实际节点数均达不到理论值。例如75LBC184运用在500m分布的RS-485网络上节点数超过50或速率大于9.6kb/s时,工作可靠性明显下降。通常推荐节点数按RS-485芯片最大值的70%选取,传输速率在1200~9600b/s之间选取。通信距离1km以内,从通信效率、节点数、通信距离等综合考虑选用4800b/s最佳。通信距离1km以上时,应考虑通过增加中继模块或降低速率的方法提高数据传输可靠性。
2)节点与主干距离。理论上讲,RS-485节点与主干之间距离(T头,也称引出线)越短越好。T头小于10m的节点采用T型,连接对网络匹配并无太大影响,可放心使用,但对于节点间距非常小(小于1m,如LED模块组合屏)应采用星型连接,若采用T型或串珠型连接就不能正常工作. RS-485是一种半双工结构通信总线,大多用于一对多点的通信系统,因此主机(PC)应置于一端,不要置于中间而形成主干的T型分布。
关于RS-485系统的常见故障及处理方法
RS-485是一种低成本、易操作的通信系统,但是稳定性弱同时相互牵制性强,通常有一个节点出现故障会导致系统整体或局部的瘫痪,而且又难以判断。故向读者介绍一些维护RS-485的常用方法。
1)若出现系统完全瘫痪,大多因为某节点芯片的VA、VB对电源击穿,使用万用表测VA、VB间差模电压为零,而对地的共模电压大于3V,此时可通过测共模电压大小来排查,共模电压越大说明离故障点越近,反之越远;
2)总线连续几个节点不能正常工作。一般是由其中的一个节点故障导致的。一个节点故障会导致邻近的2~3个节点(一般为后续)无法通信,因此将其逐一与总线脱离,如某节点脱离后总线能恢复正常,说明该节点故障;
3)集中供电的RS-485系统在上电时常常出现部分节点不正常,但每次又不完全一样。这是由于对RS-485的收发控制端TC设计不合理,造成微系统上电时节点收发状态混乱从而导致总线堵塞。改进的方法是将各微系统加装电源开关然后分别上电;
4)系统基本正常但偶尔会出现通信失败。一般是由于网络施工不合理导致系统可靠性处于临界状态,最好改变走线或增加中继模块。应急方法之一是将出现失败的节点更换成性能更优异的芯片;
5)因MCU故障导致TC端处于长发状态而将总线拉死一片。提醒读者不要忘记对TC端的检查。尽管RS-485规定差模电压大于200mV即能正常工作。但实际测量:一个运行良好的系统其差模电压一般在1.2V左右(因网络分布、速率的差异有可能使差模电压在0.8~1.5V范围内)。