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; } }
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); } }
/// <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; } } } }
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; }
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"); }
/// <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); } }
/// <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; } } } }
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; } }
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; } } }
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); } }