汪长林
摘要:嵌入式多處理器架构,可监测电网电能质量,实时分析线路故障,并对故障点录波,存储故障波形数据,运作于二次线路中的智能终端。该装置包含显示屏,采用QT设计界面,支持参数配置,波形显示,历史数据/实时数据显示等等。内部数据通信主要由以太网、SPI、Local Bus组成,装置内置嵌入式Web服务器,可以把数据传输到PC端网页,显示出数据和波形,装置设计框架清晰明朗,各工作部件各司其职,有序衔接。
关键词:电能质量监测装置;设计方案;电力系统;故障录波
0 引言
电力能源是当今社会最不可或缺的清洁能源之一,由于近年来科学技术发展飞快,各种电力自动化设备、电子设备接入电网,对电能输出的平滑度造成了一定冲击,电能质量问题越来越受到社会各界的广泛关注,用户对于电能质量的要求越来越高,供电部门在整改电气环境、加强电力系统管理的同时,也需要一种高效的电能质量分析自动化装置。为此,电能质量监测终端应运而生,它可以帮助监测电网各项指标[1],智能分析电力系统出现的故障。本文将对电能质量监测装置的功能和内部实现进行分析和介绍。
1 系统组成
1.1 硬件框架组成
该装置由多CPU组成,采集部分采用DSP处理器,通信和显示部分则由ARM处理器实现。框架结构如图1和图2所示。
1.2 软件框架组成
软件部分主要为DSP端运算程序和ARM端处理程序,前端采集由DSP来完成,采用BF609工业级芯片,主频1 GHz,双核,搭载独立16位AD芯片AD7607完成高精度采样。每周波采样512点,采样点采用FFT算法,计算出基波到0.5~50次的各次[间]谐波电压电流分量、总[间]谐波电压电流含量、各次[间]谐波畸变率、总电压电流[间]谐波畸变率、各次[间]谐波功率、[间]谐波相角等,以及三相不平衡、电压波动、瞬态事件等电力系统数据。
前端采样一直处于高效实时运作状态,数据通过高速SPI接口传输到ARM处理器,这里可以考虑扩展板卡,ARM板主要用于数据通信和存储等,让通信板和采样DSP板独立开,SPI接口即板间通信通道。ARM板处理器选用ARM9以上可运行Linux系统的皆可,本装置选型为TI的AM335,cortex-A8内核,800 MHz主频,外加512M DDR,移植了嵌入式Linux 3.2的内核,NAND FLASH 512M,由于存储数据量较大,还配备了16G的存储卡。
文献[2]中提到一种ARM9处理器的bootloader启动加载过程,A8也类似,CPU上电后,从nand flash启动,一级bootloader,二级bootloader(关看门狗,关中断,设置CPU时钟频率等),三级bootloader(uboot),启动内核,挂载文件系统。
通信板对外接口丰富,有2路RS485接口,2个USB接口,2个以太网接口;HMI部分由按键和液晶屏组成,4.3寸彩屏,6键导航按键,操作方便友好。软件框架如图3所示。
2 电力系统数据运算
在AD采样得到一系列波形数据后,可进行积分运算,电压和电流的有效值计算公式如下:
式中:u(x)为一个周期内各时间点的电压瞬时值;T为周期;U为电压有效值。
式中:i(x)为一个周期内各时间点的电流瞬时值;T为周期;I为电流有效值。
数据计算参照国标《电能质量 公用电网谐波》(GB/T 14549—1993)[3]。
谐波部分,第h次谐波电压含有率HRUh为:
式中:HRUh为第h次谐波电压含有率;Uh为第h次谐波电压(方均根值);U1为基波电压(方均根值)。
谐波电压含量UH为:
文献[3-9]列出了部分常用电能质量数据计算标准,文献[10]讲述了Comtrade文件的格式标准。
3 数据处理和存储
采集板通过SPI接口进行板间通信,把数据传输到ARM板,每数百微秒发起一次数据通信,传输有效值、波形数据、谐波、电压波动等等,ARM板操作系统下运行多进程/线程处理程序,收到数据作相应处理、转发、显示。进程间使用共享内存进行通信,电力系统数据以3 s(可设置)为时间间隔存储到flash上,存储方式为sqlite数据库。SPI驱动数据触发部分程序:
void psq_handler(int signum)
{
static unsigned int cnt = 0;
ioctl(fd, IOREQ_READ_NOTIFY, &app);
cnt = app.cnt;
memcpy(&DSPBuf[wpoint][0],base+(cnt*SLOT_SIZE),app.byte_num[cnt]);
nsize[wpoint]=app.byte_num[cnt];
wpoint++;
if(wpoint >=DSPBUFCOUNT)
wpoint =0;
if(!sigflag)
{
::raise(SIGUSR1);
}
}
……
signal(SIGIO, psq_handler);
fcntl(fd, F_SETOWN, getpid());
oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, FASYNC | oflags);