2016-04-20 7 views
0

Я беру показания напряжения и преобразую их в показания давления. Это мой первый реальный опыт работы с C, поэтому мой код грязный, но до сих пор работал нормально. Проблема, с которой я сталкиваюсь, заключается в том, чтобы программа подсчитывала количество показаний (хранимых в данных массива [i]), которые падают между минимальным и максимальным желаемым значением.Значения доступа во внешнем генераторе

Вот код, Sum2 и количество областей, которые дают мне проблемы. Sum2 добавляет 999 значений вместо фильтрации и подсчета всегда приводит к 998, когда он должен быть ближе к 500

РЕДАКТИРОВАТЬ:

показания в данных [I] находятся под напряжением, и я работает с давлением. Моя калибровочную кривую Р = (V-2,9674) /. 404

//Voltage readings for NI USB-6009 built from the ground up 

#include "stdafx.h" 
#include "stdio.h" 
#include "NIDAQmx.h" 
#include "math.h" 
#include "tdmwriter.h" 
#include "fundtypes.h" 
#include "platdefines.h" 



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

int main(void) 
{ 
    int32  error = 0; 
    TaskHandle taskHandle = 0; 
    int32  read; 
    float64  data[1000], Sum=0, Average, Variance, Deviation=0, std_dev, min=0, max=0, num=0, avg=0, minP=0, maxP=0, avgP=0, avgP2=0, minP2=0, maxP2=0, minV=0, maxV=0, avgV=0, Sum2 = 0; 
    char  errBuff[2048] = { '\0' }; 
    int   i, count = 0; 

    /*********************************************/ 
    // DAQmx Configure Code 
    /*********************************************/ 
    DAQmxErrChk(DAQmxCreateTask("Pressure Voltage\n", &taskHandle)); 
    DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai0", "", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL)); 
    DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", 100.0, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, 1000)); 

    /*********************************************/ 
    // DAQmx TDMS Configure Code 
    /*********************************************/ 
    DAQmxErrChk(DAQmxConfigureLogging(taskHandle, "C:\\TestData\\LogFile.tdms", DAQmx_Val_LogAndRead, "ECS Test Data", DAQmx_Val_OpenOrCreate)); 
    //DAQmxWriteAnalogF64(taskHandle,1000, 1 /*autoStart*/, -1 /*timeout*/, DAQmx_Val_GroupByScanNumber, data, 1000, NULL); 

    /*********************************************/ 
    // DAQmx Start Code 
    /*********************************************/ 
    DAQmxErrChk(DAQmxStartTask(taskHandle)); 
    printf("Voltage due to Pressure:\n"); 
    printf("\n"); 
    printf("Recording Data...\n"); 
    DAQmxErrChk(DAQmxWaitUntilTaskDone(taskHandle, 10.0)); 


    /*********************************************/ 
    // DAQmx Read Code 
    /*********************************************/ 
    DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &read, NULL)); 

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


    /*********************************************/ 
    //Display Values 
    /*********************************************/ 
    printf("\n"); 
    printf("values:\n"); 
    printf("Voltage 1= %f\n",data[10]); 
    printf("Voltage 2= %f\n", data[100]); 
    printf("Voltage 3= %f\n", data[200]); 
    printf("Voltage 4= %f\n", data[300]); 
    printf("Voltage 5= %f\n", data[400]); 
    printf("Voltage 6= %f\n", data[500]); 
    printf("Voltage 7= %f\n", data[600]); 
    printf("Voltage 8= %f\n", data[700]); 
    printf("Voltage 9= %f\n", data[800]); 
    printf("Voltage 10= %f\n", data[900]); 
    printf("\n"); 

    //for (int i = 1; i < 1000; i++) { 
    // printf("Voltage %i= %f\n",i, data[i]); 
    //} 
    //printf("\n"); 

    /*********************************************/ 
    //Average Values 
    /*********************************************/ 
    for (i = 1; i < 999; ++i) { 
     Sum = Sum + data[i]; 
    } 

    Average = (Sum/999); 
    printf("Average= %f\n", Average); 


    /*********************************************/ 
    //Standard Deviation 
    /*********************************************/ 
    for (i = 1; i < 999; ++i) { 
     Deviation = Deviation + pow((Average - data[i]), 2); 
    } 

    Variance = Deviation/999; 
    printf("Variance= %f\n", Variance); 

    std_dev = sqrt(Variance); 
    printf("Standard Deviation= %f\n", std_dev); 

    printf("\n"); 


    /*********************************************/ 
    //Min and Max Values 
    /*********************************************/ 

    { 
     max = fmax(data[2], data[999]); 
    } 
    { 
     min = fmin(data[2], data[999]); 
    } 

    printf("Min: %f\n", min); 
    printf("Max: %f\n", max); 
    printf("Log File located in C:\\TestData. Please rename LogFile.tdms after testing\n"); 
    printf("\n"); 


    /*********************************************/ 
    //Convert to Pressure Readings 
    /*********************************************/ 
    printf("Pressure Readings (inches H2O):\n"); 
    { 
     minP = (min - 2.9674)/.404; 
     maxP = (max - 2.9674)/.404; 
     avgP = (Average - 2.9674)/.404; 
    } 
    printf("Min Pressure: %f\n", minP); 
    printf("Max Pressure: %f\n", maxP); 
    printf("Average Pressure: %f\n", avgP); 
    printf("\n"); 


    /*********************************************/ 
    //New Voltage and Pressure Averages 
    /*********************************************/ 
    {//target min and max pressure 
     minP2 = avgP - (avgP/10); 
     maxP2 = avgP + (avgP/10); 
    } 
    {//target min and max voltage 
     minV = (minP2*.404) + 2.9674; 
     maxV = (maxP2*.404) + 2.9674; 
    } 
    {//Sum of values in desired range 
     for (i = 1; i < 999; ++i) { 
      if (minV < data[i] && data[i] < maxV); { Sum2 = Sum2 + data[i]; } 
    } 
    } 
    {//Number of values in desired range 
     for (i = 1; i < 999; i++) 
     { 
      if (minV < data[i] && data[i] < maxV); 
      { 
       count++; 
      } 
     } 
    } 
    {//New average voltage 
     avgV = Sum2/count; 
    } 
    {//New average pressure 
     avgP2 = ((avgV - 2.9674)/.404); 
    } 
    printf("Adjusted Values:\n"); 
    printf("Min P2= %f\n", minP2); 
    printf("Max P2= %f\n", maxP2); 
    printf("Min Voltage= %f\n", minV); 
    printf("Max Voltage= %f\n", maxV); 
    printf("Sum Voltage= %f\n", Sum2); 
    printf("Count= %d\n", count); 
    printf("AvgV= %f\n", avgV); 
    printf("AvgP= %f\n", avgP2); 


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; 
} 
+0

