Příklady obsluhy HW CFox, CIB, teplota 08.02.2020 17:55 14.02.2020 12:03

Další příklad je možno najít pod odkazem Počítání lidí a průměrovaná teplotní mapa se senzorem C-IF-6400R Grid-Eye.

Princip a zpracování:

V příkladu byl použit modul C-IF-6400R vybavený senzorem Grid-EYE, jedná se o 64 přesných tepelných senzorů uspořádaných v matici 8x8. Poskytuje data teplotní mapy v pozorovacím úhlu 60 stupňů, horizontálně i vertikálně. Umožňuje měření 1x nebo 10x na sekundu. Konfigurace se provádí ve vývojovém prostředí Mosaic, přesněji v nástroji I/O Configurator. Modul předává informace ze senzoru pomocí 3 parametrů – INDEX, REF a TEMP. INDEX definuje řádek (1 až 8), REF referenční teplotu a TEMP (8x teplota v desetinách stupně) rozdíl teplot jednotlivých snímačů od referenční teploty REF. K výsledné teplotě segmentu se dopracujeme pomocí vzorce: 

Tabulka základních parametrů modulu: catalog.tecomat.cz/produkt/c-if-6400r



 

Senzor C-IF-6400R byl připojen k PLC Foxtrot pomocí rozhraní CIB, dále byl v zapojení pouze 24V zdroj MW DR-60-24 pro napájení PLC (senzor je napájen přímo z CIB).

Podle katalogového listu, výše uvedeného vzorce a dalších informací o senzoru byl nejdříve sestaven algoritmus pro výpočet teploty měřené každým segmentem. To tvoří v programu největší část textu, jelikož bylo třeba rozepsat program pro každý řádek segmentů.

První část jednoduše porovnává teplotu segmentu s hraniční teplotou temp_trig, pokud je tato teplota překročena, segment se zbarví červeně, pokud ne, je zbarven do modra. Hraniční teplotu lze nastavit ve webovém rozhraní. Mapa segmentů je ve webovém rozhraní napravo od ovládacích prvků. Tato mapa je dále použita při detekci osob.

Možné teploty (vzhledem k možným výstupům a měření) byly rozděleny do několika intervalů, kterým byly přiděleny hodnoty 0 – 7, podle kterých byla nastavena barva segmentů (vícestavový obrázek) ve webovém rozhraní, které tvoří menší mapu napravo. Bílá značí nejteplejší, fialová nejchladnější. Jelikož jsem nenašel normu, barvy jsou pouze orientační. Tato mapa je pouze 6x6 (chybí okraje), jelikož by došlo k překročení možného počtu proměnných ve webovém rozhraní.

Osoba je detekována v případě 2 aktivních segmentů nad sebou, tedy když teplota těchto dvou segmentů překročí tu hraniční. Tento výběr byl zvolen dle výsledků několika měření.

Další část programu ověřuje, zda se člověk nachází na pravé nebo levé straně snímaného pole. Podle toho se rozsvítí příslušný indikátor ve webovém rozhraní.

Ve výsledném programu se na počátku zadají souřadnice okrajů oblasti, ve které se bude zjišťovat přítomnost člověka. Souřadnice jsou zadány pořadovým číslem rohového segmentu, pořadí vrcholů ABCD (corn_a, corn_b,…) je dáno standardním značením vrcholů obdélníků v geometrii, tedy proti směru hodinových ručiček, začínaje levým dolním rohem.

Program nejprve načte teploty, porovná je s hraniční a vytvoří teplotní mapu. Tuto teplotní mapu potom zkoumá cyklem FOR a hledá 2 aktivní segmenty nad sebou (původně byly 3, ale to nebylo funkční pro větší vzdálenost). Pokud nalezne alespoň jednu dvojici, rozsvítí se led dioda na senzoru a ve web. rozhraní se rozsvítí také indikace vpravo/vlevo. Následně se zjistí, zda se daná trojice segmentů nachází ve vyhrazené zóně, nebo ne. Pokud ano, hodnota in_zone se nastaví na 1.

Proměnné led, right, left, in_zone se po pár sekundách po nastavení 1 nastaví zpět na 0, pokud nebude nalezena dvojice aktivních segmentů.

Pokud je v mapě detekována osoba, ale zůstane mimo vyhrazené pole přibližně 10s, rozsvítí se oranžová indikace WARN, kterou je poté třeba ručně resetovat. Tato funkce se spína přepínačem nalevo od WARN.

