webhosting by: WebSupport.sk                                             UnlimitedHosting | CustomHosting | FreeWeb.sk

Gadžety - SDS MICRO Light2

bwpow's picture

Dnešný diel seriálu venujem trochu netradičnému gadžetu, teda aspoň z pohľadu bežného ajťáka, ktorý zvykne len ťukať do klávesnice. Predstavím totiž malý PLC, ktorý môže mnohým pomocť prekonať bariéru medzi softvérovým a fyzickým svetom.

Začnem trošku netradične, príbehom. Pred nejakým časom (bolo to v stredu) sa jeden z klientov rozhodol, že chce mať pri budové platené parkovisko a samozrejme, chce to mať hotové do konca týždňa. Riešení nám napadlo niekoľko. Ako najjednoduchší spôsob sa nám pozdával systém na RFID karty, aký je použítý napríklad v Galérii v Košiciach. Po tom, ako sme obvolali možných dodávateľov a zistili, že snáď neexistuje systém, ktorý by mohol fungovať bez obsluhy, sme túto možnosť zavrhli. Vymienať karty niekoľkokrát denne je totiž megafail. Na parkovisko pri susednej budove namontovali systém na čiarové kódy vytlačené na útržky papiera, čo sa javilo ako o niečo lepšie riešenie, ale neprešiel ani týždeň a systém sa ukázal ako vrcholne nespoľahlivý. Hútali sme, hútali a vymysleli sme teda niečo takéto: Pri vstupe na parkovisko sa zosníma ŠPZ všetkých prichádzajúcich áut, zaznamená sa čas. Pri výstupe sa ŠPZ zosníma opäť a návštevníkovi sa zobrazí kód, ktorý musí poslať SMSkou na určené číslo. Po prijatí SMSky sa rampa otvorí. Aby sa zbytočne nezdržiaval pri rampe, budú v areáli rozmiestnené kiosky, ktoré mu po zadaní jeho ŠPZ tento kód prezradia a má potom 15 minút na jeho odoslanie a opustenie parkoviska. Ani tento systém nie je úplne dokonalý, ale rozhodli sme sa pre neho, lebo sa nám to zdalo cool :)

Zohnali sme teda modul, ktorý z načítaného obrazu rozoznáva ŠPZ (o tom bude článok nabudúce, keď ho poriadne otestujeme), zohnali sme spoločnosť, ktorá vie prevádzkovať platený SMS systém a pustili sme sa do montáže. Posledná vec, čo nám chýbala, bolo zariadenie, ktorým budeme vedieť fyzicky otvoriť rampu. Tá potrebuje nejaký impulz. Začali sme sa teda obzerať po zariadení, ktoré by malo aspoň dva relé výstupy a bolo ovládateľné buď cez nejaký sériový komunikačný kanál (RS485, can-bus) alebo ideálne cez ethernet. Môžete si pomyslieť, že to predsa nie je problém dať dokopy za pár minút, no dni, kedy sme si sami robili všetok hardvér, sú už dávno za nami a navyše, nebol na to ani čas. Potrebovali sme to mať bežiace čím skôr. Zachránil nás nakoniec wao, ktorý mi poslal odkaz na vecičku, ktorú budem predstavovať v tomto článočku (za čo mu nesmierne ďakujem).

Tým zariadením bolo SDS MICRO Light, ktoré presne spĺňalo to, čo sme potrebovali. Objednali sme si verziu Light2, ktorá má miesto 16K EEPROM internú 2MB dataflash, inak je totožná. Má to ethernet port a dva relé vstupy. A omnoho viac. Tu je popis možných využití z oficálnej stránky:

  • Webový teploměr pro 16 teplotních čidel
  • Možnost odečtu a sledování odběru energií a vody přes tři optické vstupy
  • Ukládání dat (naměřených teplot + spotřeby energií a vody)na webový portál + zobrazení historie a export dat do grafu
  • Ovládání dvou přídavných relé přes webové rozhraní
  • Možnost ovládání dvou relé na základě teplotních čidel
  • Sledování 4 napěťových vstupů 0-30V dc u různých zařízení
  • IP watchdog
  • Detekce výpadku 230V přes pomocné relé
  • Velkou možností je jednoduše si naprogramovat vlastní funkce využití SDS MICRO, MACRO pomocí jazyku SDS-C (typ SDS Micro light je osazen malou kapacitou paměti, proto je třeba zvážit použití modulu)

Vidno, že možných využití je neúrekom. Mňa osobne najviac potešila možnosť nahrať do modulu vlastný programček v jazyku nazvanom SDS-C (vzdialene pripomína bežné C) a tým zautomatizovať jeho chod. Na stránke výrobcu je možné nájsť kompletný popis jazyka, nejaké príklady a najnovší kompilátor+simulátor pre Microsoft Windows. Okrem toho je možné z neho čítať všetky možné stavy pomocou SNMP, sťahovaním XML súboru, texťáku, CSV, atď. Pravdu povediac, bol som z celého modulu a jeho možností veľmi nadšený. Otváranie rámp sme mali rozbehané za nejakú hodinku od vybalenia, no mne to nedalo a hral som sa s tým ďalej. Nebudem ale zbytočne viac odbiehať od témy, len poznamenám, že všetky funkcie, ktoré výrobca sľubuje, ten modul skutočne má a všetko funguje bezchybne, respektíve presne podľa popisu.

Vrátim sa teda k rampám a ich otváraniu. Potrebovali sme cez ethernet ovládať dve relátka pripojené k modulu. V podstate to išlo hneď. Modul obsahuje web rozhranie, cez ktoré sa dá nastaviť a kontrolovať všetko, čo je práve pripojené. Zopnúť a rozopnúť ich išlo obyčajným kliknutím na tlačidlo. Zo zdrojáku web stránky som vyčítal, že pri každom kliknutí je načítaná konkrétna URL s parametrami označujúcimi požadovanú akciu. Skúsil som teda niečo takéto:

curl -m1 -q -s "http://192.168.1.250/cgi_rctl?rmode=cson&rn=1"
Na moje prekvapenie, relé 1 sa zoplo. Po zadaní príkazu:
curl -m1 -q -s "http://192.168.1.250/cgi_rctl?rmode=csoff&rn=1"
sa opäť rozoplo. Skvelé. Nahodil som tieto dva riadky do skriptu na serveri, na ktorom beží celý systém. No nastal problém. Po zadaní príkazu sa mi vrátila prihlasovacia stránka a nič sa nestalo. Zadal som teda príkaz:
curl -m1 -q -s "http://192.168.1.250/cgi_login?passw=test"
Následne už predchádzajúce príkazy fungovali. Autentizácia je teda potrebná pre každú novú IP adresu, pričom klient je prihlásený len na jej základe. Žiadne koláčiky, ani nič podobné, sa nekoná. Funkcia, ktorú som napchal do systému (v php-cli) vyzerala takto a dokonca aj fungovala:

function otvor($ip,$id,$pass)
{
  $cmd=sprintf("curl -m1 -q -s \"http://%s/cgi_rctl?rmode=cson&rn=%d\"",$ip,$id);
  exec($cmd,$v,$ret);
  if($ret!=0) return false;
  $v=implode('',$v);
  if(strpos($v,'password')!==false){
    $cmd_login=sprintf("curl -m1 -q -s \"http://%s/cgi_login?passw=%s\"",$ip,$pass);
    exec($cmd_login,$v,$ret);
    if($ret!=0) return false;
    exec($cmd,$v,$ret);
    if($ret!=0) return false;
    $v=implode('',$v);
    if(strpos($v,'password')!==false) return false;
  }
  return true;
}
Samozrejme, aby rampy správne fungovali a po otvorení sa aj zatvárali, je potrebné, aby impulz trval len niekoľko desiatok milisekúnd. Čiže hneď som musel zavolať funkciu na rozopnutie. To mi ale pripadalo dosť lame, takže som sa rozhodol predsalen pozrieť do manuálu a vyskúšať to SDS-C, ktoré je všade vychvaľované. Netrvalo dlho a vypotil som krátky programček, ktorý kontroluje hodnoty v registroch, ktoré sa dajú meniť jednoducho cez HTTP GET a na ich základe potom zopne príslúšné relé, počká niekoľko milisekúnd a potom ho opäť rozopne. Celý programček je tu:

