Jste zde

LABJACK U3 – KROK ZA KROKEM VII - využítí .NET

logoLABJACK.PNG

V našem miniseriálu o využití LABJACKu jsme doposud pracovali pouze se skripty. Nevytvářeli jsme samostatně běžící aplikace. Mělo to svůj důvod – „osahat“ si vlastnosti LABJACKu. V této chvíli je už ale na čase vytvořit si něco, co budeme v drtivé většině aplikací s LABJACKem opravdu potřebovat. Samostatně běžící aplikaci pro sběr a zpracování dat.

labjack.jpg

Úvodem

V posledních několika letech se velmi populárním stalo běhové prostředí .NET a s ním také jazyk C#. Věřím, že velká část čtenářů tohoto serveru tento jazyk ovládá alespoň na základní úrovni. Tedy alespoň je schopna porozumět zapsanému kódu. Prostředí .NET a nezbytný Visual C# Express lze stáhnout z webu Microsoft pro vývojáře (MSDN) a použít i ke komerčním účelům (omezení vyplývá v menším komfortu, počtu komponent, nástrojů nastavení…). Na webu MSDN lze rovněž nalézt velkou uživatelskou podporu v podobě nápovědy a diskusního fóra. Pro naše účely lze využít samozřejmě i diskusního fóra LABJACK.

Vývojoví pracovníci společnosti LABJACK Corporation připravili pro prostředí .NET 2.0 DLL knihovnu se sadou knihovních funkcí obdobných těm, které jsme používali v Matlabu nebo LabView. Mnoho změn tedy nepocítíme, kromě té hlavní - budeme mít samostatně fungující aplikaci pro sběr a zpracování dat. Knihovnu je možné opět stáhnout, spolu s ukázkovými aplikacemi, na webu LABJACK v sekci DOWNLOAD.

Knihovnu samozřejmě nemusíme používat pouze ve spojení s jazykem C# ale také v ostatních jazycích využívajících .NET (Visual Basic, J#, řízené C++, a další). Obdobné knihovny existují i pro další jazyky, jako například klasické C/C++ (jsou dostupné ukázkové příklady pro prostředí DevC++).

LJUDDotNet

Knihovna LJUDDotNet.dll definuje jmenný prostor (namespace) LabJack.LabJackUD. Hlavním objektem uvnitř tohoto jmenného prostoru je LJUD. Tento objekt zjednodušeně kopíruje vlastnosti knihovny LJUDDotNet.dll. Definuje následující vyčet typů:

LJUDERROR
DEVICE
CONNECTION
IO
CHANNEL
RANGES
TIMERMODE
TIMERCLOCKS
STREAMWAITMODES

Knihovna také definuje následující metody:

public static LJUDERROR OpenLabJack(DEVICE deviceType, CONNECTION connectionType, String address, bool firstFound, ref int handle)
public static LJUDERROR OpenLabJackS(String deviceType, String connectionType,String address, bool firstFound, ref int handle)
public static LJUDERROR AddRequest(int handle, IO IOType, CHANNEL channel, double val, int x1, double userData)
public static LJUDERROR AddRequestS(int handle, String IOType, CHANNEL channel, double val, int x1, double userData)
public static LJUDERROR AddRequestSS(int handle, String IOType, String channel, double val, int x1, double userData)
public static LJUDERROR AddRequest(int handle, IO IOType, int channel, double val, int x1, double userData)
public static LJUDERROR AddRequestS(int handle, String IOType, int channel, double val, int x1, double userData)
public static LJUDERROR AddRequest(int handle , IO IOType , CHANNEL channel , double val , byte[] x1 , double userData)
public static LJUDERROR AddRequest(int handle , IO IOType , CHANNEL channel , double val , double[] x1 , double userData)
public static LJUDERROR Go()
public static LJUDERROR GoOne(int handle)
public static LJUDERROR eGet(int handle, IO IOType, CHANNEL channel, ref double val, double[] x1)
public static LJUDERROR eGet(int handle, IO IOType, CHANNEL channel, ref double val, int x1)
public static LJUDERROR eGetS(int handle,String IOType, CHANNEL channel, ref double val, int x1)
public static LJUDERROR eGetSS(int handle,String IOType, String channel, ref double val, int x1)
public static LJUDERROR ePut(int handle, IO IOType, CHANNEL channel, double val, int x1)
public static LJUDERROR ePutS(int handle, String IOType, CHANNEL channel, double val, int x1)
public static LJUDERROR ePutSS(int handle, String IOType, String channel, double val, int x1)
public static LJUDERROR GetResult(int handle, IO IOType, CHANNEL channel, ref double val)
public static LJUDERROR GetResultS(int handle, String IOType, CHANNEL channel, ref double val)
public static LJUDERROR GetResultSS(int handle, String IOType, String channel, ref double val)
public static LJUDERROR GetFirstResult(int handle, ref IO IOType, ref CHANNEL channel, ref double val, ref int px1, ref double userData)
public static LJUDERROR GetNextResult(int handle, ref IO IOType,ref CHANNEL channel,ref double val, ref int px1, ref double userData)
public static LJUDERROR ResetLabJack(int handle)
public static LJUDERROR Close()
public static LJUDERROR DoubleToStringAddress(double number, char[] str, int hexDot)
public static LJUDERROR StringToDoubleAddress(String str, ref double number, int hexDot)
public static int StringToConstant(String str)
public static void ErrorToString(ERROR errorCode, char[] str)
public static double GetDriverVersion()
public static LJUDERROR ListAll(DEVICE deviceType, CONNECTION connectionType, ref int numFound, int[] serialNumbers, int[] IDs,Double[] addresses)
public static LJUDERROR ListAllS(String deviceType, String connectionType, ref int numFound, int[] serialNumbers, int[])