Webové rozhraní:

  • Hraniční teplota – teplota, při které se aktivuje jeden segment, teplota je optimálně určena po odzkoušení v daném prostředí
  • Hranice zóny – čtyři „souřadnice“ určující obdélník, ve kterém bude vyžadována přítomnost člověka, musí být zvoleny tak, aby strany obdélníku byly vertikálně a horizontálně, souřadnice jsou dány pořadovým číslem rohového segmentu
  • Tlačítko Potvrdit – odešle nově zadané hranice zóny
  • LED – indikuje přítomnost člověka, odpovídá stavu diody umístěné na senzoru
  • LFT/RGHT – indikace přítomnosti člověka v levé/pravé polovině mapy
  • ZONE – indikace přítomnosti člověka ve vyhrazené zóně
  • OFF/ON – spínač funkce varování přítomnosti osoby mimo zónu
  • WARN – aktivuje se při delší přítomnosti člověka mimo vyhrazenou zónu
  • RESET – resetuje WARN do nuly

Absence člověka před senzorem

 

Člověk stojící blízko před senzorem

 

Zapnutí detekce člověka mimo zónu a rozsvícená detekce WARN

Kód:

PROGRAM prgMain
 VAR
  i            : INT;
  j            : INT;
  left, right  : BOOL := 0;
  led_delay    : INT := 0;
  temp         : ARRAY [1..64] of REAL;
  help         : ARRAY [1..8]  of REAL;
  temp_1Wx     : REAL;
  temp_avg     : REAL;
  presence     : ARRAY [1..64] of BOOL;
  present      : BOOL := 0;
  color_temp   : ARRAY [1..64] of INT;
  temp_trig    : REAL := 22.2;
  temp_lvl     : ARRAY [0..7] of REAL := [22.2,22.5,22.7,23.0,23.2,23.5,23.7,24.0];
  warn_on      : BOOL := 0;
 
  // poloha obdelnikove zony - obdelnik ABCD od leveho dolniho rohu
  corn_a       : INT := 36;
  corn_b       : INT := 37;
  corn_c       : INT := 13;
  corn_d       : INT := 12;

  //rozmery
  a,b          : INT;
  in_zone      : BOOL:= 0;
  warn         : BOOL:= 0;
  warn_delay   : INT := 0;

 END_VAR

 //vypocet obdelniku
 b := (corn_a - corn_d)/8 + 1;
 a := (corn_b - corn_a) + 1;

 //ukladani teploty do mapy
 FOR i := 0 to 7 do
   help[i+1] := SINT_TO_REAL(col[i]);
 END_FOR;

 IF line = 0 then
   FOR i := 1 to 8 do
     temp[i] := help[i] / 10.0 + ref;
     IF temp[i] <= temp_lvl[0] then
       color_temp[i] := 0;
     ELSIF temp[i] >= temp_lvl[7] then
       color_temp[i] := 7;
     END_IF;
     FOR j := 1 to 6 do
       IF temp[i] = temp_lvl[j] then
         color_temp[i] := j;
       END_IF;
     END_FOR;
   END_FOR;

 ELSIF line = 1 then
   FOR i := 1 to 8 do
     temp[i+8] := help[i] / 10.0 + ref;
     IF temp[i+8] <= temp_lvl[0] then
       color_temp[i+8] := 0;
     ELSIF temp[i+8] >= temp_lvl[7] then
       color_temp[i+8] := 7;
     END_IF;
     FOR j := 1 to 6 do
       IF temp[i+8] = temp_lvl[j] then
         color_temp[i+8] := j;
       END_IF;
     END_FOR;
   END_FOR;

 ELSIF line = 2 then
   FOR i := 1 to 8 do
     temp[i+16] := help[i] / 10.0 + ref;
     IF temp[i+16] <= temp_lvl[0] then
       color_temp[i+16] := 0;
     ELSIF temp[i+16] >= temp_lvl[7] then
       color_temp[i+16] := 7;
     END_IF;
     FOR j := 1 to 6 do
       IF temp[i+16] = temp_lvl[j] then
         color_temp[i+16] := j;
       END_IF;
     END_FOR;
   END_FOR;

 ELSIF line = 3 then
   FOR i := 1 to 8 do
     temp[i+24] := help[i] / 10.0 + ref;
     IF temp[i+24] <= temp_lvl[0] then
       color_temp[i+24] := 0;
     ELSIF temp[i+24] >= temp_lvl[7] then
       color_temp[i+24] := 7;
     END_IF;
     FOR j := 1 to 6 do
       IF temp[i+24] = temp_lvl[j] then
         color_temp[i+24] := j;
       END_IF;
     END_FOR;
   END_FOR;
   
 ELSIF line = 4 then
   FOR i := 1 to 8 do
     temp[i+32] := help[i] / 10.0 + ref;
     IF temp[i+32] <= temp_lvl[0] then
       color_temp[i+32] := 0;
     ELSIF temp[i+32] >= temp_lvl[7] then
       color_temp[i+32] := 7;
     END_IF;
     FOR j := 1 to 6 do
       IF temp[i+32] = temp_lvl[j] then
         color_temp[i+32] := j;
       END_IF;
     END_FOR;
   END_FOR;


 ELSIF line = 5 then
   FOR i := 1 to 8 do
     temp[i+40] := help[i] / 10.0 + ref;
     IF temp[i+40] <= temp_lvl[0] then
       color_temp[i+40] := 0;
     ELSIF temp[i+40] >= temp_lvl[7] then
       color_temp[i+40] := 7;
     END_IF;
     FOR j := 1 to 6 do
       IF temp[i+40] = temp_lvl[j] then
         color_temp[i+40] := j;
       END_IF;
     END_FOR;
   END_FOR;
 ELSIF line = 6 then
   FOR i := 1 to 8 do
     temp[i+48] := help[i] / 10.0 + ref;
     IF temp[i+48] <= temp_lvl[0] then
       color_temp[i+48] := 0;
     ELSIF temp[i+48] >= temp_lvl[7] then
       color_temp[i+48] := 7;
     END_IF;

     FOR j := 1 to 6 do
       IF temp[i+48] = temp_lvl[j] then
         color_temp[i+48] := j;
       END_IF;
     END_FOR;
   END_FOR;
 ELSIF line = 7 then
   FOR i := 1 to 8 do
     temp[i+56] := help[i] / 10.0 + ref;
     IF temp[i+56] <= temp_lvl[0] then
       color_temp[i+56] := 0;
     ELSIF temp[i+56] >= temp_lvl[7] then
       color_temp[i+56] := 7;
     END_IF;
     FOR j := 1 to 6 do
       IF temp[i+56] = temp_lvl[j] then
         color_temp[i+56] := j;
       END_IF;
     END_FOR;
   END_FOR;
 END_IF;

 //hledání a označení segmentů s vyšší než hraniční teplotou
 FOR i := 1 to 64 do
   IF temp[i] >= temp_trig then
     presence[i] := 1;
   ELSIF temp[i] < temp_trig then
     presence[i] := 0;
   END_IF;
 END_FOR;

 FOR i := 1 to 48 do
   //pouze aktivni 3 segmenty nad sebou se pocitaji jako pritomnost cloveka
   // => eliminace ruseni/anomalii/proudeni vzduchu
   IF presence[i] AND presence[i+8] then 
     led := 1;
     present := 1;

     //rozdeleni na pravou a levou stranu
     IF (i >= 1 AND i <= 4) OR (i >= 9 AND i <= 12) OR (i >= 17 AND i <= 20) OR  
        (i >= 25 AND i <= 28) OR (i >= 33 AND i <= 36) OR (i >= 41 AND i <=44) OR (i >= 49 AND i <=52) then
        left := 1;
     ELSE 
        right := 1;
     END_IF;

     //detekce osoby ve vyhrazenem poli
     FOR j := 0 to (b-2) do
       IF (i >= corn_d + 8*j) AND (i <= corn_c + 8*j) then
          in_zone := 1;
          EXIT;
       END_IF;
     END_FOR;
   END_IF;
 END_FOR;

 IF led_delay > 300 then
   led := 0;
   led_delay := 0;
   left := 0;
   right := 0;
   in_zone := 0;
 END_IF;

 IF led then
   led_delay := led_delay + 1;
 END_IF;

 IF present AND (not in_zone) AND warn_on then
   warn_delay := warn_delay + 1;
   IF warn_delay >= 1000 then //priblizne 10 sekund
     warn := 1;               //rozsviti se warn
     warn_delay := 0;
   END_IF;
 ELSE
   warn_delay := 0;
 END_IF;

 present := 0;
END_PROGRAM

Připojené dokumenty