1

Cプログラムを介してNI USB-6211に電圧入力を読み取ろうとしています。そのために、インストールされたプログラムに付属のサンプル プログラムをいくつか使用してみましたが、役に立ちませんでした。私はドキュメントを見てきましたが、正直なところ、まったく役に立ちません。

これは私が適応したコードです。(チェックイン中にエラーが発生し、入力を求められます...)

/*********************************************************************
*
* ANSI C Example program:
*    Acq-IntClk.c
*
* Example Category:
*    AI
*
* Description:
*    This example demonstrates how to acquire a finite amount of data
*    using the DAQ device's internal clock.
*
* Instructions for Running:
*    1. Select the physical channel to correspond to where your
*       signal is input on the DAQ device.
*    2. Enter the minimum and maximum voltages.
*    Note: For better accuracy try to match the input range to the
*          expected voltage level of the measured signal.
*    3. Select the number of samples to acquire.
*    4. Set the rate of the acquisition.
*    Note: The rate should be AT LEAST twice as fast as the maximum
*          frequency component of the signal being acquired.
*
* Steps:
*    1. Create a task.
*    2. Create an analog input voltage channel.
*    3. Set the rate for the sample clock. Additionally, define the
*       sample mode to be finite and set the number of samples to be
*       acquired per channel.
*    4. Call the Start function to start the acquisition.
*    5. Read all of the waveform data.
*    6. Call the Clear Task function to clear the task.
*    7. Display an error if any.
*
* I/O Connections Overview:
*    Make sure your signal input terminal matches the Physical
*    Channel I/O Control. For further connection information, refer
*    to your hardware reference manual.
*
*********************************************************************/

#include <stdio.h>
#include <NIDAQmx.h>
#include <string.h>

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int main(void)
{
    int32       error=0;
    int32       amount; 
    int32       i;
    TaskHandle  taskHandle=0;
    int32       read;
    float64     data[1000];
    char        errBuff[2048]={'\0'};
    char        c = 64;

    /*********************************************/
    // DAQmx Configure Code
    /*********************************************/

    printf("Please enter the amount of voltage checks you wish to run.\n");
    //scanf("%d", &amount);

    while(scanf("%d%c", &amount, &c) !=2)
    {
        getchar();
        puts("Please enter a number.");
    }
    for (i = 0; i < amount; i++)
    {
        DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
        DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,1.0,10.0,DAQmx_Val_Volts,NULL));
        DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000));

        /*********************************************/
        // DAQmx Start Code
        /*********************************************/
        DAQmxErrChk (DAQmxStartTask(taskHandle));

        /*********************************************/
        // DAQmx Read Code
        /*********************************************/

        DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,data,1000,&read,NULL));

        printf("Acquired %d points\n",read);


Error:
        if( DAQmxFailed(error) )
            DAQmxGetExtendedErrorInfo(errBuff,2048);
        if( taskHandle!=0 )
        {
            /*********************************************/
            // DAQmx Stop Code
            /*********************************************/
            DAQmxStopTask(taskHandle);
            DAQmxClearTask(taskHandle);
            printf("Updating... ");
        }
    }

    if(i=amount)
    {
        printf("End of Program, press the Enter key to quit\n");
        getchar();      
        if( DAQmxFailed(error) )                
            printf("DAQmx Error: %s\n",errBuff);
    }       
    return 0;
}

この時点でコードが実行しているのは、1000 という数字を出力することだけです。私はそれがこのコードから来ていると確信しています: float64 data[1000];. 直接電圧を読み取る方法について知っている人はいますか? フォーマットされていない単なる長い数字の文字列であっても(私はそれを理解できます)。

ありがとう

4

1 に答える 1

2

表示される数値1000は、 への呼び出しの 2 番目と 7 番目のパラメーターから取得されますDAQmxReadAnalogF64()。2 番目のパラメーターは、取得する各チャンネルのサンプル数を示します。Sevent パラメータ ( &read) は、チャネルごとに実際に取得されたサンプル数の結果を格納する場所を指示します。つまり、1000 を要求して 1000 を取得しました。

あなたのプログラムは、読み込まれたデータを印刷していませDAQmxReadAnalogF64()data.

その呼び出しの後、次のようなものを使用して電圧を印刷できます。

for (int i = 0; i < read; i++)
{
    printf("Data point %d has value %f\n",i, data[i]);
}

それは明らかに1000個の値すべてを出力しますが、これはおそらくあなたが望むものではありません.

NI ライブラリのコードを作成する場合は、NI-DAQmx C リファレンス ヘルプで関数とそのパラメータの説明を参照してください。彼らにはたくさんのマニュアルがあり、それを見逃すのは簡単です。例は通常、適応するのも非常に簡単です。

于 2013-08-14T11:33:37.780 に答える