Digital I/O

cancel
Showing results for 
Search instead for 
Did you mean: 

[C#] Digital Edge counting, Linear position, Read Buffered

Hello,

I'm trying to read buffered data from a NI USB-6210.

My goal is to sample the linear position(edge count) and the time the edge occurred.
For the time I use the internal sample clock.

But I don't get it to work. What am I doing wrong?


Thanks for your help!

My code for now:

*******************************************************

namespace LinearPositioningBuffered
{

    public partial class MainWindow : Window
    {
        private Task aiTask;
        private Task counterTask;
        private Task runningTask;
        private CounterReader counterInReader;
        private AnalogMultiChannelReader reader;
        private AsyncCallback asyncCB;

        private double[] data;
        private int BufferSize;

        public MainWindow()
        {
            InitializeComponent();
            uxStopButton.IsEnabled = false;
            asyncCB = new AsyncCallback(CounterInCallback);
        }


        private void ReadChannelBuffered()
        {         
            int sampleRate = 1000;
            BufferSize = sampleRate * 10;
            bool zIndexEnable = false;
            double zIndexValue = 0;
            double intialPosition = 0;
            double distPerPulse = 1;
            try
            {
                aiTask = new Task();
                // create a channel
                aiTask.AIChannels.CreateVoltageChannel("dev2/ai0", "", (AITerminalConfiguration)(-1), -5, 5, AIVoltageUnits.Volts);

                // Configure timing specs    
                aiTask.Timing.ConfigureSampleClock("", sampleRate, SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, 2000);

                // Verify the task
                aiTask.Control(TaskAction.Verify);
              
                counterTask = new Task();

                counterTask.CIChannels.CreateLinearEncoderChannel("dev2/ctr1", "LinearPosition", CIEncoderDecodingType.X1,
                    zIndexEnable, zIndexValue, CIEncoderZIndexPhase.AHighBLow, distPerPulse, intialPosition, CILinearEncoderUnits.Meters);
                
                //Configure timing
                counterTask.Timing.ConfigureSampleClock("/dev2/ai/SampleClock", 0, SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, BufferSize);
                counterTask.Control(TaskAction.Verify);

                runningTask = counterTask;
                counterInReader = new CounterReader(counterTask.Stream);
                counterInReader.SynchronizeCallbacks = true;

                counterInReader.BeginReadMultiSampleDouble(BufferSize, asyncCB, counterTask);

                // Read the data
                reader = new AnalogMultiChannelReader(aiTask.Stream);
                reader.ReadSingleSample();

                uxStartButton.IsEnabled = false;
                uxStopButton.IsEnabled = true;

            }
            catch (DaqException exception)
            {
                counterTask.Dispose();
                runningTask = null;
                MessageBox.Show(exception.Message, "ReadChannelBuffered");
            }        
        }

        
        private void CounterInCallback(IAsyncResult ar)
        {
            try
            {
                if (runningTask == ar.AsyncState)
                {
                    data = counterInReader.EndReadMultiSampleDouble(ar);
                    for (int idx = 0; idx < data.Length; idx++)
                    {
                        Console.WriteLine(string.Format("{0}: {1}", idx, data[idx]));
                    }
                    counterInReader.BeginReadMultiSampleDouble(BufferSize, asyncCB, counterTask);
                }
            }
            catch (DaqException exception)
            {
                MessageBox.Show(exception.Message, "CounterInCallback");
                Stop();
            }
        }

        private void Stop()
        {
            runningTask = null;
            counterTask.Dispose();
            uxStartButton.IsEnabled = true;
            uxStopButton.IsEnabled = false;
        }

        private void uxStartButton_Click(object sender, RoutedEventArgs e)
        {
            ReadChannelBuffered();
        }

        private void uxStopButton_Click(object sender, RoutedEventArgs e)
        {
            Stop();
        }        
    }
}

0 Kudos
Message 1 of 1
(5,164 Views)