Function PHP
Conversion résistance (Ω) d'une RTD Pt100 en °C
function temp_res_rtd($rt,$coef="E",$mode=3,$change=true) {
// Calcul de la température à partir de la valeur ohmique d'une RTD DIN 43760
// 100 ohms à 0 °C - Coefficient alpha = 0.00385 ohms/ohm/°C
// $rt = Valeur ohmique de la RTD à t °C
// $coef = "E" pour Européen : 0.003850 ohms/ohm/°C
// "A" pour Américain : 0.003926 ohms/ohm/°C
// $mode = 1 Entre 0°C et 100°C par la formule simplifiée :
// T = ((Rt/R0)-1)/alpha;
// Si température < 0° ou > 100 °C, on passe en $mode=2
//
// 2 Équation réciproque de Calendar-Van Dusen
// T = (-Ro*A + racine(Ro^2*A^2 - 4*Ro*B*(Ro-Rt)) / 2*Ro*B
// A = 3.9083e-3 B = -5.775e-7 pour coef E
// 3.9848e-3 -5.870e-7 .... .... A
// Si température négative, on procède par approximations successives
//
// 3 Par interpolation de second ordre dans une table de 40 éléments
// entre -219.415 et + 883.582 °C (10 à 400 ohms) Précision +/- 0.003 °C
//
// $change = true Changement de mode autorisé (par défaut)
// false Pas de changement de mode
// Teste si $ohm comporte une virgule et, si oui, remplacement par un point
$pos=strpos($rt,",");
if ($pos !== false) $t=substr_replace($rt,".",$pos,1);
// Teste si $ohm est de format numérique
if (!is_numeric($rt)) {
$t="Erreur :<br>".$rt." nombre non valide";
return $t;
}
$coef=mb_strtoupper($coef);
if ($coef=="E") {
$alpha=0.003850; // Coefficient de température ohm/ohm/degré
$coef_a=3.9083e-3; // Coefficient A
$coef_b=-5.775e-7; // Coefficient B
$coef_c=-4.183e-12; // Coefficient C
$r0=100; // Valeur ohmique à 0 degré C
}
elseif ($coef=="A") {
$alpha=0.003926;
$coef_a=3.9848e-3;
$coef_b=-5.870e-7;
$coef_c=-4.0000e-12;
$r0=100;
}
else {
$t="Erreur :<br>Apha=".$coef." doit être E ou A";
return $t;
}
// Test des limites pour la valeur ohmique
$lol=10;
$upl=400;
if ($rt<$lol or $rt>$upl) {
$t="Erreur :<br>".$lol." Ω à ".$upl." Ω";
return $t;
}
switch ($mode) {
case 1:
$t = (($rt/$r0)-1)/$alpha;
if (!$change) break;
if ($t>0 and $t<100) break;
case 2:
$t = (-($r0*$coef_a) + sqrt((pow($r0,2)*pow($coef_a,2))
-(4*($r0*$coef_b)*($r0-$rt))))/(2*$r0*$coef_b);
if ($t<0) {
//Calcul par approximations successives si température négative
//Approximation initiale : T1=((Rt/Ro)-1)/(A+100B)
//Suivantes :
// ((1+A.T[n] + B.T[n]^2 + C.T[n]^3 * (T[n]-100) - (Rt/Ro))
// $a1 $bt $ct $trt
// T[n+1] = T[n] - --------------------------------------------------------
// (A + 2B.T[n] - 300C.T[n]^2 + 4C.T[n]^3)
// $b2 $c300 $c4
// Décomposé, pour augmenter la précision des calculs
$ta[0]=(($rt/$r0)-1)/($coef_a+$coef_b*100);
for($i=1;$i<10;$i++) {
$a1=1+$coef_a*$ta[$i-1];
$bt=$coef_b*pow($ta[$i-1],2);
$ct=$coef_c*pow($ta[$i-1],3);
$trt=($ta[$i-1]-100);
$c4=4*$coef_c*pow($ta[$i-1],3);
$c300=300*$coef_c*pow($ta[$i-1],2);
$b2=$coef_a + 2*$coef_b*$ta[$i-1];
$ta[$i]=$ta[$i-1]-(($a1+$bt+($ct*$trt)-($rt/$r0))/($b2-$c300+$c4));
if ($ta[$i]==$ta[$i-1]) {
$t=$ta[$i];
break;
}
}
}
if (!$change) break;
case 3: // Interpolation dans une table - (index * 10)
// donne valeur ohmique RTD et contenu = Température en °C
$ta[1]=-219.415;
$ta[2]=-196.509;
$ta[3]=-173.118;
$ta[4]=-149.304;
$ta[5]=-125.122;
$ta[6]=-100.617;
$ta[7]=-75.827;
$ta[8]=-50.781;
$ta[9]=-25.501;
$ta[10]=0.000; // 100 ohms = 0 degré
$ta[11]=25.686;
$ta[12]=51.571;
$ta[13]=77.660;
$ta[14]=103.958;
$ta[15]=130.469;
$ta[16]=157.198;
$ta[17]=184.152;
$ta[18]=211.336;
$ta[19]=238.756;
$ta[20]=266.419;
$ta[21]=294.330;
$ta[22]=322.498;
$ta[23]=350.928;
$ta[24]=379.628;
$ta[25]=408.635;
$ta[26]=437.889;
$ta[27]=467.445;
$ta[28]=497.309;
$ta[29]=527.489;
$ta[30]=557.993;
$ta[31]=588.831;
$ta[32]=620.014;
$ta[33]=651.554;
$ta[34]=683.464;
$ta[35]=715.758;
$ta[36]=748.453;
$ta[37]=781.453;
$ta[38]=815.110;
$ta[39]=849.109;
$ta[40]=883.582;
//Si valeur inférieure à 20 ohms, (index=2) calcul interpolation de premier ordre
//sinon, calcul interpolation second ordre
$index=(int) ($rt/10);
$frac=($rt/10)-$index;
$a=$ta[$index];
if ($index==$rt/10) {
return $ta[$index];
break;
}
if ($index==1) {
$b=$ta[$index+1];
$t=$a + $frac*($b-$a);
}
else {
$b=$ta[$index+1]/2;
$c=$ta[$index-1]/2;
$t=$a + $frac*($b-$c + $frac*($c+$b-$a));
}
break;
default:
$t="Mode ".$mode." inconnu (1,2 ou 3)";
return $t;
break;
}
return $t;
}
Function PHP
Conversion °C en résistance (Ω) d'une RTD Pt100
function res_temp_rtd($t,$coef,$mode) {
// Calcul de la résistance d'une RTD DIN 43760 à partir de la température
// 100 ohms à 0 °C - Coefficient alpha = 0.00385 ohms/ohm/°C
// $t = Valeur de la température en °C
// $coef = "E" pour Européen : 0.00385 ohms/ohm/°C
// "A" pour Américain : 0.00392 ohms/ohm/°C
// $mode = Type de calcul
// 1 pour équation : Rt°C = Ro°C * (1 + (Alpha*t°C)
// 2 Équation de Calendar-Van Dusen
// Rt = Ro*(1 + AT + BT^2 + C(T^4 - 100*T^3)) si T < 0
// = Ro*(1 + AT + BT^2) si T > 0
// 3 Table par dichotomie et interpolation
// Teste si $t comporte une virgule et, si oui, remplacement par un point
$pos=strpos($t,",");
if ($pos !== false) $t=substr_replace($t,".",$pos,1);
// Teste si $t est de format numérique
if (!is_numeric($t)) {
$ohm="Erreur :<br>".$t." nombre non valide";
return $ohm;
}
// Test des limites pour la température
$lol=-219.415;
$upl=883.582;
if ($t<$lol or $t>$upl) {
$ohm="Erreur :<br>".$lol." °C à ".$upl." °C";
return $ohm;
}
if (mb_strtoupper($coef)=="E") {
$alpha=0.00385;
$coef_a=3.90830e-3;
$coef_b=-5.77500e-7;
$coef_c=-4.18301e-12;
$r0=100;
}
elseif (mb_strtoupper($coef)=="A") {
$alpha=0.00392;
$coef_a=3.9848e-3;
$coef_b=-5.870e-7;
$coef_c=-4.18301e-12;
$r0=100;
}
else {
$ohm="Erreur :<br>Alpha doit être E ou A";
return $ohm;
}
switch ($mode) {
case 1:
$ohm = $r0*(1+($alpha*$t));
return $ohm;
break;
case 2: // Calendar-Van Dusen
if ($t>0) $ohm = $r0*(1 + $coef_a*$t + $coef_b*pow($t,2));
elseif ($t<0) $ohm = $r0*(1 + $coef_a*$t + $coef_b*pow($t,2)
+ $coef_c*(pow($t,4) - 100*pow($t,3)));
else $ohm=$r0;
return $ohm;
break;
case 3: // Interpolation dans une table - (index * 10)
// donne valeur ohmique RTD et contenu = Température en °C
$ta[1]=-219.415;
$ta[2]=-196.509;
$ta[3]=-173.118;
$ta[4]=-149.304;
$ta[5]=-125.122;
$ta[6]=-100.617;
$ta[7]=-75.827;
$ta[8]=-50.781;
$ta[9]=-25.501;
$ta[10]=0.000; // 100 ohms = 0 degré
$ta[11]=25.686;
$ta[12]=51.571;
$ta[13]=77.660;
$ta[14]=103.958;
$ta[15]=130.469;
$ta[16]=157.198;
$ta[17]=184.152;
$ta[18]=211.336;
$ta[19]=238.756;
$ta[20]=266.419;
$ta[21]=294.330;
$ta[22]=322.498;
$ta[23]=350.928;
$ta[24]=379.628;
$ta[25]=408.635;
$ta[26]=437.889;
$ta[27]=467.445;
$ta[28]=497.309;
$ta[29]=527.489;
$ta[30]=557.993;
$ta[31]=588.831;
$ta[32]=620.014;
$ta[33]=651.554;
$ta[34]=683.464;
$ta[35]=715.758;
$ta[36]=748.453;
$ta[37]=781.453;
$ta[38]=815.110;
$ta[39]=849.109;
$ta[40]=883.582;
// Recherche dichotomique dans le tableau $ta[]
$coef_index=10; // Numéro index = valeur ohmique/10
$premier=1;
$dernier=count($ta); // Nombre d'éléments du tableau
do {
$ptr=(int) (($dernier+$premier)/2);
if ($t==$ta[$ptr]) {
$ohm=$ptr*$coef_index; // Égalité parfaite
return $ohm;
break;
}
if ($t > $ta[$ptr]) $premier=$ptr;
else $dernier=$ptr;
}
while (($premier != $dernier) && ($dernier-$premier != 1));
// Égalité non trouvée - Calcul par interpolation
if ($t > $ta[$ptr]) {
$inf=$ta[$ptr];
$sup=$ta[$ptr+1];
$ptr_inf=$ptr;
}
else {
$inf=$ta[$ptr-1];
$sup=$ta[$ptr];
$ptr_inf=$ptr-1;
}
$diff=$t-$inf;
$diff_1pas=$sup-$inf;
$ohm=($ptr_inf+($diff/$diff_1pas))*$coef_index;
return $ohm;
break;
default:
$ohm="Erreur :Mode ".$mode." inconnu";
return $ohm;
break;
}
return $ohm;
}