RS-485的多机通信方案探究
扫描二维码
随时随地手机看文章
引言
在嵌入式系统中,多个孤立节点之间的通信越来越重要,尤其是物联网时代的到来,多节点间通信已经成为必不可少的功能。由此出现了许多通信手段,如RS-232、RS-485、CAN总线、ZigBee等,综合考虑性能和成本,RS-485通信无疑是性价比最高的通信方式。因此探究高效、实用的多机通信方案具有重大的意义。
1 系统框图
RS-485多机通信结构图如图1所示。若干个RS-485节点通过总线连接,由网关节点轮询访问索要数据,每个网关节点可以动态地配置IP地址,以便上位机可以通过以太网控制网关节点,从而获得每个RS-485终端节点的数据。图1中C节点为控制节点,具有RS-485通信功能,T节点为网关节点,除了RS-485功能外,还具有以太网功能,其作用就是将C节点的数据通过以太网功能传送给上位机。
2 硬件设计
本文采用新唐科技公司的Cortex-M054探究RS-485多机通信协议。Cortex-M054有两个UART,均可以配置成RS-485模式,此时Cortex-M054通过RTSX引脚自动控制RS-485通信方向。
RS-485通过差分传输,A和B两根信号线铰链在一起来抵消各自的干扰。当A、B信号的电压差大于200mV时,视为逻辑1;当B、A信号的电压差大于200 mV时,视为逻辑0。
RS-485硬件原理图如图2所示。整套RS-485电路独立供电,通过光电耦合器TLP781B+,与系统其他部件分开,以此来隔离干扰。和CAN总线相同,在机群的两端(第一个节点和最后一个节点),必须加上匹配电阻,吸收反射信号,大小为75 Ω左右。中间节点则不需要如此,因此留出了R1的位置,当节点位于机群两端的时候,则焊接上R1,这种方式大大地增强了电路的灵活性。
考虑电路的安全性,添加了TVS管,从而达到抗雷击的效果。热敏电阻相当于自恢复的保险丝,当电流过大时,它的阻值会变大,起到保护电路的作用。
3 软件协议
3.1 协议格式
Modbus协议按功能可以划分为:地址码、功能码、数据码、CRC校验码。而在RTU方式下,采用CRC循环冗余校验,具体格式如图3所示。
Modbus协议长度根据用户需求自己设定,地址码标识终端地址,即和网关节点通信的从机地址。功能码则是主机告诉从机要执行什么功能。数据码长度由用户自己确定,最后根据前3个功能字段,生成两个字节的CRC校验码,用来验证前面的字段是否存在传输错误。
3.2 CRC生成算法
CRC算法分为静态和动态两种,静态的适合片内RAM非常有限的MCU,而动态的适合RAM空间相对比较宽裕的MCU。CRC校验码生成步骤如下:
①初始化寄存器内容为0xffff。
②提取第一个字节数据和寄存器内容相异或。
③检测最低有效位(LSB),如果LSB为1,寄存器单独和预置值异或;如果LSB为0,则不进行任何操作,然后将结果向LSB方向移动,最高有效位以0填充。
④重复第③步8次,直到最后一位(第8位)完成。
⑤提取下一个8位字节,重复步骤③、④的操作,等待所有字段都执行完,最终寄存器中的值就是所求的CRC校验码。
上述步骤中,如果预置值在整个过程中不变,则为静态的CRC校验;在动态的CRC校验中,存在一个动态表,预置值每次都根据动态表变化,所以准确性更高,而动态表要开辟一个较大的空间来存储。所以,根据MCU的RAM大小决定使用动态校验还是静态校验。算法结束后,寄存器中存人的就是前N个字节的CRC校验码,运用该算法,不需要事先知道协议的整体长度,最后都同样生成两个字节长度的校验码,故可移植性好、通用性强。
3.3 自动地址识别模式通信
自动地址识别模式是RS-485经典模式,通过设置Cortex-M054的状态寄存器,可使UART工作在此模式下。节点在接收到地址字节时,判断地址字节数据是否与UA_ALT_CSR[ADDR_MATCH]值相匹配,如果匹配,表示网关节点要与此终端通信,故接收下面网关节点发送的所有数据字节。同时,地址字节和数据字节都会被存入UART的FIFO中,否则忽略所有字节,既不产生中断,也不存入FIFO,直到匹配。
串口通信中由起始位、数据位、奇偶校验位、停止位4部分组成。当奇偶校验位为0时,表示传输的是数据字节;当它为1时,表示传输的是地址字节。Cortex—M054的UA_ALT_CSR是一个32位的寄存器,其ADDR_MATCH用8位来表示,故自动地址识别模式最大从机数只支持256个节点。它的优点是:由于RS-485所有从机挂载在一根总线上,故网关节点发送数据时,只有地址与自己匹配的节点才会响应,其他节点可以正常执行自己原先的任务而不被打扰,系统整体效率高。缺点是从机只能被主机轮询时才能发送信息,不能主动和主机通信;一个总线上只能挂载256个节点。
3.4 普通模式通信
普通模式可以配置为接收所有数据,也可以选择性地忽略数据,直到接收到地址字节。为了更加灵活地利用协议通信,将其设置为接收所有数据,即只要网关节点向总线发送数据,那么总线上的所有节点都会收到数据,再根据协议解析内容执行相应的动作,接地流程图如图4所示。
Cortex—M054内部有4 KB的Data Flash给用户存储数据,故将节点的地址存入Flash中。当系统上电复位后,先从Flash中读出节点的地址,存入全局变量address中。当收到数据包之后,进行CRC校验,如果正确就接收,再根据协议解析地址地段,其值与address比较,以此判定此包是否属于自己。
自动地址识别模式是由芯片自动筛选地址,而此处需要软件判断。因此,地址长度可以由用户自己设定。
3.4.1 数据混乱
上述方法存在数据混乱的隐患。如果网关节点与终端节点通信过程都是用N个字节进行,那么不会出现数据紊乱问题。但若假设网关节点发送命令用N个字节,而终端节点向网关节点回复数据时,用M(M>N)个字节,此时总线上的其他终端节点都会收到这M个字节。此时,会认为是网关节点发出的,所以只解析前N个字节的数据,那么在FIFO中就剩下了(M—N)个字节,即此时FIFO中并不为空。若网关节点此时再与其他任意一个终端节点通信时,程序会默认先读出残留的(M—N)个字节数据,就会造成数据紊乱,网关节点再难与其他节点正常通信。
解决方法是在每次有数据进入FIFO中后,触发中断,将所有的数据都读出,而只解析前N个字节。因为在整个RS-485系统中,只有网关节点才能与终端节点通信,各个终端节点之间不可以通信,而网关节点与终端节点通信是N个字节。一次读空FIFO的目的就是清空FIFO中的无效数据。
3.4.2 改进型RS-485协议
RS-485通信的最大缺点就是主从式的通信方式,从机只有在收到主机的命令后才可以与之通信。而CAN总线的每个节点可以在任意时刻接收和发送数据,通过其仲裁体制,避免数据冲突,但是CAN总线的成本相对较高,对于实时性和安全性要求不高的场合,不适宜用CAN总线通信。
借鉴CSMA/CD协议,本文提出改进型的通信方式。设置全局变量nesting,如果进入一次RS-485中断,则nesting加1。在终端需要向网关节点发送数据时,置nesting为0,延迟(address×10)ms;如果总线上没有数据通信,nesting为0,此时节点可以主动向网关节点发送数据;否则,表示总线上繁忙,则继续延迟(address)ms。
尝试K次,K的大小根据用户需求设定。若此终端节点已经在网关节点的轮询范围之内,终端向网关发送的数据为紧急事件包,则K的值应该尽量小;若主动发送失败,可以等待节点被轮询之时,再将此数据发送出去。若此终端节点不在网关节点的轮询范围之内,是新加入的节点,则主动发送信息的目的是告诉网关,自己是新节点,需要加入总线系统中,此时K值应该尽量大,以保证新节点能够不在上位机的协助下,自动地加入总线系统中,提高系统的灵活性。终端发送流程图如5所示。
网关节点不能轮循完一遍之后,又立即进行下一次轮询。这样,总线上一直都会是忙碌状态。网关节点必须在轮询完一次之后,暂停L秒,这个空隙时间就是留给终端主动向网关发送数据。L不宜过大,否则会大大降低系统整体效率,L的选取与系统共有多少终端节点且每个终端节点与网关节点通信时间有关。
使用普通模式进行通信,优点是RS-485通信应用灵活,可以支持更多的节点挂载在总线上;可以改进RS-485通信方式,自动地址识别模式无法监听总线是否繁忙。缺点是各个节点的工作量增大,将频繁解析指令,系统整体效率降低。
结语
在使用RS-485方式通信时,选取哪种方式进行通信,需要根据不同场合而定。传统的自动地址识别模式,适用于严格的主从通信系统,可靠性高,系统整体效率高;而普通模式灵活性较好,但是系统整体效率会降低。所以,要因地制宜,选择当前场合最适合的方式。