1

Python と DAQmx Base を使用してアナログ入力を記録し、USB 6009 デバイスからアナログ出力を生成しようとしています。私は見つけたラッパーを使用しており、AI を取得できましたが、AO に苦労しています。タスクの生成などを処理する基本クラス NITask があります。私が呼び出しているクラスは以下のとおりです。クロックを設定しようとすると、関数がエラーをスローします。エラーが発生しない場合でも、出力に電圧が発生しません。どんな助けでも大歓迎です。

ありがとう!

class AOTask(NITask):
    def __init__(self, min=0.0, max=5.0,
                 channels=["Dev1/ao0"],
                 timeout=10.0):
        NITask.__init__(self)

        self.min = min
        self.max = max
        self.channels = channels
        self.timeout = timeout
        self.clockSource ="OnboardClock"
        sampleRate=100
        self.sampleRate = 100
        self.timeout = timeout
        self.samplesPerChan = 1000
        self.numChan = chanNumber(channels)

        if self.numChan is None:
            raise ValueError("Channel specification is invalid")

        chan = ", ".join(self.channels)


        self.CHK(self.nidaq.DAQmxBaseCreateTask("",ctypes.byref(self.taskHandle)))
        self.CHK(self.nidaq.DAQmxBaseCreateAOVoltageChan(self.taskHandle, "Dev1/ao0", "", float64(self.min), float64(self.max), DAQmx_Val_Volts, None))
        self.CHK(self.nidaq.DAQmxBaseCfgSampClkTiming(self.taskHandle, "", float64(self.sampleRate), DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, uInt64(self.samplesPerChan)))

    """Data needs to be of type ndarray"""
    def write(self, data):
        nWritten = int32()
      #  data = numpy.float64(3.25)
        data = data.astype(numpy.float64)
        self.CHK(self.nidaq.DAQmxBaseWriteAnalogF64(self.taskHandle,
            int32(1000), 0,float64(-1),DAQmx_Val_GroupByChannel,
            data.ctypes.data,None,None))
      #  if nWritten.value != self.numChan:
      #  print "Expected to write %d samples!" % self.numChan
4

1 に答える 1

1

あなたの質問は2つの問題をカバーしています:

  1. DAQmxBaseCfgSampClkTimingがエラーを返すのはなぜですか?
  2. その関数を使用しないと、出力が生成されないのはなぜですか?

1. ハードウェアとソフトウェアのタイミング

rjb3 さんが書きました:

クロックを設定しようとすると、関数がエラーをスローします。エラーが発生しない場合でも、出力に電圧が発生しません。

USB 600x デバイスはハードウェア タイミングのアナログ出力をサポートしていないため、プログラムはエラーを受け取ります [1]。

NI USB-6008/6009 には、0 ~ 5 V の出力を生成できる 2 つの独立したアナログ出力チャンネルがあります。アナログ出力チャンネルのすべての更新は、ソフトウェアタイミングで行われます。GND は、アナログ出力チャネルのグランド基準信号です。

「ソフトウェア タイム」とは、サンプルDAQmxBaseWriteAnalogF64が呼び出されるたびにプログラムによってオンデマンドで書き込まれることを意味します。サンプルの配列が書き込まれる場合、その配列は一度に 1 つずつ書き込まれます。NI がタイミングを定義する方法の詳細については、DAQmx ヘルプ [2] を参照してください。そのドキュメントは DAQmx 用ですが、同じ概念が DAQmx Baseに適用されます。これは、動作がデバイスのドライバーではなくデバイスによって定義されるためです。違いは、ハードウェアの機能のどれだけがドライバーによって実装されるかです。DAQmx はすべてを実装しますが、DAQmx Base は小さな選択サブセットです。

2.ソフトウェアタイミングで出力されない

rjb3 さんが書きました:

エラーが発生しない場合でも、出力に電圧が発生しません。

私は DAQmx ベース API の Python バインディングに精通していませんが、次の 2 つのことをお勧めします。

  1. インストールされたgenVoltage.cC の例を使用してみて、ao チャネルに電圧が表示されることを確認してください。
    • 例は次の場所にインストールされます。/Applications/National Instruments/NI-DAQmx Base/examples
    • 出力が表示された場合は、デバイスとドライバーが正しく動作していること、およびバグが python ファイルにある可能性が高いことが確認されています。
    • 出力が表示されない場合は、デバイスまたはドライバに問題があります。トラブルシューティングのヘルプを得るのに最適な場所は、http://forums.ni.comの NI ディスカッション フォーラムです。
  2. genVoltage.cPython バインディングを使用して移植してみてください。一見すると、私は試してみます:
    • DAQmxBaseStartTask前に使用DAQmxBaseWriteAnalogF64
    • またはautostart、呼び出しのパラメーターDAQmxBaseWriteAnalogF64を trueに設定します。

参考文献

[1] NI USB-6008/6009 ユーザガイドと仕様 :: アナログ出力(16 ページ)
http://digital.ni.com/manuals.nsf/websearch/CE26701AA052E1F0862579AD0053BE19

[2]タイミング、ハードウェア対ソフトウェア
http://zone.ni.com/reference/en-XX/help/370466V-01/TOC11.htm

于 2014-10-05T17:40:37.977 に答える