1 RS-485的电源选择
对于由MCU结合RS-485微系统组建的测控网络,应优先采用各微系统独立供电方案,最好不要采用一台大电源给微系统并联供电,同时电源线(交直流)不能与RS-485信号线共用同一股多芯电缆。RS-485信号线宜选用截面积0.75mm2以上双绞线而不是平直线。对于每个小容量直流电源选用线性电源LM7805比选用开关电源更合适。当然应注意LM7805的保护:
1.LM7805输入端与地应跨接220~1000μF电解电容;
2.LM7805输入端与输出端反接1N4007二极管;
3.LM7805输出端与地应跨接470~1000μF电解电容和104pF独石电容并反接1N4007二极管;
4.输入电压以8~10V为佳,最大允许范围为6.5~24V。可选用TI的PT5100替代LM7805,以实现9~38V的超宽电压输入。
2 RS-485的硬件设计
RS-485芯片供电电压为4.5~5.5V,可与MCU共用5V电源。因RS-485总线为并接式二线制接口,一旦有一只芯片故障就可能将总线“拉死”,因此对其二线口VA、VB与总线之间应加以隔离。一种简单可行的方法是:VA、VB与总线之间各串接一只4~10Ω的PTC电阻,同时与地之间各跨接5V的TVS二极管以消除线路浪涌干扰。如没有PTC电阻和TVS二极管可用普通电阻和稳压管代替。为防止干扰信号误触发RO(接收器输出)负跳变(RO的负跳变是通信接收的关键),建议将RO外接10kΩ上拉电阻。对于收发控制端TC建议采用MCU引脚通过反相器进行控制,不宜采用MCU引脚直接进行控制以防止MCU上电时对总线的干扰。对外置设备为防止强电磁(雷电)冲击,建议选用TI的75LBC184等防雷击芯片。
3 RS-485网络的建立
RS-485网络通常采用特性阻抗为120Ω双绞线作传输介质,传输速率300b/s~115.2kb/s兼容,为异步半双工结构。网络节点数与所选RS-485芯片驱动能力和接收器的输入阻抗有关,如75LBC184标称最大值为64点,MAX1487E标称最大值为128点。实际使用时,因线缆长度、线径、网络分布、传输速率不同,实际接点数均达不到理论值。例如75LBC184运用在500m分布的RS-485网络上节点数超过50或速率大于9.6kb/s时工作可靠性明显下降。根据笔者经验,节点数应按最大值的70选取,传输速率在1200~9600b/s之间选取,通信距离1km以内,从通信效率、节点数、通信距离等综合考虑选用4800b/s最佳。通信距离1km以上时应通过增加中继模块或降低速率的方法提高传输可靠性。
理论上讲,RS-485节点与主干之间距离即T头越短越好。T头小于10m的节点采用T型连接对网络匹配并无太大影响,可放心使用,但对于节点间距非常小(小于1m,如LED模块组合屏)应采用星型连接,若采用T型或串珠型连接就不能正常工作。RS-485是一种半双工结构通信总线,大多用于一对多点的通信系统,因此主机(PC)应置于一端,不要置于中间而形成主干的T型分布,同时位于总线两端的差分端口VA与VB之间应跨接120Ω匹配电阻,以减少由于不匹配而引起的反射。
4 提高RS-485通信效率
RS-485通常应用于一对多点的主从应答式通信系统中,相对于RS-232等全双工总线效率低了许多,因此选用合适的通信协议及控制方式非常重要。
1.总线稳态控制(握手信号)大多数使用者选择在数据发送前1ms将收发控制端TC置成高电平,使总线进入稳定的发送状态后才发送数据;数据发送完毕再延迟1ms后置TC端成低电平,使可靠发送完毕后才转入接收状态。据笔者使用TC端的延时有4个机器周期已满足要求;
2.为保证数据传输质量,对每个字节进行校验的同时,应尽量减少特征字和校验字。惯用的数据包格式由引导码、长度码、地址码、命令码、数据、校验码、尾码组成,每个数据包长度达20~30字节。在RS-485系统中这样的协议不太简练,因此向大家介绍适合RS-485使用的MODBUS标准协议。MODBUS协议采用下传8个字节,上传7个字节的方式进行通信,现已广泛使用于水利、水文、电力等行业设备及系统的国际标准中。
MODBUS协议规定:上位机发送8个字节召测指令,其中地址、设备类别、通信路由、指令类别、指令长度、指令各占1个字节,CRC校验码占2个字节;下位机应答7个字节,地址、设备类别、数据长度各占1个字节,数据、CRC校验码各占2个字节。
MODBUS协议规定CRC校验规则:CRC初始化为&HFFFF(CRC_L=&HFF,CRC_H=&HFF),将CRC_L与传输的第一个字节进行异或运算,然后将CRC进行右移(不循环)并判断:如移出的位为1,则CRC再与&HA001进行一次异或运算;如移出的位为0,则CRC不变。如此右移8次即完成第一个字节的校验,重复上述运算及右移直至将全部字节校验完毕,所生成的CRC(16位)即为传输校验码。
5 MODBUS协议的CRC校验子程序代码
为方便读者使用MODBUS协议,将VC、VB、ASM51环境下MODBUS协议的CRC校验子程序代码一并给出,供读者参考。
//***CRC Calculation for MODBUS Protocol for VC ***//
//数组snd为地址等传输字节,num为字节数,发为6收为5//
unsigned int mb_crc(BYTE *snd,int num)
{ int i,j;
unsigned int c,crc=0xFFFF
for (i=0;i<num;i )
{ c=str & 0x00FF;
crc^=c;
for(j=0,j<8,j )
{ if (crc & 0x0001)
{crc>>=1;crc^=0xA001;}
else crc>>=1
}
}
return(crc);
}
' //***CRC Calculation for MODBUS Protocol for VB***//
mb_crc(ByRef snd() as BYTE,num as integer) as Long
crc_l=crc_h=&HFF
for i=1 to num
crc_l=crc_l XOR snd(i)
for j=1 to 8
if crc_l AND 1 then
crc_l=(crc_l-1)/2
if crc_h and 1 then
crc_l=crc_l 128
crc_h=(crc_h-1)/2
end if
crc_l=crc_l XOR &HA0
crc_h=crc_h XOR &H01
else: crc_l=crc_l/2
if crc_h and 1 then
crcl_l=crc_l 128
crc_h=(crc_h-1)/2
else: crc_h=crc_h/2
end if
end if
next j
next i
mb_crc=crc_l crc_h*256
End
;CRC Calculation for MODBUS Protocol for ASM51
;R1 为发送(接收)字节的缓存首地址
;R2 为发送(接收)字节的字节数(不含CRC字节),
;R3 为CRC校验低位字节,
;R4 为CRC校验高位字节,
CRC: MOV A,#0FFH
MOV R4,A
MOV R3,A
CRC1: MOV A,@R1
XRL A,R3
MOV R3,A
MOV R2,#08H
CRC8: CLR C
MOV A,R4
RRC A
MOV R4,A
MOV A,R3
RRC A
MOV R3,A
JNC CRC10
MOV A,R3
XRL A,#01H
MOV R3,A
MOV A,R4
XRL A,#0A0H
MOV R4,A
CRC10: DJNZ R2,CRC8
INC R1
DJNZ CRC1
RET
6 RS-485系统的维护
RS-485是一种低成本、易操作的通信系统,但是稳定性弱同时相互牵制性强,通常有一个节点出现故障会导致系统整体或局部的瘫痪,而且又难以判断。故向读者介绍一些维护RS-485的常用方法。
1.若出现系统完全瘫痪,大多因为某节点芯片的VA、VB对电源击穿,使用万用表测VA、VB间差模电压为零,而对地的共模电压大于3V,此时可通过测共模电压大小来排查,共模电压越大说明离故障点越近,反之越远;
2.集中供电的RS-485系统在上电时常常出现部分节点不正常,但每次又不完全一样。这是由于对RS-485的收发控制端TC设计不合理,造成微系统上电时节点收发状态混乱从而导致总线堵塞。改进的方法是将各微系统加装电源开关然后分别上电;
3.总线连续几个节点不能正常工作。一般是由其中的一个节点故障导致的。一个节点故障会导致邻近的2~3个节点(一般为后续)无法通信,因此将其逐一与总线脱离,如某节点脱离后总线能恢复正常,说明该节点故障;
4.系统基本正常但偶尔会出现通信失败。一般是由于网络施工不合理导致系统可靠性处于临界状态,最好改变走线或增加中继模块。应急方法之一是将出现失败的节点更换成性能更优异的芯片;
5.笔者曾遇到MCU故障导致TC端处于长发状态而将总线拉死一片的现象,故提醒读者不要忘记对TC端的检查。尽管RS-485规定差模电压大于200mV即能正常工作。但实际测量:一个运行良好的系统其差模电压一般在1.2V左右(因网络分布、速率的差异有可能使差模电压在0.8~1.5V范围内)。
虽然RS-485总线存在一些缺点,但只要处理好细节,性能还是比较稳定的。