Пример #1
0
        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            // This example uses the default source (or gate) terminal for
            // the counter of your device.  To determine what the default
            // counter pins for your device are or to set a different source
            // (or gate) pin, refer to the Connecting Counter Signals topic
            // in the NI-DAQmx Help (search for "Connecting Counter Signals").

            try
            {
                myTask.COChannels.CreatePulseChannelFrequency(counterComboBox.Text,
                                                              "ContinuousPulseTrain", ni.COPulseFrequencyUnits.Hertz, idleState, 0.0,
                                                              Convert.ToDouble(frequencyTextBox.Text),
                                                              Convert.ToDouble(dutyCycleTextBox.Text));

                myTask.Timing.ConfigureImplicit(ni.SampleQuantityMode.ContinuousSamples, 1000);

                myTask.Start();

                btnStart.IsEnabled = false;
                btnStop.IsEnabled  = true;

                timer.IsEnabled = true;
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
                myTask.Dispose();
                btnStart.IsEnabled = true;
                btnStop.IsEnabled  = false;
                timer.IsEnabled    = false;
            }
        }
Пример #2
0
        public void RunDAQ()
        {
            DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;

            try
            {
                string s = string.Empty;
                s          = _name == "/ai1" ? "etalon" : "measured";
                inputTask  = new NationalInstruments.DAQmx.Task(s);
                outputTask = new NationalInstruments.DAQmx.Task(s + "_output");

                inputTask.AIChannels.CreateVoltageChannel(sInputName, "", AITerminalConfiguration.Pseudodifferential, inputDAQMinValue, inputDAQMaxValue, AIVoltageUnits.Volts);
                outputTask.AOChannels.CreateVoltageChannel(sOutputName, "", outputDAQMinValue, outputDAQMaxValue, AOVoltageUnits.Volts);

                inputTask.Timing.ConfigureSampleClock("", dRateIO, SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, iInputOutputSamples);
                outputTask.Timing.ConfigureSampleClock("", dRateIO, SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, iInputOutputSamples);

                outputTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger(terminalNameBase + "ai/StartTrigger", triggerEdge);

                inputTask.Control(TaskAction.Verify);
                outputTask.Control(TaskAction.Verify);

                outputData = fGen.Data;

                writer = new AnalogSingleChannelWriter(outputTask.Stream);
                writer.WriteMultiSample(false, outputData);

                StartTask();
                outputTask.Start();
                inputTask.Start();

                //inputCallback = new AsyncCallback(InputReady);
                reader = new AnalogSingleChannelReader(inputTask.Stream);


                //------------ТЕСТОВЫЙ КУСОК------------ ЧТЕНИЕ В ЭТОМ ЖЕ ПОТОКЕ--
                double[] data = reader.ReadMultiSample(iInputOutputSamples);

                BufReadDAQReceived?.Invoke(data);
                StopTask();
                //----------------------------------------------------------------



                /*// Use SynchronizeCallbacks to specify that the object
                 * // marshals callbacks across threads appropriately.
                 * reader.SynchronizeCallbacks = bSynchronizeCallbacks;
                 *
                 * reader.BeginReadMultiSample(iInputOutputSamples, inputCallback, inputTask);*/
            }
            catch (Exception ex)
            {
                StopTask();
                WarningDAQUpdate?.Invoke(ex.Message);
            }
        }
Пример #3
0
        /// <summary>
        /// 启动AI采集任务
        /// </summary>
        public void TryArmTask()
        {
            if (AIState != Status.Idle)
            {
                throw new Exception("If you want to arm, the AI state must be 'Idle'!");
            }
            else
            {
                if (aiTask == null)
                {
                    try
                    {
                        hasFinishFlag = false;
                        //新建任务
                        aiTask = new NationalInstruments.DAQmx.Task();

                        //aiTask.Stream.ReadAutoStart = true;

                        //配置任务
                        NIAIConfigMapper.MapAndConfigAll(aiTask, _staticConfig);

                        //获取并设置通道数
                        _staticConfig.ChannelCount = aiTask.AIChannels.Count;

                        //使用NI Task中的EveryNSamplesRead事件读取数据
                        aiTask.EveryNSamplesReadEventInterval = _staticConfig.ClockConfig.ReadSamplePerTime;
                        aiTask.EveryNSamplesRead += AiTask_EveryNSamplesRead;

                        //计算读取次数
                        times      = 0;
                        totalTimes = _staticConfig.ClockConfig.TotalSampleLengthPerChannel / _staticConfig.ClockConfig.ReadSamplePerTime;

                        //Verify the Task
                        aiTask.Control(TaskAction.Verify);

                        //read stream
                        //使用reader读数据
                        reader = new AnalogMultiChannelReader(aiTask.Stream);

                        aiTask.SynchronizeCallbacks = true;

                        //开始任务
                        aiTask.Start();

                        //idle -> ready
                        AIState = Status.Ready;
                    }
                    catch (DaqException ex)
                    {
                        //ex.Message
                        goError();
                        throw ex;
                    }
                }
            }
        }
