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控件用于显示基波功率。为提高读数据的速率,使用了线程。动态链接库和防覆盖技术的应用,使得系统更为可靠。多种采集方式同时应用,便于比较多种方法各自的优缺点。
评论
查看更多