Forum Italiano sui Prodotti NI

annulla
Visualizzazione dei risultati per 
Cerca invece 
Intendevi dire: 

Problemi con calcolo di array in CVI

Ciao a tutti, dopo qualche anno di utilizzo di CVI, quanto mi sta succedendo è veramente incredibile.
Ho messo qui sotto una function richiamata dal mio main tramite un timer che batte ogni decimo di secondo: il suo scopo è quello di acquisire un tot di dati in n array per poi mediarli (si tratta in realtà di pseudo codice per non appesantire la lettura.

int CVICALLBACK TimerGlobale (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
    int     i;
    
    switch (event)
        {
        case EVENT_TIMER_TICK:
            if (++contatore_array >= DIMENSIONE_ARRAY_DATI) contatore_array = 0;
            for (i=CH_TEMPERATURA_1; i<=ULTIMO_CANALE; i++)
                {
                AI_VReadChannel (card_num, i, &dati_provini[i][contatore_array]);
                dati_provini[i][contatore_array] = parametri_rette[2*i]*CALCOLA_TEMPERATURA (dati_provini[i][contatore_array])+parametri_rette[2*i+1];
                Mean (dati_provini[i], DIMENSIONE_ARRAY_DATI, &dati_medi[i]);
                }
            break;
        }
    return 0;
}

Ho messo in neretto la riga incriminata.
La variabile array parametri_rette contiene la a e la b delle rette di taratura dei vari canali, mentre la macro CALCOLA_TEMPERATURA serve solo per trasformare i volt letti dalla funzione di acquisizione nei gradi centigradi effettivi.
Ho provato a mettere nella watch window l'intera espressione e i singoli dati dell'operazione e ottengo situazioni paradossali del tipo:

parametri_rette[2*i] = 1.042
CALCOLA_TEMPERATURA (dati_provini[i][contatore_array]) = 10.6
parametri_rette[2*i+1] = -3.019
dati_provini[i][contatore_array] = 9.11
mentre il risultato dell'operazione è circa 8.02!!!!
La cosa ancora più sorprendente è che questa anomalia si presenta solo per i=0....
Qualcuno sa aiutarmi? Magari c'è un baco grosso come una casa, ma ormai non riesco più a vederlo...

Grazie

Ciao

Andrea

0 Kudos
Messaggio 1 di 2
3.578Visualizzazioni

Ciao Andrea,

scusami per la risposta tardiva. Il comportamento che descrivi è effettivamente strano; ho provato a riprodurre uno schema general del tuo programma nel seguente modo:

  1. #define di una macro generica (m*x + b), con a e b costanti e x variabile;
  2. calcolo iterativo di questa macro per un certo numero di iterazioni all'interno di un for loop;
  3. Inserimento, all'interno della watch window, delle variabili usata per il calcolo iterato;

I risulati che ottengo sono quelli desiderati; a questo punto vorrei farti un paio di domande:

I valori che hai segnalato in grassetto a che punto dell'esecuzione sono stati ottenuti? E' possibile, e vorrei avere anche la tua conferma, che il  valori:

parametri_rette[2*i] = 1.042
CALCOLA_TEMPERATURA (dati_provini[i][contatore_array]) = 10.6
parametri_rette[2*i+1] = -3.019
dati_provini[i][contatore_array] = 9.11

siano relativi a risultati ottenuti da iterazioni differenti e quindi qualcuno di loro non sia stato ancora aggiornato nella watch window; ad esempio il valore di una generica macro MACRO(x,y) viene aggiornato non appena un valore della sua espressione varia mentre una variabile associata alla macro tramite la linea di comando:

variabile = MACRO (x,y)

viene aggiornata solo dopo che l'istruzione è stata eseguita.

Spero di aver capito il problema, fammi sapere se questa può essere una possibile spiegazione.

Ciao,

Fabio

Fabio M.
NI
Principal Engineer
0 Kudos
Messaggio 2 di 2
3.540Visualizzazioni