Пример #4
0
        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            Mouse.OverrideCursor = Cursors.Wait;
            try
            {
                // create the task and channel
                myTask.AOChannels.CreateVoltageChannel(physicalChannelComboBox.Text,
                                                       "",
                                                       Convert.ToDouble(minimumTextBox.Text),
                                                       Convert.ToDouble(maximumTextBox.Text),
                                                       ni.AOVoltageUnits.Volts);

                // verify the task before doing the waveform calculations
                myTask.Control(ni.TaskAction.Verify);

                // calculate some waveform parameters and generate data
                FunctionGenerator fGen = new FunctionGenerator(
                    myTask.Timing,
                    edfrequency.Text,
                    edsamplesPerBuffer.Text,
                    edcyclesPerBuffer.Text,
                    signalTypeComboBox.Text,
                    edamplitude.Text);

                // configure the sample clock with the calculated rate
                myTask.Timing.ConfigureSampleClock("",
                                                   fGen.ResultingSampleClockRate,
                                                   ni.SampleClockActiveEdge.Rising,
                                                   ni.SampleQuantityMode.ContinuousSamples, 1000);


                ni.AnalogSingleChannelWriter writer =
                    new ni.AnalogSingleChannelWriter(myTask.Stream);

                //write data to buffer
                writer.WriteMultiSample(false, fGen.Data);

                profilechart.SetData(fGen.Data);

                //start writing out data
                myTask.Start();

                btnStart.IsEnabled = false;
                btnStop.IsEnabled  = true;


                timer.IsEnabled = true;
            }
            catch (ni.DaqException err)
            {
                timer.IsEnabled = false;
                MessageBox.Show(err.Message);
                myTask.Dispose();
            }
            Mouse.OverrideCursor = Cursors.Arrow;
        }
Пример #5
0
        public static string GenerateWave(string sourceDevice = "Dev1", double freq = 100, double amp = 2,
                                          string waveType     = "sine")
        {
            waveType = waveType.ToLower();
            AOFunctionGenerationType type = AOFunctionGenerationType.Sine;  //default value

            if (waveType.Equals("square"))
            {
                type = AOFunctionGenerationType.Square;
            }
            else if (waveType.Equals("triangle"))
            {
                type = AOFunctionGenerationType.Triangle;
            }
            NationalInstruments.DAQmx.Task myTask = new NationalInstruments.DAQmx.Task();
            try
            {
                if (amp < 0)
                {
                    amp *= -1;
                }
                if (amp > 5)
                {
                    amp = 5;
                }
                myTask.AOChannels.CreateFunctionGenerationChannel(sourceDevice + "/fgen",
                                                                  "fgen",
                                                                  type,
                                                                  freq,        //freq
                                                                  amp);        //amplitude

                // verify the task before doing the waveform calculations
                myTask.Control(TaskAction.Verify);


                myTask.Stop();
                myTask.AOChannels[0].FunctionGenerationType      = type;
                myTask.AOChannels[0].FunctionGenerationFrequency = freq;
                myTask.AOChannels[0].FunctionGenerationAmplitude = amp;


                myTask.Start();
            }
            catch (DaqException err)
            {
                myTask.Dispose();
                return("Fail" + err.Message);
            }
            myTask.Dispose();
            return("OK");
        }
