Jedná se o systém pro správu různého hardwaru a softwaru.
TANGO aktuálně podporuje 4 platformy: Linux, Windows NT, Solaris a HP-UX.
Zde popíšeme práci s Linuxem (Ubuntu 18.04)
Nebo co ne?
Zjednodušuje práci s různými zařízeními a softwarem.
Nemusíte přemýšlet o tom, jak data do databáze uložit, je to již hotové za vás.
Je pouze nutné popsat mechanismus pro polling senzory.
Nemohl jsem to spustit ze zdrojového kódu, k práci jsem použil hotový obrázek TangoBoxu 9.3.
Pokyny popisují, jak nainstalovat z balíčků.
Z čeho se skládá?
JIVE — slouží k prohlížení a editaci databáze TANGO.
POGO — generátor kódu pro servery zařízení TANGO.
Astor — programový manažer pro systém TANGO.
Nás budou zajímat pouze první dvě složky.
Podporované programovací jazyky
C
C + +
Jáva
JavaScript
PYTHON
Matlab
LabVIEW
Pracoval jsem s tím v pythonu a c++. Zde bude jako příklad použit C++.
Nyní přejdeme k popisu, jak zařízení připojit k TANGO a jak s ním pracovat. Poplatek bude brán jako příklad GPS neo-6m-0-001:
Jak vidíte na obrázku, desku připojujeme k PC přes UART CP2102. Po připojení k počítači se zobrazí zařízení /dev/ttyUSB[0-N], obvykle /dev/ttyUSB0.
POGO
Nyní spustíme Pogoa vygenerujte kód kostry pro práci s naší deskou.
pogo
Kód jsem již vytvořil, pojďme ho vytvořit znovu Soubor->Nový.
Získáme následující:
Naše zařízení (v budoucnu budeme zařízením rozumět softwarovou část) je prázdné a má dva ovládací příkazy: Stát & Status.
Musí být vyplněno potřebnými atributy:
Vlastnost zařízení — výchozí hodnoty, které přeneseme do zařízení za účelem jeho inicializace; pro desku GPS je třeba přenést název desky v systému com="/dev/ttyUSB0" a rychlost com portu baudrade=9600
Příkazy — příkazy pro ovládání našeho zařízení; lze jim zadat argumenty a návratovou hodnotu.
STÁT - vrátí aktuální stav, od States
POSTAVENÍ - vrátí aktuální stav, toto je doplněk řetězce STÁT
GPSArray - vrací gps řetězec ve formuláři DevVarCharArray
Dále nastavte atributy zařízení, které lze číst/zapisovat do/z něj. Skalární atributy — jednoduché atributy (char, string, long atd.) Atributy spektra - jednorozměrná pole Atributy obrázku - dvourozměrná pole
States — stav, ve kterém se naše zařízení nachází.
OTEVŘENO — zařízení je otevřené.
ZAVŘÍT - zařízení je zavřené.
SELHAT - chyba.
ON — přijímat data ze zařízení.
OFF — žádná data ze zařízení.
Příklad přidání atributu gps_string:
Období hlasování čas v ms, jak často bude hodnota gps_string aktualizována. Pokud není čas aktualizace zadán, bude atribut aktualizován pouze na vyžádání.
Ukázalo se:
Nyní musíte vygenerovat kód Soubor->Generovat
Ve výchozím nastavení se Makefile negeneruje; poprvé je potřeba zaškrtnout políčko, aby se vytvořil. To se provádí tak, aby se v něm provedené změny při nové generaci nesmazaly. Jakmile jej jednou vytvoříte a nakonfigurujete pro svůj projekt (zaregistrujte kompilační klíče, další soubory), můžete na to zapomenout.
Nyní přejděme k programování. pogo with nám vygeneroval následující:
Nás budou zajímat NEO6M.cpp & NEO6M.h. Vezměme si příklad konstruktoru třídy:
NEO6M::NEO6M(Tango::DeviceClass *cl, string &s)
: TANGO_BASE_CLASS(cl, s.c_str())
{
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
init_device();
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
}
Co tam je a co je zde důležité? Funkce init_device() alokuje paměť pro naše atributy: gps_string & gps_array, ale to není důležité. Tady je to nejdůležitější, toto jsou komentáře:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Vše, co je uvnitř tohoto bloku komentářů, nebude zahrnuto do pogo během následujících regenerací kódu Uhni!. Vše, co není v blocích, bude! To jsou místa, kde můžeme programovat a provádět vlastní úpravy.
Jaké jsou tedy hlavní funkce, které třída obsahuje? NEO6M:
Když chceme číst hodnotu atributu gps_string, funkce budou volány v následujícím pořadí: always_executed_hook, read_attr_hardware и read_gps_string. Read_gps_string vyplní gps_string hodnotou.
void NEO6M::read_gps_string(Tango::Attribute &attr)
{
DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(NEO6M::read_gps_string) ENABLED START -----*/
// Set the attribute value
*this->attr_gps_string_read = Tango::string_dup(this->gps.c_str());
attr.set_value(attr_gps_string_read);
/*----- PROTECTED REGION END -----*/ // NEO6M::read_gps_string
}
Kompilace
Přejděte do zdrojové složky a:
make
Program bude zkompilován do složky ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
JIVE
jive
V databázi již jsou nějaká zařízení, pojďme nyní vytvořit naše Upravit->Vytvořit server
Nyní se k němu zkusíme připojit:
Nic nebude fungovat, nejprve musíme spustit náš program:
sudo ./NEO6M neo6m -v2
Ke com portu se mohu připojit pouze s právy kořen-a v — úroveň protokolování.
Nyní se můžeme připojit:
Zákazník
V grafice je prohlížení obrázků jistě dobré, ale potřebujete něco užitečnějšího. Pojďme napsat klienta, který se připojí k našemu zařízení a bude z něj odečítat hodnoty.
#include <tango.h>
using namespace Tango;
int main(int argc, char **argv) {
try {
//
// create a connection to a TANGO device
//
DeviceProxy *device = new DeviceProxy("NEO6M/neo6m/1");
//
// Ping the device
//
device->ping();
//
// Execute a command on the device and extract the reply as a string
//
vector<Tango::DevUChar> gps_array;
DeviceData cmd_reply;
cmd_reply = device->command_inout("GPSArray");
cmd_reply >> gps_array;
for (int i = 0; i < gps_array.size(); i++) {
printf("%c", gps_array[i]);
}
puts("");
//
// Read a device attribute (string data type)
//
string spr;
DeviceAttribute att_reply;
att_reply = device->read_attribute("gps_string");
att_reply >> spr;
cout << spr << endl;
vector<Tango::DevUChar> spr2;
DeviceAttribute att_reply2;
att_reply2 = device->read_attribute("gps_array");
att_reply2.extract_read(spr2);
for (int i = 0; i < spr2.size(); i++) {
printf("%c", spr2[i]);
}
puts("");
} catch (DevFailed &e) {
Except::print_exception(e);
exit(-1);
}
}