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