Пример #6
0
        /// <summary>
        /// Включение постоянной генерации сигнала. Чтение и контроль ошибок при этом производится в CALLBACK. Для завершения генерации используй метод StopDAQGeneration()
        /// </summary>
        public void RunDAQGeneration()
        {
            DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;

            try
            {
                string s = string.Empty;
                s          = _name == "/ai1" ? "etalon" : "measured";
                inputTask  = new NationalInstruments.DAQmx.Task(s);
                outputTask = new NationalInstruments.DAQmx.Task(s + "_output");

                inputTask.AIChannels.CreateVoltageChannel(sInputName, "", AITerminalConfiguration.Pseudodifferential, inputDAQMinValue, inputDAQMaxValue, AIVoltageUnits.Volts);
                outputTask.AOChannels.CreateVoltageChannel(sOutputName, "", outputDAQMinValue, outputDAQMaxValue, AOVoltageUnits.Volts);

                inputTask.Timing.ConfigureSampleClock("", dRateIO, SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, iInputOutputSamples);
                outputTask.Timing.ConfigureSampleClock("", dRateIO, SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, iInputOutputSamples);

                outputTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger(terminalNameBase + "ai/StartTrigger", triggerEdge);

                inputTask.Control(TaskAction.Verify);
                outputTask.Control(TaskAction.Verify);

                outputData = fGen.Data;

                writer = new AnalogSingleChannelWriter(outputTask.Stream);
                writer.WriteMultiSample(false, outputData);

                StartTask();
                outputTask.Start();
                //inputTask.Start();

                inputCallback = new AsyncCallback(AnalogInCallback);
                reader        = new AnalogSingleChannelReader(inputTask.Stream);
                reader.SynchronizeCallbacks = true;
                //reader.BeginReadMultiSample(iInputOutputSamples, inputCallback, inputTask);
                reader.BeginReadWaveform(iInputOutputSamples, inputCallback, inputTask);



                //statusDAQtimer.Enabled = true;
            }
            catch (Exception ex)
            {
                StopTask();
                WarningDAQUpdate?.Invoke(ex.Message);
            }
        }
Пример #7
0
        /// <summary>
        /// 启动AI采集任务
        /// </summary>
        public void TryArmTask()
        {
            if (AIState != Status.Idle)
            {
                throw new Exception("If you want to arm, the AI state must be 'Idle'!");
            }
            else
            {
                if (aiTask == null)
                {
                    try
                    {
                        //新建任务
                        aiTask = new NationalInstruments.DAQmx.Task();

                        aiTask.Stream.ReadAutoStart = true;

                        //配置任务
                        NIAIConfigMapper.MapAndConfigAll(aiTask, _staticConfig.BasicAITaskConifg);

                        //获取并设置通道数
                        _staticConfig.ChannelCount = aiTask.AIChannels.Count;

                        //Verify the Task
                        aiTask.Control(TaskAction.Verify);

                        int channelCount      = _staticConfig.ChannelCount;
                        int readSamplePerTime = _staticConfig.BasicAITaskConifg.ClockConfig.ReadSamplePerTime;
                        ReadData(aiTask, channelCount, readSamplePerTime);

                        //idle -> ready
                        AIState = Status.Ready;

                        //开始任务
                        aiTask.Start();
                    }
                    catch (DaqException ex)
                    {
                        //ex.Message
                        goError();
                        throw ex;
                    }
                }
            }
        }
Пример #8
0
        public void GenerateWave(string device = "Dev1", double freq = 100, double amp = 2,
                                 AOFunctionGenerationType type = AOFunctionGenerationType.Sine)
        {
            try
            {
                if (myTask == null)
                {
                    myTask = new NationalInstruments.DAQmx.Task();
                    if (amp < 0)
                    {
                        amp *= -1;
                    }
                    if (amp > 5)
                    {
                        amp = 5;
                    }
                    myTask.AOChannels.CreateFunctionGenerationChannel(device + "/fgen",
                                                                      "fgen",
                                                                      type,
                                                                      freq,    //freq
                                                                      amp);    //amplitude

                    // verify the task before doing the waveform calculations
                    myTask.Control(TaskAction.Verify);
                }
                else
                {
                    myTask.Stop();
                    myTask.AOChannels[0].FunctionGenerationType      = type;
                    myTask.AOChannels[0].FunctionGenerationFrequency = freq;
                    myTask.AOChannels[0].FunctionGenerationAmplitude = amp;
                }

                myTask.Start();
            }
            catch (DaqException err)
            {
                MessageBox.Show(err.Message);
                myTask.Dispose();
                myTask = null;
            }
        }
