首页 > 解决方案 > NI DAQ MAX 从 Task.CIChannels.CreateAngularEncoderChannel() 接收错误结果

问题描述

我有一个 NI DAQ:cDAQ9185-1E7661EMod1,我试图从端口 ctr1 读取它的数据作为计数器通道:AngularEncoderChannel。我正在使用 NI 的 C# api。

我收到的只是大量 0、0.36、0.72 的流(几千乘以 0,然后再增加几千次 0.36,依此类推),而我期望的值约为 2000,并且不断变化。

物理接线没问题。我运行了角度编码器示例中的代码,效果很好。我将所有任务配置更改为与示例尽可能相似,但它仍然不起作用。

我的代码:

protected ConcurrentQueue<Sample[]> _exportingQueue;
public double SampleRate { get; set; }
public NITask.Task Task { get; protected set; }
public long SampleCounter { get; set; }
private string _cPort = "cDAQ9185-1E7661EMod1/ctr1";
private NITask.CounterMultiChannelReader _reader;

public void InitializeTask()
            {
                Task = new NITask.Task(); 
NITask.CICountEdgesActiveEdge.Rising, 0, NITask.CICountEdgesCountDirection.Up);
Task.CIChannels.CreateAngularEncoderChannel(_cPort, "", NITask.CIEncoderDecodingType.X1, false, 0, NITask.CIEncoderZIndexPhase.AHighBHigh, 24, 0.0, NITask.CIAngularEncoderUnits.Degrees);

                Task.Timing.ConfigureSampleClock("", SampleRate, NITask.SampleClockActiveEdge.Rising,
                    NITask.SampleQuantityMode.ContinuousSamples, 1000);
    
                // Create a variable of type CountReader which will read the task's Stream property.
                _reader = new NITask.CounterSingleChannelReader(Task.Stream);
            }

        protected override void ReadData()
        {
            double readerData = _reader.ReadSingleSampleDouble();
            Sample[] singleSample = new Sample[1];
            singleSample[0] = new Sample(readerData, SampleCounter);
            _exportingQueue.Enqueue(singleSample);

            SampleCounter++;
        }

Sample 对象和 _exporterQueue 对于该程序的实际功能并不重要。我把它们留在这里,以防万一它们出人意料地相关。Sample 是一个具有 {double Data, and int SampleCounter} 的对象,_exportingQueue 是一个队列,用于存储样本并通过另一个线程将它们出列。此外,我还有一个 NI 的 Task 对象的别名为 NITask,只是因为我正在使用线程,这样两个 Task 对象就不会发生冲突。

我希望这个问题足够清楚。非常感谢!

标签: c#nidaqmxdaq-mx

解决方案


推荐阅读