c# - 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# - C#:如何以原子方式从内存读取/写入 IntPtr?
- css - 带有 npm 的 Node Sass CSS 导入器
- android - 从谷歌驱动器获取图像时位图返回空
- javascript - 如何访问数字的前两位数字
- python - 如何在熊猫数据框的第二行添加列标题?
- css - 我们可以使用 CSS 为椭圆形添加刻度吗?
- docker - Harbor 注册表安装/升级
- sql-server - sp_send_dbmail 在循环中执行时出错
- scala - 我如何使用 GroupBy 而不是 Map over Dataset?
- ios - PWA 上 iPhone X 上的白色状态栏