⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 多功能数据采集卡上位机完整代码
💻 ~PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, PCI8361, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  m_cardNO: Longint;
  STxt_AD:array[0..7] of TStaticText;
  m_timer1Finish: Boolean;
//  m_initData : PLongArray;
  m_floatData : PSingleArray;
implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
    //生成控件数组
    for i:=0 to 7 do
    begin
        STxt_AD[i] := TStaticText.create(self);
        STxt_AD[i].Parent := form1;
        STxt_AD[i].BorderStyle := sbsSunken;
        STxt_AD[i].Visible := true;
        STxt_AD[i].Width := 90;
        STxt_AD[i].Height := 17;
        STxt_AD[i].Left := 100 + (STxt_AD[i].Width+3)*((i-1) mod 8 );
        STxt_AD[i].Top := 100 + (STxt_AD[i].Height+3)*((i-1) div 8 );
        STxt_AD[i].AutoSize := false;
        STxt_AD[i].Caption := 'AD' + inttostr(i+1);
    end;

    //打开设备
    m_cardNO := 1;
    if (ZT8361_OpenDevice(m_cardNO) <> 0) then
        MessageBox(form1.Handle,'打开失败','',MB_OK)
    else
        //MessageBox(form1.Handle,'打开成功','',MB_OK);
        form1.Caption := '打开成功';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//    FreeLongArray(m_initData, 819200); //释放缓冲区
    FreeSingleArray(m_floatData, 819200); //释放缓冲区
    //关闭设备
    //m_cardNO := 1;
    if (ZT8361_CloseDevice(m_cardNO) <> 0) then
        MessageBox(form1.Handle,'关闭失败','',MB_OK)
    else
        //MessageBox(form1.Handle,'关闭成功','',MB_OK);
        form1.Caption := '关闭成功';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Longint;
  ampArr : PLongArray;
begin
//打开中断,同时启动定时AD
    CreateLongArray(ampArr, 8); //申请缓冲区
    CreateSingleArray(m_floatData, 819200); //申请足够大的缓冲区
    //如果缓冲区分配失败,退出
    if (ampArr=nil) or (m_floatData=nil) then
    begin
        showMessage('缓冲区分配失败');
        Exit;
    end;

    ZT8361_CloseIRQ(m_cardNO); //关闭中断
    ZT8361_DisableAD(m_cardNO); //停止定时AD
    ZT8361_ClearHFifo(m_cardNO, 1); //清空硬件FIFO(HFIFO)
    ZT8361_ClearSFifo(m_cardNO, 1); //清空AD软件FIFO(SFIFO)

    if ZT8361_GetSFifoSize(m_cardNO, 1) <> 400 then
    begin
        if ZT8361_SetSFifoSize(m_cardNO, 1, 400) <> 400 then
        begin
            MessageBox(form1.Handle,'未申请到足够的缓冲区','',MB_OK);
            Exit;
        end;
    end;
    //打开中断会死机
    ZT8361_OpenIRQ( m_cardNO, 0, 0, 0, 0, 0 );
    ZT8361_InitIRQ(m_cardNO, 1); //使能HFIFO半满中断
    //设置AD方式控制字,同时清空FIFO
    //通道1采集, 速率50K,定时方式, 1倍增益
    for i:=0 to 8-1 do
    begin
      ampArr[i] := 0; //一倍增益
    end;
    ZT8361_AIinit(m_cardNO, 0, $100 + $1, 2, ampArr, 5, 47, 0, 0);
    ZT8361_EnableAD(m_cardNO); //允许定时AD

    Label1.Caption := '错误号:' + inttostr(ZT8361_GetLastErr); //返回函数执行的状态
    m_timer1Finish := True;
    Timer1.Interval := 100;
    Timer1.Enabled := True; //False

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//停止定时采集
    m_timer1Finish := False;
    Timer1.Enabled := False;
    ZT8361_CloseIRQ(m_cardNO); //关闭中断
    Label1.Caption := '错误号:' + inttostr(ZT8361_GetLastErr); //返回函数执行的状态
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
    k: Longint;
    i: Longint;
    retCount, currCount, wantCnt: Longint;
    sum:array[0..7] of real;
begin
//连续采集,每100毫秒种读一次SFIFO,每次读一批数
//每批数,每个通道,取前若干个数求平均值显示
    if m_timer1Finish = False then Exit; //防止重入
    m_timer1Finish := False;
    //成批读数
    wantCnt := 10000;
    currCount := ZT8361_GetSFifoDataCount(m_cardNO, 1);
    if currCount >= wantCnt then
        begin
        retCount := ZT8361_AISFifo(m_cardNO, 0, m_floatData, wantCnt);
        if retCount<wantCnt then
        begin
          showMessage('读取数据失败');
          Exit;
        end;
        form1.Caption := '当前SFIFO中数据个数: ' + inttostr(currCount);
        Label1.Caption := '错误号:' + inttostr(ZT8361_GetLastErr); //返回当前错误号
        //每批数,每个通道,取前2500个数求平均值显示
        for k:=0 to 1-1 do
        begin
          sum[k] := 0;
          for i:=0 to 1000-1 do
          begin
            sum[k] := sum[k] + m_floatData^[i * 1 + k];
          end;
          STxt_AD[k].Caption := FormatFloat('0.00', sum[k]/1000.0) + ' mV';
        end;
    end;
    m_timer1Finish := True;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -