Re: Помогите с программой
От: McQwerty Россия  
Дата: 15.12.10 08:47
Оценка: 12 (1)
Здравствуйте, harold, Вы писали:

H>Это программа для ADAM-5510, система мониторинга температуры на основе 8-канального микропроцессорного модуля ADAM-5017.

H>Я закомментировал те места, где необходим реальный ADAM-5510

H>Tab[2][21] — это таблица соответствий значения кода АЦП температуре.

H>Нужно, чтобы программа брала из этой таблицы значения и выдавала температуру (например, при поступлении кода 28573 должна высветиться температура -50 градусов)
H>А если кода нет в таблице, то значение должно рассчитываться с помощью двух ближайших табличных значений (например, код 22500. 22937-22020=917. 917 разделим на 10 градусов. Получим 91.7. 22500-22020=480. 480/91.7=5.2. Так 22020 соответствует 20 градусам, то 22500 будет соответствовать 25.2 градуса.)

Восстановление температуры по коду — дело неблагодарное. ТС имеют нелинейную характеристику зависимости сопротивления от температуры (а для ТП ещё нужна и температура холодного спая).
Так что сначала из кода нужно нужно перевести в сопротивление. Потом найти отношение к сопротивлению при нуле градусов (Ro) и уже потом по табличкам типа такой:
//////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////// Таблица для платиновых ТС с W=1.3850.
///////////////////////// ТСП 50П
//////////////////////////////////////////////////////////////////////////////////////////////
const float MAP_T_R_21[_TDIAP_] = {
/*  0 */    1,    1.004,    1.008,    1.012,    1.016,    1.020,    1.023,    1.027,    1.031,    1.035,
/* 10 */    1.039,    1.043,    1.047,    1.051,    1.055,    1.059,    1.062,    1.066,    1.07,    1.074,
/* 20 */    1.078,    1.082,    1.086,    1.09,    1.094,    1.097,    1.101,    1.105,    1.109,    1.113,
/* 30 */    1.117,    1.121,    1.125,    1.128,    1.132,    1.136,    1.14,    1.144,    1.148,    1.152,
/* 40 */    1.155,    1.159,    1.163,    1.167,    1.171,    1.175,    1.179,    1.182,    1.186,    1.19,
/* 50 */    1.194,    1.198,    1.202,    1.206,    1.209,    1.213,    1.217,    1.221,    1.225,    1.229,
/* 60 */    1.232,    1.236,    1.24,    1.244,    1.248,    1.252,    1.255,    1.259,    1.263,    1.267,
/* 70 */    1.271,    1.275,    1.278,    1.282,    1.286,    1.29,    1.294,    1.298,    1.301,    1.305,
/* 80 */    1.309,    1.313,    1.317,    1.32,    1.324,    1.328,    1.332,    1.336,    1.34,    1.343,
/* 90 */    1.347,    1.351,    1.355,    1.359,    1.362,    1.366,    1.37,    1.374,    1.378,    1.381,
/*100 */    1.385,    1.389,    1.393,    1.396,    1.4,    1.404,    1.408,    1.412,    1.415,    1.419,
/*110 */    1.423,    1.427,    1.431,    1.434,    1.438,    1.442,    1.446,    1.449,    1.453,    1.457,
/*120 */    1.461,    1.464,    1.468,    1.472,    1.476,    1.48,    1.483,    1.487,    1.491,    1.495,
/*130 */    1.498,    1.502,    1.506,    1.51,    1.513,    1.517,    1.521,    1.525,    1.528,    1.532,
/*140 */    1.536,    1.54,    1.543,    1.547,    1.551,    1.555,    1.558,    1.562,    1.566,    1.57,
/*150 */    1.573,    1.577,    1.581,    1.585,    1.588,    1.592,    1.596,    1.599,    1.603,    1.607,
/*160 */    1.611,    1.614,    1.618,    1.622,    1.625,    1.629,    1.633,    1.637,    1.64,    1.644,
/*170 */    1.648,    1.651,    1.655,    1.659,    1.663,    1.666,    1.67,    1.674,    1.677,    1.681,
/*180 */    1.685,    1.689,    1.692,    1.696,    1.699,    1.703,    1.707,    1.711,    1.714,    1.718,
/*190 */    1.722,    1.725,    1.729,    1.733,    1.737,    1.74,    1.744,    1.748,    1.751,    1.755,
/*200 */    1.759,    1.762,    1.766,    1.77,    1.773,    1.777,    1.781,    1.784,    1.788,    1.792,
/*210 */    1.795,    1.799,    1.803,    1.806,    1.81,    1.814,    1.817,    1.821,    1.825,    1.828,
/*220 */    1.832,    1.836,    1.839,    1.843,    1.847,    1.85,    1.854,    1.857,    1.861,    1.865,
/*230 */    1.868,    1.872,    1.876,    1.879,    1.883,    1.887,    1.89,    1.894,    1.898,    1.901,
/*240 */    1.905,    1.908,    1.912,    1.916,    1.919,    1.923,    1.927,    1.93,    1.934,    1.937,
/*250 */    1.941,    1.945,    1.948,    1.952,    1.956,    1.959,    1.963,    1.966,    1.97,    1.974,
/*260 */    1.977,    1.981,    1.984,    1.988,    1.992,    1.995,    1.999,    2.002,    2.006,    2.01,
/*270 */    2.013,    2.017,    2.02,    2.024,    2.028,    2.031,    2.035,    2.038,    2.042,    2.046,
/*280 */    2.049,    2.053,    2.056,    2.06,    2.063,    2.067,    2.071,    2.074,    2.078,    2.081,
/*290 */    2.085,    2.088,    2.092,    2.096,    2.099,    2.103,    2.106,    2.11,    2.113,    2.117,
/*300 */    2.121,    2.124,    2.128,    2.131,    2.135,    2.138,    2.142,    2.145,    2.149,    2.153,
/*310 */    2.156,    2.16,    2.163,    2.167,    2.17,    2.174,    2.177,    2.181,    2.184,    2.188,
/*320 */    2.192,    2.195,    2.199,    2.202,    2.206,    2.209,    2.213,    2.216,    2.22,    2.223,
/*330 */    2.227,    2.23,    2.234,    2.237,    2.241,    2.245,    2.248,    2.252,    2.255,    2.259,
/*340 */    2.262,    2.266,    2.269,    2.272,    2.276,    2.280,    2.283,    2.287,    2.920,    2.294,
/*350 */    2.297,    2.300,    2.304,    2.308,    2.311,    2.315,    2.318,    2.322,    2.325,    2.329,
/*360 */    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,
/*370 */    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,
/*380 */    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,
/*390 */    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,    2.332,
/*400 */    2.332,    2.332
};

