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