Velleman PCS10: Měření ostrovní fotovoltaiky na Linuxu.

Home Assistant, Arduino, SDS, Raspberry, Linux, vzdálený dohled, automatizace, měření, opensource, closedsource, hotová řešení, DIY, stavebnice, komponenty, software, postupy, návody, schémata, rady, zkušenosti ...
Odpovědět
Uživatelský avatar
mypower.cz
R.I.P.
Příspěvky: 4927
Registrován: pát bře 04, 2011 11:36 am
Reputace: 521

Velleman PCS10: Měření ostrovní fotovoltaiky na Linuxu.

Příspěvek od mypower.cz »

S dovolením si dovoluji "přetisknout" svůj vlastní článek z blogu na http://www.abclinuxu.cz, který se týká měření mého ostrovního FV a způsobu vykreslování grafů na http://www.mypower.cz. Třeba se to bude i tady hodit. Pod původním článkem je velice zajímavá diskuze, doporučuji taky pročíst.

Velleman PCS10: Měření ostrovní fotovoltaiky na Linuxu.

Není tomu tak dávno, kdy jsem byl postaven do situace si nějak zajistit elektrickou energii pro svou domácnost. Obec mi z důvodů, po kterých jsem raději ani nepátral, nevydala stavební povolení pro přivedení přípojky odbornou firmou. Vyřešil jsem to tedy ostrovním hybridním fotovoltaickým systémem. Pro řešení budoucí plné automatizace fotovoltaického systému jsem potřeboval nahlédnout na chování systému a tedy začít pozorně sledovat jeho provoz v průběhu času.

První částí měření systému je měření napětí na fotovoltaických panelech, které zásobují domácnost elektrickou energií a také dobíjejí baterie, když svítí během dne slunce. Na základě měření napětí na bateriích pak lze odhadnout zbývající kapacitu baterií, které zásobují elektrickou energií domácnost během noci, nebo když je zataženo. Díky měření napětí na bateriích lze také rozpoznat dobíjení z alternativního zdroje, tedy v mém případě benzinové elektrocentrály. Ta je v provozu v případě, že fotovoltaika nemá kde brát energii, což se pochopitelně častěji stane v zimě, kdy jsou jasné slunečné dny spíše vyjímkou, nebo když je déle zataženo.

Pro měření jsem vybral produkt Velleman PCS10, což je čtyřkanálový datalogger s komunikací přes USB pro měření napětí v několika rozsazích. Pro mé potřeby je využit měřící rozsah 0 - 30V. Dva kanály slouží pro měření napětí na oddělených větvích baterií, které jsou celkem dvě, 200Ah a 400Ah. Zbývající dva kanály slouží pro měření napětí na fotovoltaických panelech, které s východem slunce stoupne z nuly na provozní napětí a se západem opět klesne na nulu. Rozsah měření modulu Velleman PCS10 je v základním stavu po zapnutí 0 - 30V a výsledky měření modul odesílá na USB port jednou za 10 ms, což znamená 100 vzorků měření na kanál za sekundu. Měří se současně všechny 4 vstupní kanály.

Jak už to tak bývá, pro PCS10 je plná podpora jen pro Windows, což se právě teď pokouším změnit. Na CD dodávaném s PCS10 je .DLL knihovna pro vývoj vlastních aplikací, což je perfektní. Pod Wine na Linuxu se mi ale nepodařilo rozchodit USB podporu tak, aby si DLL dokázalo na USB porty skrze wine sáhnout. Z tohoto důvodu jsem začal jako naprostý "Linux-USB-BFU.deb" zkoumat jak komunikovat s USB zařízením na Linuxu přímo. Linux je systém, který mi plně vyhovuje a proto jeho volba i v tomto případě.

Linux (u mě konkrétně distribuce Ubuntu ve verzi 10.10) umožňuje komunikaci s USB rozhraním velmi jednoduše pomocí zařízení zvaného /dev/usb/hiddevX, nebo /dev/hidrawX. Při testování jsem na některých PC (kupodivu stejná verze Ubuntu, tedy i kernelu a plně zaktualizováno) narazil na problémy při čtení ze zařízení hiddev. Zařízení po nějakém čase z pro mě dosud neznámých důvodů přestalo posílat data a bylo nutno provést čtení nové, které se ale také po čase z ničeno nic zastavilo. Vygooglil jsem, že to je díky tomu, že kernel z nějakého důvodu zařízení zresetuje a v tom okamžiku se čtení dat ze zařízení blokne. U zařízení typu hidraw jsem tento problém nepozoroval.