Пример #9
0
        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            if (runningTask == null)
            {
                try
                {
                    btnStop.IsEnabled  = true;
                    btnStart.IsEnabled = false;

                    double rangeMinimum     = Convert.ToDouble(edminimum.Text);
                    double rangeMaximum     = Convert.ToDouble(edmaximum.Text);
                    double sampleRate       = Convert.ToDouble(edRate.Text);
                    int    samplePerChannel = Convert.ToInt32(edchannel.Text);

                    //// Create a new task
                    //myTask = new ni.Task();

                    //// Create a virtual channel
                    //myTask.AIChannels.CreateVoltageChannel(physicalChannelComboBox.Text, "",
                    //    (AITerminalConfiguration)(-1), rangeMinimum,
                    //    rangeMaximum, AIVoltageUnits.Volts);

                    //// Configure the timing parameters
                    //myTask.Timing.ConfigureSampleClock("", sampleRate,
                    //    SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, samplePerChannel * 10);

                    //// Configure the Every N Samples Event
                    //myTask.EveryNSamplesReadEventInterval = samplePerChannel;
                    //myTask.EveryNSamplesRead += new EveryNSamplesReadEventHandler(myTask_EveryNSamplesRead);


                    //// Verify the Task
                    //myTask.Control(TaskAction.Verify);

                    //// Prepare the table for Data
                    //InitializeDataTable(myTask.AIChannels, ref dataTable);

                    //runningTask = myTask;
                    //analogInReader = new AnalogMultiChannelReader(myTask.Stream);
                    //runningTask.SynchronizeCallbacks = true;

                    //runningTask.Start();



                    // Create a new task
                    ni.Task myTask = new ni.Task();

                    // Create a virtual channel
                    myTask.AIChannels.CreateVoltageChannel(physicalChannelComboBox.Text, "",
                                                           (ni.AITerminalConfiguration)(-1), rangeMinimum,
                                                           rangeMaximum, ni.AIVoltageUnits.Volts);

                    // Configure the timing parameters
                    myTask.Timing.ConfigureSampleClock("", sampleRate,
                                                       ni.SampleClockActiveEdge.Rising, ni.SampleQuantityMode.FiniteSamples, samplePerChannel * 10);

                    myTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("/Dev4/PFI12", ni.DigitalEdgeStartTriggerEdge.Rising);

                    myTask.Triggers.StartTrigger.Retriggerable = true;

                    // Configure the Every N Samples Event
                    myTask.EveryNSamplesReadEventInterval = samplePerChannel;

                    myTask.EveryNSamplesRead += new EveryNSamplesReadEventHandler(myTask_EveryNSamplesRead);

                    // Verify the Task
                    myTask.Control(TaskAction.Verify);

                    // Prepare the table for Data
                    InitializeDataTable(myTask.AIChannels, ref dataTable);

                    runningTask    = myTask;
                    analogInReader = new AnalogMultiChannelReader(myTask.Stream);
                    runningTask.SynchronizeCallbacks = true;

                    runningTask.Start();
                }
                catch (DaqException exception)
                {
                    // Display Errors
                    MessageBox.Show(exception.Message);
                    runningTask        = null;
                    btnStop.IsEnabled  = false;
                    btnStart.IsEnabled = true;
                }
            }
        }