// first register (sys[] index) to control relays
#define REG_CONTROL 196
// first register (sys[] index) to set relays states
#define REG_STATE 231
// number of relays to control
#define COUNT 2
// delay to keep relay open in steps (100 steps = 1 second)
#define DELAY 150
#define UPTIME sys[3]
#define INPUT sys[140]
var i,r,t;
checkinput
{
  t=INPUT;
  if(t>0&&t<=COUNT){
    INPUT=0;
    t-=1;
    r=REG_STATE+t;
    sys[r]=1; // open relay
    ram[t]=UPTIME+DELAY; // and set time to close
    echo(UPTIME,': Opened relay ',t,' and set to be closed at ',ram[t]);
  }
}
main
{
  echo('Init for ',COUNT,' relays');
  i=0;
initloop:
  ram[i]=0; // set time to close for i-th delay to zero
//  r=REG_CONTROL+i;
//  sys[r]=16; // set control of this relay to SDS-C
  r=REG_STATE+i;
  sys[r]=0; // close relay
  i+=1;
  if(i<COUNT) goto initloop;
  echo('Init completed');
start:
  i=0;
loop:
  checkinput();
  if(ram[i]>0&&ram[i]<UPTIME){
    r=REG_STATE+i;
    sys[r]=0; // close relay
    ram[i]=0; // set time to zero (indicates, that relay is closed)
    echo(UPTIME,': Closed relay ',i);
  }
  i+=1;
  if(i>=COUNT) goto start;
  goto loop;
}
Môžete vidieť, že naozaj sa to veľmi ponáša na bežné C. Samozrejme, je tam pár obmedzení, ako absencia cyklov, všetky premenné sú statické atď. Popis celého jazyka nájdete na stránkach výrobcu, tu spomeniem len najdoležitejšie časti. Program komunikuje s hardvérom pomocou poľa sys[], ktoré má presne definované indexy pre jednotlivé rozhrania. Väčšina položiek je read-only, no do niektorých je možné aj zapisovať. Medzi zapisovateľné patria napríklad registre patriace ovládaniu relé. Prvé relé začína indexom 231. Ďalej je tam niekoľko registrov, ktoré sa dajú meniť jednoduchými HTTP GET požiadavkami. Jeden z nich je napríklad sys[140], ktorý používam v programe ako vstup. Stačí teda zavolať:
curl -m1 -q -s  "http://192.168.1.250/sdscep?sys140=1"
a sys[140] sa nastaví na hodnotu 1. Výhodou je, že hodnoty týchto pár vybraných registrov je možné meniť aj bez prihlásenia (túto funkčnosť je možné vypnúť, ak treba), takže už netreba šaškovať s prihlasovaním.

Okrem sys[] je možné v programe využiť aj pole ram[], ktoré môže slúžiť na pomocné ukladanie si premenných. Veľkosť ram[] a indexy v sys[] sa môžu meniť v závislosti od použitého zariadenia, takže na to treba trochu dávať pozor. Všetko ale pekne nájdete v dokumentácii.

V čase písania tohto článočku nám už modul SDS MICRO Light2 beží viac ako týždeň. Prežil všetky hrozné búrky, ktoré sme tu za ostatné dni mali a funguje skvele, bez jediného výpadku alebo zaseknutia. Nakoniec sa nám podarilo vymyslieť aj využitie pre ďalšie vstupy a jeho užitočnosť si nevieme vynachváliť. Ak teda potrebujete niečo ovládať alebo kontrolovať a nechcete stráviť veľa času pri skladaní si vlastného zariadenia, je táto hračka práve pre vás. Za prijateľnú cenu dostanete vynikajúcu, funkciami nabitú a kvalitnú dosku.

Užitočné linky:

Average rating
(7 votes)
webhosting by: WebSupport.sk UnlimitedHosting | CustomHosting | FreeWeb.sk