Measurement Studio for VC++

cancel
Showing results for 
Search instead for 
Did you mean: 

NIDAQ returns erroneous values when measering multiple channels

Hello,

 

I'm trying to measure with K-thermocouples with the NI USB-9213 that is hooked to a NI cDAQ-9174. I'm measuring multiple channels continiously. However when I pass a certain amount of a channels (more than 8 channels simultaniously) it returns erroneous values at some indices of the acquired data array. Usually its 2292 degrees Celsius while it should be around 20 - 25 degrees Celsius. When I measure with 8 channels it works flawlessly. I call the function that I use to measure with:

contSampleThermocouple("Dev2/ai0:11", 12, 1, 5, 0.0, 300.0, "test");

 The code of the function is given below.

 

#include <stdio.h>
#include "NIDAQmx.h"
#include "mylib.h"

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

int32 CVICALLBACK EveryNCallbackThermocouple(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
int32 CVICALLBACK DoneCallbackThermocouple(TaskHandle taskHandle, int32 status, void *callbackData);

// Global variables
int		numberOfChannelsGlobalThermocouple,
		measurementCounterThermocouple = 0;
float64	sampleRateGlobalThermocouple,
		sampsPerChanGlobalThermocouple;
char	*fileNameGlobal;


int contSampleThermocouple(char *channels, int numberOfChannels, int sampleRate, int sampsPerChan, float64 minVal, float64 maxVal, char *fileName)
{
	int32       error = 0;
	TaskHandle  taskHandle = 0;
	char        errBuff[2048] = { '\0' };

	// Set globial variables
	numberOfChannelsGlobalThermocouple = numberOfChannels;
	sampleRateGlobalThermocouple = sampleRate;
	sampsPerChanGlobalThermocouple = sampsPerChan;
	fileNameGlobal = fileName;

	/*********************************************/
	// DAQmx Configure Code
	/*********************************************/
	DAQmxErrChk(DAQmxCreateTask("", &taskHandle));
	DAQmxErrChk(DAQmxCreateAIThrmcplChan(taskHandle, channels, "", minVal, maxVal, DAQmx_Val_DegC, DAQmx_Val_K_Type_TC, DAQmx_Val_BuiltIn, 25.0, ""));
	DAQmxErrChk(DAQmxSetChanAttribute(taskHandle, "", DAQmx_AI_AutoZeroMode, DAQmx_Val_EverySample));
	DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", (float64)sampleRate, DAQmx_Val_Rising, DAQmx_Val_ContSamps, (float64)sampsPerChan));

	DAQmxErrChk(DAQmxRegisterEveryNSamplesEvent(taskHandle, DAQmx_Val_Acquired_Into_Buffer, (uInt32)sampsPerChan, 0, EveryNCallbackThermocouple, NULL));
	DAQmxErrChk(DAQmxRegisterDoneEvent(taskHandle, 0, DoneCallbackThermocouple, NULL));

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

	printf("Acquiring samples continuously. Press Enter to interrupt\n");
	getchar();

Error:
	if (DAQmxFailed(error))
		DAQmxGetExtendedErrorInfo(errBuff, 2048);
	if (taskHandle != 0) {
		/*********************************************/
		// DAQmx Stop Code
		/*********************************************/
		DAQmxStopTask(taskHandle);
		DAQmxClearTask(taskHandle);
	}
	if (DAQmxFailed(error))
		printf("DAQmx Error: %s\n", errBuff);
	printf("End of program, press Enter key to quit\n");
	getchar();
	return 0;
}

int32 CVICALLBACK EveryNCallbackThermocouple(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{
	int32       error = 0;
	char        errBuff[2048] = { '\0' };
	static int  totalRead = 0;
	int32       read = 0;
	float64     data[60];
	// Fill data array with -1000
	for (int i = 0; i < 60; i++)
	{
		data[i] = -1000;
	}

	/*********************************************/
	// DAQmx Read Code
	/*********************************************/
	DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, -1, 10.0, DAQmx_Val_GroupByScanNumber, data, 60, &read, NULL));
	if (read > 0)
	{
		writeToCsv(data, fileNameGlobal, "temperature", "AI", "a", numberOfChannelsGlobalThermocouple, sampleRateGlobalThermocouple, sampsPerChanGlobalThermocouple, measurementCounterThermocouple);
		measurementCounterThermocouple++;
		printf("Acquired %d samples. Total %d\r", read, totalRead += read);
		fflush(stdout);
	}

Error:
	if (DAQmxFailed(error)) {
		DAQmxGetExtendedErrorInfo(errBuff, 2048);
		/*********************************************/
		// DAQmx Stop Code
		/*********************************************/
		DAQmxStopTask(taskHandle);
		DAQmxClearTask(taskHandle);
		printf("DAQmx Error: %s\n", errBuff);
	}
	return 0;
}

int32 CVICALLBACK DoneCallbackThermocouple(TaskHandle taskHandle, int32 status, void *callbackData)
{
	int32   error = 0;
	char    errBuff[2048] = { '\0' };

	// Check to see if an error stopped the task.
	DAQmxErrChk(status);

Error:
	if (DAQmxFailed(error)) {
		DAQmxGetExtendedErrorInfo(errBuff, 2048);
		DAQmxClearTask(taskHandle);
		printf("DAQmx Error: %s\n", errBuff);
	}
	return 0;
}

 Does anyone know why it is showing this behaviour, because I am clueless.

 

 

With kind regards,

 

Yami_Bas

0 Kudos
Message 1 of 1
(5,165 Views)