微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 数据采集处理系统在电力中的应用设计

数据采集处理系统在电力中的应用设计

时间:12-30 来源:3721RD 点击:

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_aiini

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top