首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

利用MODBUS提高多CPU系统协同开发的效率(2)

利用MODBUS提高多CPU系统协同开发的效率(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之间的协调性,提高了装置研发的效率和进度。
返回列表