Jelikož mám rád PHP, napsal jsem si v tomto jazyce dvě jednoduché funkce. Jedna má za úkol najít na USB zařízení typu hidraw s ID 10cf:8047, což je stavebnice modulu Velleman PCS10 pod označením K8047. ID 10cf jsou produkty společnosti Velleman. Pokud je zařízení nalezeno, pak druhá uvedená funkce načte 1600 bajtů z tohoto zařízení. PCS10 posílá sekvence osmi bajtů. Formát je

Kód: Vybrat vše

TT TT CH1 CH2 CH3 CH4 00 00
TT TT = LSB a MSB hodnota časovače na interním PIC obvodu, který je jádrem PCS10.
CH1 - CH4 = výstupní hodnoty z osmibitových A/D převodníků. 0 = 0V, 255 = 30V, nebo mimo rozsah.

Dva poslední bajty jsou dle dokumentace rezervovány.

Kód: Vybrat vše

#!/usr/bin/php
<?
 
// -------------------------------------------
   function Velleman_FindUSBDevice()
// -------------------------------------------
{
$ret=false;
if (is_array($qx=glob("/sys/bus/usb/drivers/usbhid/*:*")))
  {
  reset($qx);
  while ($cc=each($qx))
    {
    if ((is_dir($qd=$cc["value"])) and
        (is_file($qf=$qd."/uevent")) and
        ($qf=file_get_contents($qf)))
      {
      $qq=explode("\n",$qf);
      reset($qq);
      while ($cc=each($qq))
        {
        $cx=explode($ch="=",$cc["value"]);
        $qk=array_shift($cx);
        $qv=implode($ch,$cx);
        if (($qk=="PRODUCT") and
            ($cx=explode("/",$qv)) and
            ($cx[0].":".$cx[1]=="10cf:8047"))
          {
          ob_start();system($qc="ls ".$qd."/*/hidraw/");$xout=ob_get_clean();
          if ($qx=file_exists($udev="/dev/".array_shift(explode("\n",$xout))))
            {
            echo "Velleman found at ".$udev."\n";
            $ret=$udev;
            break;
            }
          }
        }
      }
    if ($ret) break;
    }
  }
return $ret;
}
 
// -------------------------------------------
   function Velleman_ReadVoltage()
// -------------------------------------------
{
$ret=array();
if ($udev=Velleman_FindUSBDevice())
  {
  $seconds=2;
  $qdata=array();
  $chsum=array();
  $bytes=800*$seconds;
  echo "Reading ".$bytes." bytes from USB recorder.\n";
  $cdata=file_get_contents($udev,false,null,-1,$bytes);
  $qd=array();
  while($cdata!="")
    {
    $qxx=substr($cdata,0,8);
    $cdata=substr($cdata,8);
    if (strlen($qxx)==8)
      {
      $chsum[1][]=$ch1=ord($qxx[2]);
      $chsum[2][]=$ch2=ord($qxx[3]);
      $chsum[3][]=$ch3=ord($qxx[4]);
      $chsum[4][]=$ch4=ord($qxx[5]);
      $qdata[($qxx[1]<<8)+$qxx[0]]=array(
        "ch1"=>$ch1,
        "ch2"=>$ch2,
        "ch3"=>$ch3,
        "ch4"=>$ch4,
        );
      }
    }
  $chout=array();
  for ($ii=1;$ii<=4;$ii++)
    {
    $qc=count($chsum[1]);
    $qk="ch".$ii;
    $qv=0;
    if ($qc>0) $qv=30/255*array_sum($chsum[$ii])/$qc;
    $chout[$qk]=$qv;
    }
  $ret=$chout;
  }
else
  echo "No Velleman USB Recorder found.\n";
return $ret;
}
 
// example
$data=Velleman_ReadVoltage();
var_dump($data);
 
?>
Jelikož mě zajímá dlouhodobý průběh v čase, spouštím měření jednou za 2 minuty. Jak jsem již výše uvedl, načte se 1600 bajtů, což znamená 8 bajtů * 2 sekundy x 100 mereni = 8 x 2 x 100 = 1600. Načtených 200 měření zprůměruji a vrátím výsledek. Data předávám vynikajícímu nástroji pro kreslení grafů s názvem rrdtool. Výsledek pak vypadá například takto, konkrétně se jedná o první graf s názvem FV Voltage.

K automatizaci mi tedy už zbývá jen měření proudu, které lze řešit obdobně odpovídajícími proudovými senzory (hallova sonda) s převodem proud - napětí a opět Velleman PCS10

Hope it helps!

Odpovědět
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek