0.引 言
目前,我国对于大部分供电电力设备的监控和管理上基本还停留在人工巡查这种比较原始的管理方式下(例如铁路道口的信号电源),不但管理效率低下,而且供电质量和水平都得不到有效的保证。本文以实时操作系统small RTOS51为基础,主要探讨了一个用于电力系统现场监控终端单元的设计过程,希望能够为提高配电自动化水平提供一些思路,尽一点微薄之力。
1.Small RTOS51多任务实时操作系统
Small RTOS51是一个源代码公开的多任务实时操作系统,它可以简化那些复杂而且对时间要求严格的工程软件设计工作。它具有公开源代码、可移植、可固化、占先式、中断管理及RAM 需求小等特点。
2.系统功能描述
本故障诊断终端主要应用在铁路道口信号灯电源的监控与管理,针对该故障诊断终端应用的具体场合,在设计时主要考虑以下几个方面:实用性,由于本故障诊断终端主要用于监控铁路道口信号电源的工作情况,所以以实用性为原则,一般情况下只要具有以下功能即可满足需要:远程检测、分合控制、远程开合控制、越限报警及故障录波;实时性,本故障诊断终端要求在信号电源的每个工频周期内(20毫秒)不间断的、均匀采集20个点离散数据,及时运算,发生故障时能够及时报警,以便及时进行处理,故对实时性有一定要求;可靠性,本故障诊断终端主要应用于各铁路道口,工作地点多为野外,工作环境十分恶劣,必须有足够的可靠性才能保证系统稳定运行。
3.系统硬件模块
系统从总体上分成主控模块,交流电信号输入及调理模块,人机接口模块,CAN总线通信模块以及开关量输入输出通道5大模块。系统的主控CPU选用Cygnal公司的C8051F040 SoC型单片机(以下简称040单片机)。系统液晶显示LCD采用长沙太阳人公司生产20×04字符型液晶显示模块。实时时钟模块经过综合比较,考虑到在设计中同时需要采用NVRAM和实时时钟,我们设计中选用了非易失性的时间管理RAM-DS1743,以提高系统的集成度,增加系统的可靠性。系统CAN总线驱动器在本设计中选用PHILIP公司生产的TJA1050T总线驱动器。
4. 实时操作系统的软件设计
根据系统实现的功能以及CygnalF040微处理器的特性,对系统进行任务分割,确定每个任务的优先级,并修改SmallRTOS51与硬件相关的部分内核代码。
4.1任务的划分
根据上述故障诊断终端所需实现的功能,划分系统为故障检测、采样计算、CAN总线通信、人机交互界面、容错设计等六个任务。实时内核SmallRTOS51提供任务调度、任务管理、任务间的通信、中断管理和内存管理等功能。
4.2任务的创建及调度
SmallRTOS51使用静态方法建立任务,节省RAM的开销,使得SmallRTOS51可以在小RAM的CPU中运行,而每一个任务必须是一个无限的循环。当系统启动多任务环境时,通过调用OSStart()以初始化所有任务的堆栈,并将堆栈指针指向ID为0的任务堆栈空间;每个任务的堆栈结构如图1所示。在任务调度方面,SmallRTOS51采用固定优先级(亦称静态优先级)的分配策略,任何两个任务的优先级不能相同,允许用户改变任务的优先级。
4.3 系统软件需求
根据系统功能要求,在SmallRTOS51平台下需要实现下列API函数,并且需要使用SmallRTOS51提供的系统服务,例如时间延时功能、信号量等。
4.3.1 人机界面
(1)键盘驱动。
本系统采用独立式键盘设计,菜单驱动程序设计的实质就是对键盘进行周期性处理,使用消息队列传递键盘消息来处理按键问题;解析键值,执行功能模块同时刷新画面。在中断发生后,首先获取键值void getkey (void);应用系统函数完成去抖延时;当确认有键按下时,发送DOWNKEY消息;松开时发送UPKEY消息,并依据键值的不同来进行解析:未按键:在没有按键的情况下,直接跳过键盘解析模块,其键值为0x79;方向键:依照当前系统所处的工作状态分成两种情况,如果当前显示画面为菜单选择状态,则上下方向键用来移动游标,达到改变选项的目的。如果是设定画面,则左右方向键用来移动游标,改变设定选项,而上下键用来改变对应选项设定值,其键值为0xe9、0xd9,0xb9、0xf1;确认键:这里也分成两种情况,如果当前显示画面为菜单选择状态,则确认键用来进入下一级子菜单或者功能模块。而当前画面为设定画面时,确认键用来确认存储所更改的设定值,其键值为0xf1;返回键:返回键用来返回上一级菜单,返回键值为0xf8。键盘流程图如图2所示,人机界面软件框图如图3所示。
(2)LCD液晶显示部分。LCD的API函数实现如下功能:LCD的初始化配置;显示ASCII字符串。图6为LCD模块的接口框图。应用程序通过下面8个函数完成对LCD接口的操作LcdPos()、LcdRead()、LcdWDat()、LcdInit()、DisANum()、LcdWrite()、DisAStr()、LCDWFont()、BcdToDec()、DecToBcd()。LcdInit()是模块的初始化代码。由于使用SmallRTOS51提供的服务,LcdInit()必须在使用其它函数之前激活,并且在多任务启动之后调用,LcdInit()初始化硬件端口配置、创建信号量、设置LCD的工作模式。另外,通过LCDWFont函数可以自定义8个5×8像素的字符或符号。例如定义一个下向箭头“↓”,程序清单
void XLCDWFont(void)
{ uint8 i;
uint8 font[ ]= {0x04,0x04,0x04,0x04,0x15,0x0e,0x04,0x00};
for ( i=0;i<8;i++ )
{
LcdWCmd ( 0x40+I ) ;
LcdWDat ( font[i] ) ;
}
}
图2 键盘流程图
图3 人机界面软件框图
4.3.2 实时时钟
DS1743内部集成的实时时钟相关寄存器位于RAM中的最高八个地址,即控制寄存器位于地址1FF8,年,月,日,星期,时,分,秒寄存器位于地址1FF9-1FFF。控制寄存器有两个位,读取位和写入位,通过对这两个位写入1中止外部时钟寄存器的更新动作,以预防在更新过渡期间读到错误的时钟数据。主函数体共有两个:Ds1743GetTime()、Ds1743SetTime(),其中uint8 DecToBcd (uint8 number) 与uint8 BcdTDeco (uint8 number)为十进制与BCD码相互转换函数。
4.3.3 CAN总线驱动程序
一般情况下最基本的CAN总线节点的通信软件包括三个部分:CAN节点的初始化,消息的传送,消息的接收。首先建立缓冲区,对CAN节点进行初始化,主要包括以下几个部分:CAN引脚输出方式的设置,波特率参数的设置,消息对象的初始化,以及当允许接收或发送中断时对相应中断允许位的设置。要进入初始化状态,必须设定CAN控制寄存器中的Init位为1。设定完成后再复位Init位退出初始化状态。初始化程序主要完成对所有的报文对象进行初始化(一般将所有值置零),对CAN 控制寄存器(CAN0CN)、位定时寄存器(BITREG)进行设置,还要对发送报文对象和接收报文对象分别进行初始化。主程序中规定对象初始化、发送和接收初始化,启动CAN 处理机制(对BITREG 和CAN0CN 初始化),下面为CAN 启动程序:
void StartCAN (uint8 count)
{
WORD bps;
Switch (count) // 波特率参数设置
{……………………………………...}
EIE2 | = 0x20; // 开中断
}
CAN 报文发送是由CAN 控制器自动完成的,用户只需根据接收到的远程帧的识别符,将对应的数据转移到发送缓冲寄存器,然后将此报文对象的编码写入命令请求寄存器启动发送即可,而发送由硬件来完成。这里,我们使用定时更新发送报文对象中的数据,数据的发送有控制器自动完成,当其收到一个远程帧时,就将具有相同识别符的数据帧发送出去。
CAN 报文的接收与发送一样,是由CAN 控制器自动完成的,接收程序只需从接收缓存器中读取接收的数据,再进行相应的处理即可。其基本方法与发送程序一致,只是接收程序采用中断方式。在此应用中,接收程序主要接收上位机对下位机的参数设置数据,只有当修改时才需要接收数据,所以采用中断方式处理比较合适。在对缓冲区进行读写过程中,引入读、写两个信号量分别对缓冲区两端的操作进行同步。这样设计的优点在于:当用户任务想写但缓冲区满时,在信号量上睡眠,让CPU运行别的任务,待ISR从缓冲区读走数据后唤醒此睡眠的任务;类似地,当用户任务想读但缓冲区空时,也可以在信号量上睡眠,待外部设备有数据来了再唤醒。由于SmallRTOS51的信号量提供了超时等待机制,CAN口当然也具有超时读写能力。
4.3.4开关量输入输出模块
开关量输入部分模块的作用是为故障诊断终端正确监测开关量的状态提供输入通道。开关量输入输出部分模块的底层驱动函数主要包括两个函数,分别是:
uchar SwitchStausGet(void) //获取开关量的状态
void SwitchStausSet(uchar dat) //设定开关量的状态
5.结语
本设计中采用Small RTOS实时操作系统,对于实时操作系统,要求调度的实时性、时间响应的可确定性和系统的高度可靠性,最重要的指标就是内存的开销。本设计中单片机采用Cygnal F040,内部RAM为4352字节(4K+256),程序经过优化调试后,RAM总共占用402字节,符合系统内存要求,无须外扩RAM已能很好的实现系统功能。以Small RTOS51嵌入式操作系统为基础开发的电力系统故障诊断终端系统具有性能稳定、实时性能良好、扩展性强等特点。通过系统运行测试表明系统工作稳定可靠,可以满足各种实时性能要求,在故障诊断终端技术中有很好的应用前景。