Пример #10
0
        private void DaqInit()
        {
            try
            {
                daqTask  = new NationalInstruments.DAQmx.Task();
                daqTask2 = new NationalInstruments.DAQmx.Task();
                daqTask3 = new NationalInstruments.DAQmx.Task();
                daqTask.AIChannels.CreateVoltageChannel("Dev1/ai0", "", (AITerminalConfiguration)(-1), -10, 10, AIVoltageUnits.Volts);
                daqTask.AIChannels.CreateVoltageChannel("Dev1/ai1", "", (AITerminalConfiguration)(-1), -10, 10, AIVoltageUnits.Volts);
                daqTask2.AOChannels.CreateVoltageChannel("Dev1/ao0", "", -10, 10, AOVoltageUnits.Volts);
                daqTask2.AOChannels.CreateVoltageChannel("Dev1/ao1", "", -10, 10, AOVoltageUnits.Volts);
                daqTask.Timing.ConfigureSampleClock("", sampleRate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, sampleRate);
                daqTask.AIChannels.All.DataTransferMechanism = AIDataTransferMechanism.Dma;

                daqTask2.Timing.ConfigureSampleClock("", sampleRate, SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, sampleRate);
                daqTask2.AOChannels.All.DataTransferMechanism = AODataTransferMechanism.Dma;
                daqTask2.Stream.WriteRegenerationMode         = WriteRegenerationMode.DoNotAllowRegeneration;
                reader = new AnalogMultiChannelReader(daqTask.Stream);
                int inBufSize1 = sampleRate, inBufSize2 = 2 * sampleRate;

                inDriveSignal = reader.ReadWaveform(inBufSize1);

                /*fftw_plan mplan;
                 * double[] din = new double[inBufSize1];
                 * double[] freq = new double[inBufSize1*2];
                 * GCHandle hdin = GCHandle.Alloc(din, GCHandleType.Pinned);
                 * GCHandle hdout = GCHandle.Alloc(freq, GCHandleType.Pinned);
                 * fftw_complexarray min = new fftw_complexarray(din);
                 * fftw_complexarray mout = new fftw_complexarray(freq);
                 * IntPtr fplan5 = fftw.dft_r2c_1d(sampleRate, hdin.AddrOfPinnedObject(), hdout.AddrOfPinnedObject(), fftw_flags.Estimate);
                 * Array.Copy(inDriveSignal[0].GetRawData(), din, inBufSize1);
                 * fftw.execute(fplan5);
                 * measuredFreq1 = (double)Util.AbsMaxIndex(freq) / 2;*/

                /*int rem = (int)((double)(measuredFreq1 - (int)measuredFreq1) * 1000);
                 * int mul;
                 * if (rem > 0)
                 * {
                 *  mul = 1000 / (int)Integers.GCD(rem, 1000);
                 *  measuredFreq1 *= mul;
                 *
                 * }*/

                //Array.Copy(inDriveSignal[1].GetRawData(), din, inBufSize1);
                //fftw.execute(fplan5);
                //measuredFreq2 = (double)Util.AbsMaxIndex(freq) / 2;
                ZX1 = Util.GetZeroCrossings(inDriveSignal[0].GetRawData());
                ZX2 = Util.GetZeroCrossings(inDriveSignal[1].GetRawData());

                /*rem = (int)((double)(measuredFreq2 - (int)measuredFreq2) * 1000);
                 * if (rem > 0)
                 * {
                 *  mul = 1000 / (int)Integers.GCD(rem, 1000);
                 *  measuredFreq2 *= mul;
                 * }*/
                //samplePerChannel = (int)Math.Max(ch1, ch2);
                //sampleRate = 500*(int)Integers.LCM((long)measuredFreq1, (long)measuredFreq2);
                samplePerChannel = sampleRate / 25;
                daqTask2.EveryNSamplesWrittenEventInterval = samplePerChannel;
                daqTask2.EveryNSamplesWritten += daqTask2_EveryNSamplesWritten;
                writer  = new AnalogMultiChannelWriter(daqTask2.Stream);
                bufsize = sampleRate;

                waveX   = new double[180][];
                waveY   = new double[180][];
                outWave = new double[2, samplePerChannel];
                for (int i = 0; i < 180; i++)
                {
                    waveX[i] = new double[bufsize];
                    waveY[i] = new double[bufsize];
                }
                waveX[0] = inDriveSignal[0].GetRawData(0, bufsize);
                waveY[0] = inDriveSignal[1].GetRawData(0, bufsize);

                //Array.Copy(waveX[0], waveX[0].Length / 2, waveY[0], 0, waveY[0].Length / 2);
                //Array.Copy(waveX[0], 0, waveY[0], waveY[0].Length / 2, waveY[0].Length / 2);

                // initialize rotations
                for (int i = 1; i < 180; i++)
                {
                    for (int j = 0; j < bufsize; j++)
                    {
                        double theta = ((i) / 180.0) * Math.PI;
                        double x = waveX[0][j]; double y = waveY[0][j];
                        waveX[i][j] = x * Math.Cos(theta) - y * Math.Sin(theta);
                        waveY[i][j] = x * Math.Sin(theta) + y * Math.Cos(theta);
                    }
                }

                double[] X = new double[samplePerChannel];
                double[] Y = new double[samplePerChannel];

                Array.Copy(waveX[0], ZX1[1], X, 0, samplePerChannel);
                Array.Copy(waveY[0], ZX2[1], Y, 0, samplePerChannel);
                sampleIndex  = samplePerChannel;
                sampleIndex2 = samplePerChannel;
                AnalogWaveform <double>[] waves = { AnalogWaveform <double> .FromArray1D(X), AnalogWaveform <double> .FromArray1D(Y) };
                writer.WriteWaveform <double>(false, waves);
                daqTask.Timing.ConfigureSampleClock("", sampleRate, SampleClockActiveEdge.Rising, SampleQuantityMode.HardwareTimedSinglePoint, 0);
                double[] sample;
                bool     negative = false;

                daqTask2.Start();
                //daqTask2.AOChannels.All.DataTransferMechanism = AODataTransferMechanism.Dma;
                dcOffsetX = dcOffsetY = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }