1

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 として持っています。これは、2 つの Task オブジェクトが衝突しないように、スレッドで作業しているためです。

質問が十分に明確であることを願っています。どうもありがとうございました!

4

0 に答える 0