我有一个 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 对象就不会发生冲突。
我希望这个问题足够清楚。非常感谢!