1 引言
在信息科学中,数据采集技术已经成为其重要的一个研究问题,它已经与计算机技术、网络技术、传感器技术、信号处理技术共同构成了现代检测技术的基础,随着科学技术的发展和数据采集系统的广泛应用,人们对数据采集的主要技术指标,如采样速率、分辨率、精度、输入电压范围、控制方式以及抗干扰能力等方面,都提出了越来越高的要求,尤其是采样速率,更是数据采集系统设计者和使用者最关心的一项重要指标。在电力系统自动化领域,实时数据采集是至关重要的环节,它直接影响整个自动化装置的性能。因此,提高采集速度和精度一直是电力系统软件开发人员要解决的难题。
2 系统结构
本文介绍的phcteeq-1型电力谐波综合治理实验装置的实时数据采集系统结构示意如图1所示。
图1 采集系统结构示意图
装置采用电力谐波有源滤波和无源滤波的先进理论和技术,以igbt-ipm智能模块、dsp、工控机等核心部件为硬件基础,进行电力谐波综合治理技术实验,实时性好,实验效果明显。装置采用公共基础台+功能挂件的设计方式,结构紧凑,集成度高,扩展性好,能够完成单相/三相电力谐波的产生、在线检测、分析、有源滤波和无源滤波等多项实验。
2.1 数据采集卡
在该装置中,模拟信号的采集主要通过数据采集卡,在这个装置中采用的pci8360a数据采集卡:它具有32个模拟量输入通道:ad0-ad31;输入信号范围:0~10v,-5v~+5v,0~20ma (0~10v为出厂默认设置)。输入精度为12位。单通道最大采样频率:500khz,多通道最大采样频率为200khz。启动转换方式为软件启动/外触发(定时)启动。这里将模拟量输入单双端选择跳线jp2设置为单端输入,模拟量输入范围选择跳线jp1,jp3设置为双极性。
在这个实验装置中需要采集的模拟信号有十四路:三相负载电流信号,三相补偿电流信号,三相电源电流信号,pwm波信号,变压器原边电流信号,三相电压信号。采用dhpt、dhct高精度微型传感器来完成数据采集的功能,采集到的数据经处理后传输到数据采集卡与dsp中。传输到数据采集卡的信号,一方面,实时动态显示原始信号,另一方面,经fft分析和基于单个人工神经元的自适应电力谐波检测方法分析后显示各次谐波权值。
2.2 dsp部分
dsp采用tms320f2812,tms320x28xx信号处理器集成了事件管理器(281x处理器),epwm, ecap, a/d转换模块,spi外设接口,sci通信接口,ecan总线通信模块,看门狗,通用目的数字量io,pll时钟模块,多通道缓冲串口,外部中断接口,存储器及其接口,内部集成电路(i2c)等多种外设单元,使用户能够以很便宜的价格开发高性能数字控制系统。传输给dsp的各种信号经fft算法分析,将各次谐波权值发送给工控机。dsp与上位机采用232串口通信。数据帧的格式如下:
a相:aaaa 1次谐波权值 3次谐波权值 5次谐波权值 … 25次谐波权值 aaaa
b相:bbbb 1次谐波权值 3次谐波权值 5次谐波权值 … 25次谐波权值 bbbb
c相:cccc 1次谐波权值 3次谐波权值 5次谐波权值 … 25次谐波权值 cccc
当用户选中了查看经dsp分析的某相信号时(单选),上位软件发送相应需求信号给dsp,例如:上位机发送aaaa,dsp接收到该信号后,首先发送两个字节的帧头aaaa响应上位机,上位机判断回传的数据是否为aaaa,是,则接收并显示,否,则不予理采。每次谐波权值采用32位表示,按照ieee 754 标准:
(1) 第1位为符号位,1 代表负,0代表正;
(2) 接下来用8位来表示指数部分;
(3) 接下来的23位用来表示有效数位。
帧尾为aaaa,表示一帧数据发送完毕。
2.3 plc部分
plc采用s7-200,主要完成挂件识别功能。将各变量状态通过opc技术与上位机软件通信。上位机软件组态显示电路状态,可以直观查看电路当前状态。
3 上位机软件
3.1 软件开发方式
软件采用delphi 7.0完全面向对象的可视化平台开发,它是borland公司最优秀的windows开发工具之一,它的可视化开发环境和面向对象的快速应用程序开发(rad)工具,使程序开发人员能在windows平台上快速开发出32位的windows应用程序。它采用面向对象的程序设计语言object pascal。下面对上位机软件中的关键技术加以说明。
在pci8360a的使用中有三种可行的软件开发方式:
(1) 使用厂家提供的开发软件。厂家提供的软件只能作为测试采集卡是否正常的工具。
(2) 自己动手编制程序完成底层的数集和指令的输出。此方法工作量大。
(3) 利用开发商所提供的windows标准动联接库文件。使用动态链接库有如下优点:
l应用程序编译链接后的可执行文件较小;
l应用程序所需用到的内存较小;
l对应用程某一模块的修改,更换不会影响到其它模块。本系统的开发此种方式。动态链接库主要有两种调用方法:静态调用和动态调用。
动态链接库的静态调用是最简单的调用方法。它主要使用external指令来声明外部的函数或过程。为了方便使用和维护动态链接库,可以将工程中所用到的所有不同动态链接库中的函数统一定义在一个单元中,并且还可以在该单元中定义调用库中函数或过程时所使用的常量或数据类型。
动态链接库的动态调用主要是使用windows api函数进行相应的操作,比静态调用复杂的多。因此,这里采用动态链接库的静态调用的方向。
3.2 连续ad采集的编程思路
(1)首先在程序初始化时调用 zt8360a_opendevice函数,用于打开设备,只调一次即可。
(2) 调用 zt8360a_disablead 函数,禁止ad;调用zt8360a_clearhfifo函数,清硬件缓冲区(hfifo);调用 zt8360a_clearsfifo 函数,清软件缓冲区(sfifo);调用zt8360a_aiinit 函数,做一些ad初始化工作;调用 zt8360a_openirq函数,打开hfifo半满中断。
(3)在一个循环中不断调用zt8360a_getsfifodata count判断sfifo中数据的个数,申请一个数组,并把这个数组中传入 zt8360a_ aisfifo 用于接收数据,把读出的数据保存到文件或直接显示。注意:sfifo的默认大小为 819200,用户要不断读数,使sfifo有空间放入新的来自hfifo的数,如果sfifo中的有效数据的个数接近819200,会使整个ad过程停止。如果想重新采集,必须重复2—3步。
(4) 调用 zt8360a_closeirq函数,停止采集过程。
(5) 在程序退出前调用 zt8360a_closedevice函数。
3.3 pci8360a数据采集卡数据采集部分代码
if(zt8360a_opendevice(m_cardno) <> 0) then
//初始化数据采集卡,返回0表示打开设备成功,m_cardno为1
begin
showmessage(`打开设备失败`);
exit;
end
else
begin
i:=zt8360a_getcardstatus(1); //采集卡状态
if i<>0 then
begin
i:=zt8360a_getlasterr(); //得到当前错误号,为0表示无错误
showmessage(`错误号为:`+inttostr(i));
end;
getmem(data,sizeof(tsomearray)*8092); //读数据
zt8360a_disablead(m_cardno); //禁止ad
i:=zt8360a_getcardstatus(1);
if i<>0 then
showmessage(`禁止ad失败,错误号为:`+inttostr(i));
zt8360a_clearhfifo(m_cardno); //清硬件缓冲区
i:=zt8360a_getcardstatus(1);
if i<>0 then
i:=zt8360a_getlasterr();
showmessage(`清硬件缓冲区失败,错误号为:`+inttostr(i));
//showmessage(`hfifo`);
zt8360a_clearsfifo(m_cardno); //清驱动缓冲区
i:=zt8360a_getcardstatus(1);
if i<>0 then
i:=zt8360a_getlasterr();
showmessage(`清驱动缓冲区失败,错误号为:`+inttostr(i));
zt8360a_aiinit(m_cardno, 0, 1, 0, 0, 1, 625 ,1, 0, 0);
//设置ad方式控制寄存器
i:=zt8360a_getcardstatus(1);
if i<>0 then
// i:=zt8360a_getlasterr();
i:=zt8360a_getlasterr();
showmessage(`intit`+inttostr(i));
zt8360a_openirq( m_cardno, 0, 0, 0, 0); //打开8360a中断
i:=zt8360a_getcardstatus(1);
if i<>0 then
i:=zt8360a_getlasterr();
showmessage(`打开中断失败,错误号为:`+inttostr(i));
end;
end;
3.4 基于单个人工神经元的自适应电力谐波检测方法
基于单个人工神经元的自适应电力谐波检测原理如图2所示,该方法能够对奇次、偶次、特定次、总谐波以及相位进行实时准确的动态检测。假设实际系统中需要检测的最高次谐波是n次。
(1) 检测总谐波电流:只取sinωt和cosωt作为参考输入。人工神经元学习完成之后,系统的输出z(t)即为总谐波电流。
(2) 检测奇次谐波电流:取sinωt、cosωt以及sin(2k+1)ωt、cos(2k+1)
(3) ≤2k+1≤n,k为正整数) 等作为参考输入。人工神经元学习完成之后
i2k+1(t) = w(2k+1)s·sin(2k+1)ωt + w(2k+1)c·cos(2k+1)ωt (1)
就是对应的奇次谐波电流的值。
(4) 检测偶次谐波电流:取sinωt、cosωt以及sin2kωt、cos2kωt(2≤2k≤n,k为正整数)等作为参考输入。人工神经元学习完成之后
i2k(t) = w2ks·sin2kωt + w2kc·cos2kωt (2)
就是对应的偶次谐波电流的值。
(5) 检测特定次谐波和相位:取sinωt、cosωt以及sinkωt、coskωt(k∈[2,n]且为正整数)等作为参考输入。人工神经元学习完成之后
ik(t) = wks·sinkωt + wkc·coskωt (3)
就是对应的k次谐波的值;wkc/wks就是k次谐波相角的正切值。
图2 基于单个神经元的电力谐波检测原理图
3.5 iplot控件的应用
iplot控件是非常优秀的控件,能够直观实时显示工业现场中的模拟信号。它功能强大,即使在划分数据时也可以缩放,滚动。x轴,y轴和频道数均无限制。对于不同通道信号采用颜色区分,并用文字标注,方便观察比较分析。能以.bmp,.emf,.jpg各种图形格式保存信号曲线,也可以打印输出。现以其中一路通道信号的显示加以说明。
var
currcount:integer;
retcount:integer;
i:integer;
begin
//设置iocomp中iplt控件的参数
iplot.channel[0].titletext:= `u相电压信号`; //设置通道标题文字
iplt1.xaxis[0].min:=0; //设置u相电压信号x轴的起始坐标值
iplt1.xaxis[0].span:=2560; //设置x轴的坐标域
iplt1.yaxis[0].min:=-5000; //y轴表示u相电压信号的幅值
iplt1.yaxis[0].span:=10000;
i:=zt8360a_getlasterr();
if i<>0 then
showmessage(`错误号为:`+inttostr(i));
currcount := zt8360a_getsfifodatacount(m_cardno);
//得到驱动缓冲区(sfifo)中当前有效数据的个数
if currcount > 0 then
begin
retcount := zt8360a_aisfifo(m_cardno, data, 8192);
//定时启动ad或外触发启动ad时,从驱动缓冲区中读8192个数到缓冲区
for i:=0 to retcount do
begin
iplt1.channel[0].addxy(x,data^[i]); //图形显示
x:=x+1;
end;
end;
end;
3.6 线程的应用和防止数据覆盖
windows提供的多媒体定时器,它的最小时间精度只能达到1ms。不能满足实时数据采集的要求。在本项目中,采集的电压信号频率为50hz,每个周期为0.02秒。根据项目要求,每个周期需采样256个点,即每0.02/256=0.000078125秒读一次。因此需要使用线程。另外,pci8360a的单通道采样频率最高可达500khz,即每1/500000=0.000002秒采样一次。因此,可能出现数据覆盖,即还没有处理的数据被新读入的数据覆盖。为防止这种情况发生,需要创建缓存区。
4 结束语
在该项目的上位机软件开发过程中,数据采集是其它工作的前提。在数据采集中掌握pci8360a数据采集卡的的使用是非常重要的,它有效的利用了工机控机高速处理能力。在使用过程中要注意:未接信号的通道一定要接模拟地;为防止引入现场干扰,不应该使信号引脚悬空,可以将不使用的信号引脚与模拟地短路;各选择跳线均选出厂设置。iocomp图形控件的使用使得实验的上位机界面更加美观。iplot控件显示各路信号波形。ispectrumdisplay,ipiechart控件用于显示各次谐波含有率,iangularloggauge控件用于显示基波功率。为提高读数据的速率,使用了线程。动态链接库和防覆盖技术的应用,使得系统更为可靠。多种采集方式同时应用,便于比较多种方法各自的优缺点。
评论
查看更多