Jste zde

LABJACK U3 – KROK ZA KROKEM III

Mnoho činností, které jsme v minulých dvou dílech prováděli, je možné vykonávat tak, jako jsme to dělali – vizuálně (k dispozici jsme měli ovládací prvky a těmi jsme měnili parametry našeho LABJACKu.) Je tu však i jiná možnost – použití skriptů. Právě předem připravené skripty teprve ukazují, jaké možnosti LABJACK poskytuje.

Úvodem

Přestože vizuální návrh aplikace pro využití vlastností LABJACKu umožňuje uživateli vytvořit rychle a téměř bezchybně prostředí pro jednoduchá měření, je skriptování mnohdy jedinou možností, jak přistupovat k některým periferiím, jako jsou například čítače/časovače, komunikační bloky a mnohé další. Při možnosti krokování skriptů pak nabízejí nenahraditelnou možnost jak ladit vaše analogové či digitální obvody.

Skriptování je možné využít v mnoha oblastech. Nejjednodušší možností, jak si skriptování vyzkoušet, je měření analogových a digitální vstupů. To si v průběhu dnešního dílu samozřejmě ukážeme. Hlavní využití skriptů ale nalezneme v tzv SEKVENCÍCH. Sekvence je samostatná část kódu pracující na pozadí nebo jako součást jiné sekvence. Protože je možné ji spustit na pozadí, je také možné vytvořit a spustit sekvencí několik, zatímco zbytek LABJACKu provádí zadané úkony.

Uvedeme si jednoduchý příklad. Máme jednu funkci (sekvenci), která každých 30s kontroluje digitální vstupy a na základě kombinace těchto vstupů řídí jiný digitální výstup. Zárověň jednou za hodinu odesílá e-mail, jehož obsahem je záznam stavů digitálních vstupů a digitálního výstupu za uplynulou hodinu. Tuto úlohu je možné realizovat jednou sekvencí (funkcí), ale je také možné vytvořit sekvence 2. Jednu pro kontrolu vstupů a řízení výstupu a jednu pro odesílání logu. Funkce se vzájemně neovlivňují a mohou běžet na pozadí současně.

S prvním skriptem do světa

Abychom nezačínali úplně od začátku, budeme vycházet z příkladu uvedeném v minulém díle. Připomenu, že jsme využívali DA převodník na výstupu DAC0, logický vstup na IO svorce FIO2 a logický výstup (například relé) na svorce FIO1. Snad nejjednodušším skriptem je nastavení analogového nebo digitálního výstupu.

  1. Vytvoříme novou sekvenci – SEQUENCE – Add Sequence a pojmenujeme sekvenci jako setAnalogOUT.
  2. Jako text sekvence vložíme jediný řádek: Output = 2
  3. Sekvenci zkompilujeme a uložíme kliknutím na tlačítko „Apply & Compile“
  4. Ve WORKSPACE se nám objeví nová položka s názvem sekvence.
  5. Spustit jí lze klinutím pravého tlačítka a volbou Begin Sequence.

Spuštěním skriptu by se analogový výstup (pokud jste použili příklad z minulého dílu) měl nastavit na 2 volty. Stejně tak je možné nastavovat digitální výstupy. Ale ani čtení vstupů není nijak obtížné. Přidáním následujícího řádku: Rele = Input[0] se při každém spuštění skriptu nastaví výstup Rele podle vstupu Input.

Mimo hodnot vlastních kanálů lze samozřejmě využívat vlastních proměnných, například pro ukládání kalibračních konstant nebo mezivýsledků. Prvním krokem při využití proměnných je jejich deklarace. DAQFactory v tomto případě nabízí 2 typy proměnných, řetězce a čísla. Z těchto proměnných je samozřejmě také možné vytvářet pole. Uvedeme si několik příkladů deklarace proměnných v prostředí DAQFactory:

global napeti  // globalni ciselna promenna
private proud  // privatni ciselna promenna

// globalni retezcova promenna
global string retezec = "Globalni retezec"
// privatni retezcova promenna
private string privatni_retezec = "Privatni retezec"

Význam klíčových slov:

  • global – klíčové slovo pro veřejné proměnné užívané v celém DAQFactory. Globálními proměnnými jsou například kanály a nebo LABJACKID. Přístup k nim není nijak omezen.
  • private - proměnné využitelné pouze ve skriptu, kde jsou deklarovány. Jejich využití je především v oblasti čítačů smyček a podobně. Je doporučováno využívat privátní proměnné, jak to jen jde.
  • local – tyto proměnné budou vysvětleny později. Využívají se především v uživatelských aplikacích a protokolech
  • static – obdobné jako private, rozdíl je v tom, že jejich obsah se po restartu skriptu nemění.
  • Registry – umožňuje ukládat data do registrů Windows. Má svá omezení, bude podrobněji popsáno v průběhu seriálu.

Volání funkcí