Вы должны исправить свой отступ, чтобы сделать его более читаемым. У вас также есть скобки, которые не требуются. Обязательно используйте пробелы, а не вкладки. – sabbahillel

ответ

0

С равен нулю индекс, чтобы вы были пропуск первого значения каждый раз, когда, который может или не может дать плохое значение. Дополнительные скобки заставили вас пропустить настройку условного правильного. Я отметил плохое; с комментарием, чтобы вы могли его увидеть.

sum2 = 0; // not needed since initialized above 
count = 0; // not needed since initialized above 
for (i = 0; i < 999; ++i) 
{ 
    if ((minV < data[i]) && (data[i] < maxV)) // ; messed up and forced code to execute 
    // Extra parens are just for readability 
    { 
     //Sum of values in desired range 
     Sum2 += data[i]; 
     //Number of values in desired range 
     count++; 
    } 
} 
0

Вы ошибочный ; после следующих строк

if (minV < data[i] && data[i] < maxV); 

и

if (minV < data[i] && data[i] < maxV); 

Это вызывает следующий блок кода, который всегда выполняется, так как ; создает «DO- ничего "кода.

EDIT: вы также делаете неправильный расчет для minV и maxV? Что они имеют к давлению?

minV = (minP2*.404) + 2.9674; 
maxV = (maxP2*.404) + 2.9674; 

Возможно, это выводит данные из их диапазона, поскольку цикл не может поймать какие-либо значения.

+0

Удаление ';' приводит к подсчету и сумме Zero – NikMif

+0

В этом случае еще что-то еще. Как вы сказали, «Sum2 добавляет 999 значений вместо фильтрации», и именно поэтому. –

+0

Возможно, это связано с тем, что перед тестированием данных против них вы играете с 'minV' и' maxV'. –

 Смежные вопросы

  • Нет связанных вопросов^_^