Uvedené funkce pracují dle manuálu API pro LABJACK. Budeme je používat tak jak jsme zvyklí. Některé funkce mají více než jednu definici (jsou přetížené). Jeden příklad za všechny:

public static ERROR eGet(int handle, IO IOType, CHANNEL channel, ref double val, double[] x1)
public static ERROR eGet(int handle, IO IOType, CHANNEL channel, ref double val, int x1) 

První funkce vrazí pole naměřených hodnot, zatímco druhá funkce vrací jednu jedinou hodnotu.

Ve jmenném prostoru LabJack.LabJackUD je k dispozici také obsluha výjjmek LabJackUDException. Tento objekt zjednodušuje obsluhu chyb. Má veřejnou položku LJUD.LJUDERROR sloužící k určení typu chyby a metodu ToString() pro její textový popis. Následující příklad ukazuje praktické řešení odchytu chybových stavů:

try 
{
	// Add requests
	LJUD.AddRequest(ue3.ljhandle, UE3.IO.ANALOG_INPUT,(UE3.CHANNEL) 0,0,0,0);
	// Execute 
	LJUD.GoOne(ue3.ljhandle);
	// Get reset
	LJUD.GetResult(ue3.ljhandle, UE3.IO.ANALOG_INPUT, (UE3.CHANNEL) 0, ref AI0);
}
catch (LabJackUDException e) 
{
	// If error occured print a message box showing which
	MessageBox.Show(this, e.ToString(), "LabjackUD Error #" + (int)e.error);
}

Příklad první – konzole

Jako první příklad si můžeme uvést A3AllIO (\Examples\LJUDDotNet\U3\U3AllIO), dostupný ke stažení v sekci DOWNLOAD na webu LABJACK. Jedná se o konzolovou aplikaci, která provede základní nastavení LABJACKu, přečtení osmi analogových a digitálních vstupů a nastavení analogového výstupu na hodnotu 2.5V. Náhled příkladu ukazuje obrázek 1:

LABJACKVII_1.png
Obrázek 1: Konzolová aplikace U3AllIO

Základem aplikace jsou statické metody třídy LJUD, tak jak byly představeny v textu výše. Nebudu zde uvádět plný zdrojový kód, protože je volně ke stažení. Nastavení v něm obsažená jsme už prováděli například v Matlabu nebo DAQFactory. Části zdrojového kódu doporučuji uschovat, protože se hodí při zakládání nových vlastních projektů.

Příklad druhý – formulářová aplikace

Druhým příkladem uvedeným na webu LABJACK je formulářová aplikace. Z praktického hlediska se o mnoho neliší od předchozího příkladu. Opět jsou zde využívány statické metody třídy LJUD. Na rozdíl od předchozího příkladu zde nejsou hodnoty čteny pouze jednou po spuštění programu, ale jejich čtení zajišťuje komponenta Timmer.

LABJACKVII_2.png
Obrázek 2: U3Simple - formulářová aplikace

Odkazy a Download

 

Hodnocení článku: