利用MODBUS提高多CPU系统协同开发的效率
扫描二维码
随时随地手机看文章
摘要:提出利用MODBUS协议实现多CPU系统中信息交互的方案,分析了软硬件通信机制的设计和系统协同开发的方法,以及各种提高通信效率的措施。
关键词:MODBUS通信协议 多CPU系统 通信
在电力系统微机综合保护和自控装置以及其它工业自动化控制领域,微控制器的应用越来越广泛,其装置的复杂性也越来越高。为了解决其开发对象实时多任务性的要求,单CPU、单入开发的模式下在被多个、多类型 CPU和多人协同开发的模式所代替。在这新的开发模式中,面临一个新问题——在实施信息交互的过程中如何将实现CPU之间信息交互的软硬件标准化,这是关系到该模式能否成功实施的关键。在众多的通信方式中,基于UART的RS-485串行通信模式以其连线简捷、可靠性高和可带动多CPU、多设备级连的能力而被广泛采用。在软件通信协议的选择上,MODBUS协议由于其通用、成熟的第三方标准测试软件,为用户使用提供了诸多优势。因此,在开发新型电动机综合保护装置TH21-4M的过程中,采用RS-485串行通信方式和MODBUS通信协议,实现了多CPU之间的数据和控制命令的信息交互。为了增强串行通信的高效、协调性,笔者在通信机制的软硬件结构上采取了很多措施,并取得了很好的效果。在调试系统通信阶段,使用了各CPU模块先与MODBUS标准测试软件通信,之后再互相联调的方法,大大提高了协同开发的效率。实践证明,该设计思想简化了系统的结构,大大提高了装置的运行效率和可靠性。本文将结合 TH21-4M的设计思路,从硬件设计和软件规划两方面,介绍如何利用MODBUS通信协议,实现多CPU结构的协同开发。
1 TH21-4M电动机综合保护装置的特点
TH21-4M电动机综合保护装置综合保护功能以外,兼有测量、远动和通信的功能;大屏幕的汉字液晶显示,可以实现友好的人机界面;利用CAN总线,与监控主机进行通信,从而构成分级分散式的变电站综合自动化系统的子系统。
在设计上,由于装置需要实现多任务,为了优化系统功能,采用了多CPU的系统结构。其中一个CPU负责定时采样脉冲发送;主CPU模块负责数据处理、电量计算、故障判断和开关操作;而板模块上CPU负责人机交互,并实现与主保护模块和监控主机的通信任务。各个CPU模块有明确的任务分工,研制时也容易实现多人协同开发。在整个构成中,串行通信沟通了主CPU和面板CPU,使人机交互成为可能,因而点有重要的地位。建立合理的通信机制则是串行通信部分的核心的所在,它决定着通信的协调性和系统开发后期调试的效率。
2 通信机制介绍
2.1 通信机制硬件设计原理
本系统通信机制的提出以高效、可靠为目的。RS-485为半双工结构,现场中比全双工往往更接近于实用,在此采用只有2条信号线的最简型连接。系统接口电路图由图1所示。主保护模块上的80C196单片机输出的TTL逻辑电平通过光电隔离后,由MAX485芯片转换为RS-495电平,再由面板模块上的MAX485芯片转换为TTL逻辑电平,由80C31单片机读取;以之亦然。在 80C196单片机一侧,使用并行输入输出口2(IO_PORT2)的一位P2.7对MAX输入使能端RE、输出使能端DE进行控制。由图1可知,当 P2.7输出高电平时,RE使能,单片机一侧接收数据;当P2.7输出低电平时,DE使能,单片机一侧发送数据。这样,避免了盲目发送造成的数据叠加丢失现象,通信质量高,通信速度也能得到保证。
2.2 通信协议介绍
为了保证保护装置中两个模块之间能够正确地传递数据,必须有一套关于信息传输的模式、数据格式和内容等的规定,即规约[1]或通信协议。虽然保护装置内部的通信相对简单,两具模块之间传递的数据也不是很多,但是自定义内部通信协议的弊端是很明显的。首先,自定义通信协议很难在时序、任务的协调上配合得很好,数据传送的可靠性也难以保证;首次,由于没有现成的较成熟的调试软件,主 CPU模块基本是黑匣子,系统联调时的困难较多且难以克服。因此,采用了当前流行的MODBUS通信协议,并结合本装置的特点加以简化,从而实现了模块间的通信,事实证明效果很好。
MODBUS的通信方式为主从方式[2]。主方首先向从方发送通信请求指令,从方根据请求指令中的功能码向主方发回数据。每个从方都有自己独立的地址。主方所发的请求帧和从方所发的应答帧都是以从方地址开头的。从方只读发给自己的指令,对以其他从方地址开头的报文不作应答。这种一问一答的通信模式,大大提高了通信的正确率。但对于微机保护来说,该主从方式也存在着弊端,即当保护主模块进行保护动作后,无法立刻向上位机传送故障信息,只能由上位机不断向保护主模块询问保护是否动作,若有,则再进一步要求具体故障信息。
MODBUS有RTU(Remote Terminal Unit)和ASCII两种传送方式。为了保证较高的通信速度,采用了RTU方式,数据字节无奇偶校验位,加上起始、终止位后字节长度为10bit,数据间隔在24bit以内,采用循环冗余检验方式对报文进行校验。
MODBUS典型的报文格式如下:
主方发报文:
从方正常时回答:
一个通信报文的具体内容取决于该指令字符串的功能码,MODBUS中定义的标准功能码如表1所示。
表1 MODBUS协议中的标准功能码
由功能码的定义可以看出,传送的报文对象主要分为模拟量和数字量两类,由报文头的功能码来确定报文的内容。在实际应用中,主要使用02、04、05和06这四种功能码,完成对数字量和模拟量的读取及设置。
数据起始地址和数据量是报文的主要内容。MODBUS规定的数据量是从通信对象的器件中读取的数据或是往通对象的器件中写入的数据。每个通信对象器件都有自己的地址。在保护装置的内部通信中,指定各通信对象器件为主机板的RAM中保存的数字量和模拟量,以及EEPROM中设定的保护配置和定值。在处理通信报文时,由报文的数据起始地址和对应的数据量长度进行读取或发送任务。当传送数字量时,不同地址的数据值用报文中数据量不同的位来表示,这样就能传送更多的数据信息,从而高效地利用通信报文。由于每帧数据不定长,方便灵活,因而避免了固定帧长造成的对CPU时间和内存空间的浪费。另外,MODBUS通信协议规定在通信字符串中的地址比实际地址小“1”,这对数组进行操作时是一个方便之处。
报文末的两个字节为校验字节。RTU方式通信采用CRC-16位循环码冗余校验,即将整个字符串(不包括最后两个字节)按规定的方式进行位移并进行异或计算,计算结果存在字符串的最后两个字节内,并由接收方按同样的计算方法进行校验是否一致。这种校验方法对随机或突发差错造成的帧破坏有很好的校验效果。
3 提高通信效率的措施
在确立硬件平台和通信协议后的软件设计过程中,笔者采用了很多方法提高通信的效率和可靠性。
3.1 将通信分为接收和发送两个独立的任务[3]
80C196单片机可以使用查询和中断两种方法通过串行口发送和接收数据。对于中断方式,80C196单片机提供了两种串口中断方式:第一种方式为一个单独的串口中断,由中断屏蔽寄存器INT_MASK的D6位控制,对应中断向量 200CH,串行口状态寄存器SP_STAT(11H)的D5(发送完标志TI)和D6(接收完标志RI)置位都将触发该中断;第二种方式为接收、发送分别设置了中断号,使用INT_MASK1的D0位对应发送中断,中断向量2030H,TI置位触发该中断;INT_MASK1的D1位对应收中断,中断向量2032H,RI置位触发该中断。笔者采用了第二种通信方式。这样每接收完或发送完一个字节后就触发相应的中断,直接进行下一轮的接收、发送任务,而不必判断串口控制/状态寄存器SP_CON/SP_STAT(11H),使得中断子程序更为简练、高效。
3.2 尽量缩短中断时间
由于设计软件结构时使用了多个中断,为了保证程序的可靠运行,减少不同不断间互冲突的机率,在编制软件时尽可能简练各种中断的任务,缩短中断执行时间。在通信中断子程序中,进入中断后执行必要的任务,如:清串行口状态寄存器 SP_STAT中相应的状态位,将刚接收到的字符或需要发送的字符从缓冲区内读出或写入缓冲区,已接收或发送字符数增1等,之后便立即退出中断。其它任务如判断帧的有效性、对接收帧命令(遥测、遥控命令)的应答,准备发送帧等,都放在主程序中完成。
3.3 可靠地判断帧结束,防止通信停滞
利用单独的软件定时器,来判断一帧接收报文结束,可以防止若报文接收不完整,该帧通信任务无法结束而影响下一帧的接收。
由于一帧报文中字节与字节之间的时间间隔和帧与帧之间的时间间隔相比要小得多,因此每当接收一个新字节,就启动软件定时器开始计时,定时器的时间设定为帧与帧的最小时间间隔。波特率不同,该时间间隔也不同。若不到预定的时间内又接收到下一个字节,则说明一帧报文未结束,定时器重新计时;若定时器顺利计数到预定时间,就会触发相应的中断号,在该定时器中断子程序中设定帧结束标志字节,表明一帧报文接收完毕。当主程序内检测到一帧报文接收完毕后,会通过核查从方地址及循环冗余校验字节是否正确来判断该帧的有效性。若确定接收到的是一帧发送给已方的正确报文,则会根据报文内的功能码对该帧命令进行相应的处理,并准备发送帧。
MODBUS协议还规定了从方接收报文不正确时发回的出错帧。考虑到装置内部通信的过程不很复杂,在实际应用中如果从方收到的报文校验不正确,采取不作应答的方式。主方若在规定时间内未收到从方的应答报文时,将重发请求报文;若多次未收到从方应答报文,则报通讯故障。
3.4 通信速率的确定
由于所开的装置都在同一机箱内,模块与模块之间的间距很短,而MODBUS是基于RS485的长距离通信,可以不考虑距离对通信波特率的影响,并且由于采用主从式通信模式,不会出现线路堵塞现象。因此,仅从通信效率来看,只要不超过模块所使用芯片对最高波特率的限制,则设定的波特率越高,信息交互越快,通信效率也越高。但是,对于实时多任务系统,必须注意各任务的协调。MODBUS 通信协议中只对各种通信报文格式作了规定,对通信波特率和奇偶校验等不作硬性规定。当一帧报文的长度较长,而波特率又很高,会导致CPU忙于处理通信而可能丢失其它实时性任务,如实时采样等。因此,选择通信波特率时必须注意与其它任务相协调,而不是越高越好。在实际应用中,将波将率设置到 19200bps,系统调调运作。由于设定通信双方波特率完全一致,可以使接收端对每一个数据位的采样都发生在位周期的中点,实现可靠通信。另外,在字符传送时不使用奇偶校验位,以此相对提高了有效字节传递的速率。
3.5 合理的调试方法
在开发初期,使用仿真器等工具只能对单一CPU模块进行实时监测,而无法同时监测串行通信双方,难以确定问题所在,使调试效率受到很大影响。因此先将各CPU模块分别通过 RS485/RS232数据转换模块与微机进行通信测试,成功后再进行模块间联调,大大提高了联调的效率。在调试各模块与微机通信的过程中,微机使用 MODBUS调试软件,模仿主方的通信过程,主动向从方(各CPU模块)索要信息。整个接收、发送过程都是透明、清晰的,使得模块中存在的绝大多数问题都能在与微机通信的过程发现并及时解决。CPU模块间联调时,可以利用总线监控软件,观察双方发送的数据。当遇到通信问题的时候,就能比较容易地确定是哪一个模块发送数据不正确,从而确定问题所在。采用这样的调试方法,大大增强了不同开发人员、不同CPU之间的协调性,提高了装置研发的效率和进度。