определить температуру. Между градусам, да, можно линейно интерполировать, погрешность не очень велика будет.
Таблички — из ГОСТов, Ro — из паспорта ТС.
Re[2]: Помогите с программой
От: programmater  
Дата: 16.12.10 08:53
Оценка: :)
Здравствуйте, dmitry_npi, Вы писали:
_>
_>if(Tab[i,1]>T0
_>

_>это неправильно! Так массивы в Си не индексируются (если это Си).
Ничего ты не понимаешь! У него operator[]()переопределен так, что принимает два(!) аргумента . Сразу видно что
_>Абсолютно не разбираюсь в контроллерах
Помогите с программой
От: harold  
Дата: 14.12.10 21:48
Оценка:
Это программа для ADAM-5510, система мониторинга температуры на основе 8-канального микропроцессорного модуля ADAM-5017.
Я закомментировал те места, где необходим реальный ADAM-5510

Tab[2][21] — это таблица соответствий значения кода АЦП температуре.
Нужно, чтобы программа брала из этой таблицы значения и выдавала температуру (например, при поступлении кода 28573 должна высветиться температура -50 градусов)
А если кода нет в таблице, то значение должно рассчитываться с помощью двух ближайших табличных значений (например, код 22500. 22937-22020=917. 917 разделим на 10 градусов. Получим 91.7. 22500-22020=480. 480/91.7=5.2. Так 22020 соответствует 20 градусам, то 22500 будет соответствовать 25.2 градуса.)



#include <conio.h>
#include <5510drv.h>
int *T0,*T1,*T2,*T3,*T4,*T5,*T6,*T7, i, Ntab;
float T0gr,T1gr,T2gr,T3gr,T4gr,T5gr,T6gr,T7gr;
long int Delay;
unsigned char IOModuleName;
unsigned char SlotNumber;

//float Convert(int T)
float Tab[2][21]={
{28573, 27656, 26607, 25690, 24772, 23855, 22937, 22020, 21233, 20447, 19529, 18874, 18088, 17432, 16646, 15991, 15466, 14811, 14287, 13893, 13500},
{-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150}
};
for(i=0;i<Ntab;i++)
{if(Tab[i,1]>T0)
break;

main()
{
SlotNumber=0;
IOModuleName=0x04; //Get_BoardID(SlotNumber);
if(IOModuleName!=ADAM5017_ID)
{
printf("\nProverte slot");
exit(1);
}
else{
printf("\n Inicializaciya ADAM-5017");
//Init501718(0);
}

// while(1)
{
//Get501718(0,0,T0); T0gr=Convert(T0);
//Get501718(0,1,T1); T1gr=Convert(T1);
//Get501718(0,2,T2); T2gr=Convert(T2);
//Get501718(0,3,T3); T3gr=Convert(T3);
//Get501718(0,4,T4); T4gr=Convert(T4);
//Get501718(0,5,T5); T5gr=Convert(T5);
//Get501718(0,6,T6); T6gr=Convert(T6);
//Get501718(0,7,T7); T7gr=Convert(T7);
printf("\n Temperatura gradusov=%5.1f %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f",T0gr,T1gr,T2gr,T3gr,T4gr,T5gr,T6gr,T7gr);
for(Delay=100000; Delay>0; Delay--);
}
}
return (0);
}

ОЧЕНЬ НУЖНА ПОМОЩЬ!!!
Re: Помогите с программой
От: мыщъх США http://nezumi-lab.org
Дата: 14.12.10 22:09
Оценка:
Здравствуйте, harold, Вы писали:

H>{-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150}

да... без циклов это сурово...

H>ОЧЕНЬ НУЖНА ПОМОЩЬ!!!

а где лопата?
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re: Помогите с программой
От: Chorkov Россия  
Дата: 15.12.10 08:49
Оценка:
Здравствуйте, harold, Вы писали:

H>Это программа для ADAM-5510, система мониторинга температуры на основе 8-канального микропроцессорного модуля ADAM-5017.

H>Я закомментировал те места, где необходим реальный ADAM-5510

H>Tab[2][21] — это таблица соответствий значения кода АЦП температуре.

H>Нужно, чтобы программа брала из этой таблицы значения и выдавала температуру (например, при поступлении кода 28573 должна высветиться температура -50 градусов)
H>А если кода нет в таблице, то значение должно рассчитываться с помощью двух ближайших табличных значений (например, код 22500. 22937-22020=917. 917 разделим на 10 градусов. Получим 91.7. 22500-22020=480. 480/91.7=5.2. Так 22020 соответствует 20 градусам, то 22500 будет соответствовать 25.2 градуса.)

...


H>ОЧЕНЬ НУЖНА ПОМОЩЬ!!!


1) Это язук C или C++?
2) Наколько полна поддержка языка на целевой платформе (есть ли STL и т.д., насколько встроенные библиотеки C соотвествуют стандарту?)
3) Наколько "умный" оптимизатор?
Просто фраза
  for(Delay=100000; Delay>0; Delay--);
вызывает большие сомнения — современные оптимизаторы свернут ее в одну интсрукцю и никакой задержки не будет...
4) Ты абсолютно уверен что сможешь поддерживать код, даже если его тебе напишут? Есть ли вообще опыт в программировании, пусть даже на другом языке?
Re: Помогите с программой
От: dmitry_npi Россия  
Дата: 15.12.10 17:29
Оценка:
Здравствуйте, harold,

Абсолютно не разбираюсь в контроллерах, но

float Tab[2][21]={...};
...
if(Tab[i,1]>T0


это неправильно! Так массивы в Си не индексируются (если это Си).
Атмосферная музыка — www.aventuel.net
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.