A/D采集卡9111的应用例程(C#)


勇哥偶然在硬盘上看到这个项目。

其目的是用A/D采集卡采集基恩士G025激光控制器的模拟输出信号,其目的是实现激光数据的实时读取。

因为G025的批量采集方式是等采集完成才由控制器缓存下载一次性到IPC的,这个过程中无法实时看到激光采集到数据。


这个实验用到的是9111 A/D采集卡,把激光控制器的+-10V的信号转为数字量。

该验证勇哥做了足足半个月,转换结果非常的好,印象中数字量和模拟量转换后的结果其差值好象到了+-0.05um的差别。可以认为完全一致。


image.png

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Diagnostics;

namespace sampleLaser
{
    public partial class Form1 : Form
    {
        private List<string> listAry = new List<string>();
        public short m_dev;
        private Thread t1;
        private const int len1 =1024*53; // 119808;// 1024 * 10;
        private ushort[] buffer1 = new ushort[len1];
        private ushort[] buffer2 = new ushort[len1];
        private List<ushort> buffer1List = new List<ushort>();
        private List<ushort> buffer2List = new List<ushort>();
        double[] m_voltage_array1 = new double[len1];
        double[] m_voltage_array2 = new double[len1];
        short ret;
        public Form1()
        {
            InitializeComponent();
            m_dev = D2KDASK.D2K_Register_Card(D2KDASK.DAQ_2005 , 0);
            if (m_dev < 0)
            {
                MessageBox.Show("Register_Card error!");
            }

         
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ret = D2KDASK.D2K_AI_CH_Config ((ushort)m_dev,-1,D2KDASK.AD_B_10_V);
            if (ret < 0)
            {
                MessageBox.Show("DAQ 2005_Config error!");
            }
            D2KDASK.D2K_AI_AsyncDblBufferMode((ushort)m_dev, false);
            //D2KDASK.AI_AsyncDblBufferMode((ushort)m_dev, false);
        }

        private bool qFlag=false;
        private void fun()
        {
            int js1 = 0;
            while (!qFlag)
            {
                ushort v1 = 0,v2=0;
                //ret = DASK.AI_ReadChannel((ushort)m_dev, 0, DASK.AD_B_10_V, out v1);

                //ret = DASK.AI_ReadChannel((ushort)m_dev, 0, DASK.AD_B_10_V, out v1);   //out2
                //ret = DASK.AI_ReadChannel((ushort)m_dev, 1, DASK.AD_B_10_V, out v2);   //out1
                //float K = 32768;
                //float resv1 = (v1) *(1f / K) * (10f / 1f)-0.01f;   //out2
                //float resv2 = (v2) *(1f / K) * (10f / 1f)-0.01f;    //out1
                float resv1, resv2;
                //resv1 = buffer.ToList().Reverse();
                if (ret < 0)
                {
                    continue;
                }
                //listAry.Add(resv2.ToString() + "," + resv1.ToString());
                Thread.Sleep(2);
                if (++js1 > 10000) break;
                
            }

            //MessageBox.Show("ok");
            var s1=new StringBuilder();
            foreach(var m in listAry)
            {
                s1.Append(m+Environment.NewLine);
            }
            File.WriteAllText("d:\\test1.csv",s1.ToString());
            MessageBox.Show("OK");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            var aary = new short[10000]; 
            var dbary=new double[10000];
            buffer1List.Clear();
            ushort bufid=0;
            D2KDASK.D2K_AI_ContBufferSetup((ushort)m_dev, aary,
                10000, out bufid);


            //D2KDASK.D2K_AI_ContReadChannel((ushort)m_dev, 1,
            //    bufid, 512, 50 * 1000, 0, D2KDASK.SYNCH_OP);
            var s1 = new Stopwatch(); s1.Start();
            var chans=new ushort[2]{0,1};
            D2KDASK.D2K_AI_ContReadMultiChannels((ushort)m_dev, 2, chans,
                bufid, 5000, 80, 0, D2KDASK.SYNCH_OP);
           

            D2KDASK.D2K_AI_ContVScale((ushort)m_dev, D2KDASK.AD_B_10_V,
                aary, dbary, 10000);
            var t1 = s1.ElapsedMilliseconds; s1.Stop();
            //ret = D2KDASK.D2K_AI_ContScanChannels ((ushort)m_dev, 1, aary, 512, 50 * 1000, 0,
            //    0);
            //ret = DASK.AI_ContVScale((ushort)m_dev, DASK.AD_B_10_V, aary.ToArray(), m_voltage_array1, aary.Count());
            var vary = new List<double>();
            float K = 32768;
            for (int i = 0; i < aary.Length; i++)
            {
                vary.Add((aary[i]) * (1f / K) * (10f / 1f) - 0.0007);
            }
            //rtbMsg.AppendText(sw.ElapsedMilliseconds.ToString()+Environment.NewLine);
            rtbMsg.AppendText(vary.Average().ToString("0.00000") + Environment.NewLine);

            //Stopwatch sw = new Stopwatch();
            //sw.Restart();
            //var n = len1 / (1024 * 25);
            //var ys = len1 % (1024 * 25);
            //if (ys > 0) n = n + 1;
            //for (int i = 0; i < n; i++)
            //{
            //    var aary = new ushort[512];
            //    var bary = new ushort[1024 * 25];

            //    ret = DASK.AI_ContReadChannel(
            //        (ushort)m_dev, 0, DASK.AD_B_10_V, aary
            //        , 1024, 50 * 1000, DASK.SYNCH_OP);

            //    ret = DASK.AI_ContReadChannel(
            //      (ushort)m_dev, 1, DASK.AD_B_10_V, bary
            //      , 1024 * 25, 50 * 1000, DASK.SYNCH_OP);

            //}
            //sw.Stop();
            //MessageBox.Show(sw.ElapsedMilliseconds.ToString());

            //t1 = new Thread(new ThreadStart(fun));
            //t1.IsBackground = true;
            //t1.Start();
            //button1.Enabled = false;

        }

        private bool grabIsAOK = false;
        private bool grabIsBOK = false;
        private void grabA(object n1)
        {
            grabIsAOK = false;
            //var n = len1 / (1024 * 25);
            //var ys = len1 % (1024 * 25);
            //if (ys > 0) n = n + 1;
            ////for (int i = 0; i < n; i++)
            ////{
            //    var aary = new ushort[1024 * 25];
            //    ret = D2KDASK.AI_ContScanChannels(
            //        (ushort)m_dev, 0, D2KDASK.AD_B_10_V, aary
            //        , 1024, 50 * 1000, D2KDASK.SYNCH_OP);
            //    buffer1List.AddRange(aary);
            ////}
            //grabIsAOK = true;
        }

        private void grabB(object n1)
        {
            //grabIsBOK = false;
            //var n = len1 / (1024 * 25);
            //var ys=len1%(1024*25);
            //if (ys > 0) n = n + 1;
            ////for (int i = 0; i < n; i++)
            ////{
            //    var bary = new ushort[1024 * 25];
            //    ret = D2KDASK.AI_ContScanChannels(
            //      (ushort)m_dev, 1, D2KDASK.AD_B_10_V, bary
            //      , 1024, 50 * 1000, D2KDASK.SYNCH_OP);
            //    buffer2List.AddRange(bary);
            ////}
            grabIsBOK = true;
        }
        
        private void button2_Click(object sender, EventArgs e)
        {
            if (!grabIsAOK || !grabIsBOK) return;
            //ret = D2KDASK.AI_ContVScale((ushort)m_dev, D2KDASK.AD_B_10_V, buffer1List.ToArray(), m_voltage_array1, buffer1List.Count);
            //if (ret < 0)
            //{
            //    MessageBox.Show("D2K_AI_ContVScale error!");
            //    return;
            //}
            //ret = D2KDASK.AI_ContVScale((ushort)m_dev, D2KDASK.AD_B_10_V, buffer2List.ToArray(), m_voltage_array2, buffer2List.Count);
            //if (ret < 0)
            //{
            //    MessageBox.Show("D2K_AI_ContVScale error!");
            //    return;
            //}
            //var list1 = m_voltage_array1.ToList();
            //var list2 = m_voltage_array2.ToList();

            //var list3 = new List<double>();
            //for (int i = 0; i < list1.Count; i++)
            //{
            //    list3.Add(list1[i] + list2[i]);
            //}
            //rtbMsg.AppendText(list3.Average().ToString()+Environment.NewLine);
            
            //var sb1 = new StringBuilder();
            //for(int i=0;i<list1.Count();i++)
            //{
            //    sb1.Append((i+1)+","+list1[i].ToString("0.0000")+","+list2[i].ToString("0.0000"));
            //    sb1.Append(Environment.NewLine);
            //}
            //rtbMsg.Text = sb1.ToString();
            //int js1 = 0;
            //foreach (var m in buffer1)
            //{
            //    if (m != 0) ++js1;
            //}
            //int js2 = 0;
            //foreach (var m in m_voltage_array1)
            //{
            //    if (m != 0) ++js2;
            //}
            //MessageBox.Show(js1 + "," + js2);


            //qFlag = true;
            //button2.Enabled = false;
            //Thread.Sleep(2000);
            //var sb1 = new StringBuilder();
            //foreach (var m in listAry)
            //{
            //    sb1.Append(m.ToString()+Environment.NewLine);
            //    sb1.Append(Environment.NewLine);
            //}
            //rtbMsg.Text = sb1.ToString();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            ushort v1 = 0;
            ushort v2 = 0;
            double v11 = 0, v22 = 0;
            ret = D2KDASK.D2K_AI_ReadChannel ((ushort)m_dev, 0, out v1);   //out2
            ret = D2KDASK.D2K_AI_ReadChannel((ushort)m_dev, 1, out v2);    //out1
            ret = D2KDASK.D2K_AI_VReadChannel((ushort)m_dev, 0, out v11);
            ret = D2KDASK.D2K_AI_VReadChannel((ushort)m_dev, 1, out v22);
            float K = 32768; float resv1 = 0; float resv2 = 0;
            var rate = 1;
            if (v1 < K-20)
            {
                resv1 = (v1) * (1f / K) * (10f / 1f)*rate - 0.01f;   //out2
            }
            else if (v1 > K)
            {
                resv1 = (ushort.MaxValue-v1) * (1f / K) * (10f / -1f)*rate - 0.01f;   //out2
            }

            if (v2 < K - 20)
            {
                resv2 = ((v2)) * (1f / K) * (10f / 1f)*rate - 0.01f;    //out1
            }
            else if (v2 > K)
            {
                resv2 = (ushort.MaxValue-v2) * (1f / K) * (10f / -1f)*rate - 0.01f;    //out1
            }
           
            
            rtbMsg.AppendText(resv2.ToString() + "," + resv1.ToString() + Environment.NewLine+
                v11+","+v22+Environment.NewLine
                );
        }

        private void button4_Click(object sender, EventArgs e)
        {
        //    var range = D2KDASK.AD_B_10_V;
        //    var mode = D2KDASK.ASYNCH_OP;
        //    uint read_count = 2048;
        //    var rate = D2KDASK.CLKSRC_EXT_SampRate;
        //    var buffer=new ushort[10000];
        //    Array.Clear(buffer,0,buffer.Length-1);

        //    short res = -1;
        //    res = D2KDASK.AI_ContReadMultiChannels(
        //        (ushort)m_dev, 0, new ushort[] { 0, 1 }, new ushort[] { range, range },
        //        buffer, 1024, rate, mode);
        //    if (res != 0)
        //    {
        //        MessageBox.Show("AI_ContReadMultiChannels Error");
        //    }
            
        //    byte halfReady = 0;
        //    byte fStop = 0;
        //    int js1 = 0;
        //    do
        //    {
        //        ++js1;
        //        do
        //        {
        //            D2KDASK.AI_AsyncDblBufferHalfReady((ushort)m_dev, out halfReady, out fStop);
        //        } while (halfReady == 0);
        //        D2KDASK.AI_AsyncDblBufferTransfer((ushort)m_dev, buffer);
                
        //    } while (js1 < 1);

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            D2KDASK.D2K_Release_Card((ushort)m_dev);
        }
    }
}



--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年5月    »
12345
6789101112
13141516171819
20212223242526
2728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864