DAQFactory nabízí velké množství předpřipravených funkcí zjednodušujících práci při vytváření skriptů. Ať už jde o jednoduché matematické funkce ,jako například výpočet sinu, kosinu, nebo složitější funkce pro odesílání e-mailů. Dostupnost funkcí závisí na druhu použitého zařízení. Například pro LABJACK U3 nedisponuje funkcemi pro práci v síti. Mimo připravených funkcí lze samozřejmě vytvářet i vlastní. To umožňuje volat sekvence s parametry:

function fceCompare(v)
   private result = 0
   if (v > 1.5) 
      result = 1
   else
      result = 0
   endif   
return (result)

Funkci je opět možné nejrychleji vyzkoušet v okně Alert/Command zápisem: „? fceCompare(1)”. V tomto případě funkce vrátí nulu. V případě, že zapisujeme funkci s více parametry, oddělují se čárkou.

Podmínky, cykly

Výše uvedená funkce obsahovala podmínku if. V prostředí DAQFactory musí být vždy tato podmínka ukončena klíčovým slovem endif. Ovšem nepoviná je větev else. V příkladu by ji bylo možné zcela vypustit, protože již na začátku je proměnná result vynulována a na hodnotu 1 je nastavena pouze tehdy, je-li vstupní hodnota vyšší 1.5 . Následující řádky ukazují využití podmínky if (převzato z aplikační příručky DAQFactory:

if (Pressure[0] > 5)
   Out = 3
else
   Out = 4
endif


if (Pressure[0] > 5)
   Out = 3
   Valve = 1
Endif


if (Pressure[0] > 5)
   Out = 3
   if (Temperature[0] < 80)
      Valve = 1
   else
      Valve = 0
   endif
else
   Out = 4
endif

Ve skriptech nám jistě příjdou vhod také cykly a zpoždění. Jedním z použitelných je v prostředí DAQFactory cyklus while. Velmi často ho lze nalézt v nekonečných smyčkách ve tvaru while(1). Vzhledem k tomu, že veškeré procesy běží na pozadí, je to jedna z možností, jak si zajistit několik naráz běžících nekonečných cyklů například pro kontrolu vstupních svorek, cyklické ovládání výstupů a nebo pravidelné měření analogových veličin.

function fceInputCheck()
   while (Input[0] > 0)
      ? "Hrozi prehrati"
      delay(1)
   endwhile

Výše uvedená funkce demonstruje příklad využití cyklu while při zjištění vysoké teploty. Cyklus bude trvat tak dlouho, dokud nebude vstup nulový. Funkce může být spouštěna samozřejmě z jiné sekvence. Mezi jednotlivými výpisy v okně COMMAND/ALERT je zpoždění 1s (funkce delay).

Zajímavým příkladem je také využití nekonečné smyčky ovládající periodicky (10s) čerpadlo. Proces běží na pozadí, proto nijak neovlivňuje ostatní děje:

function fceBlinking()
   while (1)
      ? "vypinam cerpadlo"
      Rele = 0
      delay(10)
      ? "zapinam cerpadlo"
      Rele = 1
      delay(10)
   endwhile

Postupujeme na vyšší level…

Do této chvíle jsme používali nastavení vytvořená vizuálně prostřednictvím nástroje pro kanály ve WORKSPACE. Nakonfigurovat lze ale kanály také pomocí skriptů. Následující řádky (převzaty z manuálu) představují příklad, jak se takové nastavení provádí. Předem musím upozornit, že pro použití následujícího kódu musí být nainstalována aktuální verze DAQFactory Express. Její update naleznete na webu www.daqexpress.com. Vhodná je verze 5.75 a vyšší.

Pro začátek si představíme příkazy using a include. První z nich: using umožňuje zkrátit dlouhé zápisy. Souvisí to s tím, že DAQFactory podporuje mnoho zařízení a jejich vlastností. Příklad snad mluví za vše. Využívám-li v DAQFactory LABJACK, mohu zapsat do skriptu:

using("device.labjack.")

tímto řádkem si zkrátím další zápisy typu:

device.labjack.GoOne(1)

na:

GoOne(1)

Kdo pracoval někdy v Delphi, jistě mu bude tento zápis velmi povědomý. Stejným klíčovým slovem se zápisy zkracují v i tomto vývojovém prostřední, ovšem syntaxe je odlišná.

Dalším klíčovým slovem, které budeme pravidelně využívat je include. Toto slovo, stejně jako v jazyce C umožňuje připojit do projektu hlavičkový soubor, v případě LABJACKu se jedná o soubor definující množství užitečných funkcí a konstant, které budeme v průběhu seriálu používat. Klíčové slovo include budeme využívat v tomto tvaru:

include("c:\program files\labjack\drivers\labjackud.h")

Pokud se vaše cestka k souboru labjackud.h liší od výchozí (zvoleno v instalaci ovladačů LABJACKu), upravte řetězec v uvozovkách. Výše uvedené řádky zapište do nové sekvence a uložte ji například jako StartUp. U této sekvence nastavte „Auto-Start“. Toto zajistí, že budou příkazy provedeny vždy po načtení dokumentu. Že vše funguje tak, jak má, si vyzkoušíme velice jednoduše. V mém hlavičkovém souboru se na řádku 198 nachází definice konstanty:

const long LJ_dtU3 = 3

Pokud jsme vše provedli správně, měla by tato konstanta být dostupná v našem projektu. Můžeme se v ní dotázat v okně COMMAND/ALERT:

? LJ_dtU3

Pod odeslaným příkazem by se nám měla zobrazit hodnota konstanty: 3. Naše kroky jsou tedy doposud úspěšné, můžeme pokračovat. Jak již bylo výše napsáno, skripty nám dovolují konfigurovat vstupně výstupní brány stejně, jako jsme to dělali vizuálně. Tento proces má ale svá specifika. Především je doporučeno výrobcem uvést LABJACK před jakýmkoliv dalším zásahem do továrního nastavení. K tomu slouží následující věta:

AddRequest(0, LJ_ioPIN_CONFIGURATION_RESET, 0, 0, 0)

Pro provedení požadavku je třeba ještě žádost o provedení:

GoOne(0)

Požadavků může být samozřejmě více. GoOne(0) je provede jeden po druhém. Parametr 0 říká, že mají být požadavky provedeny pro první LABJACK, který DAQFactory najde. Máme-li zařízení připojených více, udává se do závorek ID zařízení, které má požadavky vykonat. Náš skript má v tuto chvíli podobu:

using("device.labjack.")
include("c:\program files\labjack\drivers\labjackud.h")
AddRequest(0, LJ_ioPIN_CONFIGURATION_RESET, 0, 0, 0)
GoOne(0)

V této fázi můžeme přidat konfiguraci dvou analogových vstupů (FIO2, FIO3) s rozlišením 14 bitů. K tomu nám poslouží další 3 žádosti:

  • změna rozlišení analogového převodníku na 14 bitů
  • přidání kanálu 2 a jeho nastavení jako analogový vstup
  • přidání kanálu 3 a jeho nastavení jako analogový vstup

Celý skript rozšíříme:

using("device.labjack.")
include("c:\program files\labjack\drivers\labjackud.h")
AddRequest(0, LJ_ioPIN_CONFIGURATION_RESET, 0, 0, 0)
AddRequest(0, LJ_ioPUT_CONFIG, LJ_chAIN_RESOLUTION, 14, 0, 0)
AddRequest(0, LJ_ioPUT_AIN_RANGE, 2, LJ_rgBIP5V, 0, 0)
AddRequest(0, LJ_ioPUT_AIN_RANGE, 3, LJ_rgBIP5V, 0, 0)
GoOne(0)

ak je vidět, požadavek na zpracování jednotlivých žádostí stačí jeden. Bylo by možné vykonávat požadavky zvlášť, jeden po druhém. To je umožňuje příkaz ePut.

ePut(0, LJ_ioPIN_CONFIGURATION_RESET, 0, 0, 0)
ePut(0, LJ_ioPUT_CONFIG, LJ_chAIN_RESOLUTION, 14, 0, 0)
...

Zpracování událostí

V průběhu vykonávání skriptu ale také v průběhu měření se můžeme dostat do situace, kdy je nutné vyřešit nestandardní situaci (například dělení nulou), chybu při měření a podobně. Chyby jsou zobrazovány v okně COMMAND/ALERT. Někdy se nám hodí tyto chyby zpracovat a využít je pro řízení kódu. K tomu slouží události a jejich zpracování. Ukážeme si jednoduchý příklad, kdy přenastavením měřícího kanálu vyvoláme chybový stav a ten zpracujeme.

  • Obsaďte měřící kanál a pojmenujte jej Mereni nebo jakkoliv jinak
  • Zařízení bude samozřejmě typu LABJACK, I/O type bude A to D a kanál 2.
  • Ostatní není třeba nastavovat.
  • Vytvořte nový skript a pojmenujte ho OnAlert - tento název je nutné zachovat.
  • Vložte následující kód:

if (find(strAlert,"D0050:",0) != -1)
   page.page_0.backcolor = rgb(255,0,0)
endif

Chybové zprávy jsou vždy formátu D0050:yy:xxxx: Message. Toho využívá náš skript, který porovnává chybový řetězec, a pokud vyhodnotí, že se jedná o chybu, vybarví pracovní plochu page_0 červenou barvou.

Chybu umíme vyvolat. Stačí ve vlastnostech kanálu 2 přepnout  I/O type z A to D na Timmer a chyba je na světě. O tom, že kód je funkční, je možné se přesvědčit, pokud přepnete na pracovní plochu page_0. Měla by být sytě červená.

Obsluhy událostí se často používají k odeslání zprávy o této události po sériové lince, ETHERTNETu nebo dalších rozhraních. U modelů s ETHERNETem je oblíbena metoda odesíláním zpráv e-mailem. Příklad je samozřejmě uveden v dokumentaci.

Dnešní díl bychom obsluhou událostí ukončili. Příště budeme v tomto tématu pokračovat a ukážeme si pokročilejší metody, jak chyby zpracovávat. Ke slibované tématice generování PWM se tak dostaneme až později spolu s popisem dalších periferií.

Odkazy a Download

Hodnocení článku: