Tango Controls

Tango Controls

Co to je TANGO?

Je to systém pro řízení různých zařízení a softwaru.
TANGO v současnosti podporuje 4 platformy: Linux, Windows NT, Solaris a HP-UX.
Zde bude popsána práce s Linuxem (Ubuntu 18.04)

K čemu to je?

Usnadňuje práci s různým zařízením a softwarem.

  • Nemusíte přemýšlet o tom, jak uchovávat data v DB, to už je uděláno za vás.
  • Je třeba pouze popsat mechanismus dotazování senzorů.
  • Sjednocuje váš kód do jednoho standardu.

Kde to získat?

Z předpřipravených zdrojů jsem ho nedokázal spustit, pro práci jsem použil hotový obraz TangoBox 9.3.
V příručce je popsáno, jak instalovat z balíčků.

Z čeho se skládá?

  • JIVE — slouží k prohlížení a úpravy databáze TANGO.
  • POGO — generátor kódu pro zařízení TANGO.
  • Astor — programový manažer pro systém TANGO.

Budeme se zajímat pouze o první dva komponenty.

Podporované programovací jazyky

  • C
  • C++
  • Javy
  • JavaScript
  • CouchDB
  • Matlab
  • LabVIEW

Pracoval jsem s ním na pythonu a c++. Zde bude jako příklad použit c++.

Nyní přejdeme k popisu, jak připojit zařízení k TANGO a jak s ním pracovat. Jako příklad bude použita deska GPS neo-6m-0-001:

Tango Controls

Jak je vidět na obrázku, desku připojujeme k PC přes UART CP2102. Při připojení k PC se objeví zařízení /dev/ttyUSB[0-N], obvykle /dev/ttyUSB0.

POGO

Nyní spustíme pogo, a vygenerujeme kostru kódu pro práci s naši deskou.

pogo

Tango Controls

Měl jsem již vytvořený kód, vytvoříme ho znovu Soubor->Nový.

Tango Controls

Dostaneme následující:

Tango Controls

Naše zařízení (pod zařízením se dále rozumí softwarová část) je prázdné a má dvě ovládací příkazy: Stav && Status.

Je třeba jej vyplnit potřebnými atributy:

Vlastnost zařízení — výchozí hodnoty, které předáváme zařízení pro jeho inicializaci, pro desku GPS je třeba předat 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.

  • STAV — vrací aktuální stav, z Stavy
  • STATUS — vrací aktuální status, to je řetězec přídavek k STAV
  • GPSArray — vrací gps řetězec ve formě DevVarCharArray

Dále se zadávají atributy zařízení, které lze číst/pisovat do/z něj.
Skalární atributy — jednoduché atributy (char, string, long atd.)
Spektrum atributy — jednorozměrné pole
Obrázková atributy — dvourozměrné pole

Stavy — stav, ve kterém se nachází naše zařízení.

  • OTEVŘENO — zařízení je otevřeno.
  • ZAVŘENO — zařízení je uzavřeno.
  • CHYBA — chyba.
  • NA — přijímáme data ze zařízení.
  • VYPNUTO — nejsou žádná data ze zařízení.

Příklad přidání atributu gps_string:

Tango Controls

Perioda dotazování čas v ms, jak často se bude hodnota gps_string aktualizovat. Pokud se nezadá aktualizační doba, atribut se bude aktualizovat pouze na požadavek.

Podařilo se:

Tango Controls

Nyní je potřeba vygenerovat kód Soubor->Generovat

Tango Controls

Ve výchozím nastavení se Makefile nevytváří, poprvé je potřeba zaškrtnout, aby se vytvořil. To je provedeno, aby se provedené úpravy v něm neztratily při novém generování. Jakmile ho vytvoříte jednou a nastavíte podle svého projektu (zapsat kompilátorové klíče, další soubory), můžete na něj zapomenout.

Nyní se dostáváme přímo k programování. pogo nám vygeneroval následující:

Tango Controls

Zajímat nás budou NEO6M.cpp & NEO6M.h. Podívejme se na 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 zde je a co je zde důležité? V funkci init_device() dochází k alokaci paměti pro naše atributy: gps_string && gps_array, ale to není důležité. Nejdůležitější je zde, to jsou komentáře:

/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
    .......
/*----- PROTECTED REGION END -----*/    //  NEO6M::constructor_1

Vše, co se nachází uvnitř tohoto komentářového bloku, nebude při dalších regeneracích kódu v pogo odstraněno!. Vše, co je mimo bloky, bude! To jsou místa, kde můžeme programovat a provádět své změny.

Nyní, jaké hlavní funkce obsahuje třída NEO6M:

void always_executed_hook();
void read_attr_hardware(vector &attr_list);
void read_gps_string(Tango::Attribute &attr);
void read_gps_array(Tango::Attribute &attr);

Když budeme chtít přečíst hodnotu atributu gps_string, budou zavolány funkce v následujícím pořadí: always_executed_hook, read_attr_hardware a read_gps_string. V read_gps_string dojde k naplnění gps_string hodnotou.

void NEO6M::read_gps_string(Tango::Attribute &attr)
{
    DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) entering... " <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

Vstupujeme do složky se zdrojovými kódy a:

make

Program se zkompiluje do složky ~/DeviceServers.

tango-cs@tangobox:~/DeviceServers$ ls
NEO6M

JIVE

jive

Tango Controls

V DB už jsou nějaká zařízení, nyní vytvoříme naše Úpravy->Vytvořit server

Tango Controls

Nyní se pokusíme připojit k němu:

Tango Controls

Nic nevydrží, nejprve musíme spustit naši aplikaci:

sudo ./NEO6M neo6m -v2

K portu com se mohu připojit pouze s právy root-a. v — úroveň protokolování.

Teď se můžeme připojit:

Tango Controls

Zákazník

Dívat se na obrázky na grafu je sice pěkné, ale potřebujeme něco užitečnějšího. Napíšeme klienta, který se připojí k našemu zařízení a získá z něj data.

#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);
    }
}

Jak kompilovat:

g++ gps.cpp -I/usr/local/include/tango -I/usr/local/include -I/usr/local/include -std=c++0x -Dlinux -L/usr/local/lib -ltango -lomniDynamic4 -lCOS4 -lomniORB4 -lomnithread -llog4tango -lzmq -ldl -lpthread -lstdc++

Result:

tango-cs@tangobox:~/workspace/c$ ./a.out 
$GPRMC,,V,,,,,,,,,,N*53

$GPRMC,,V,,,,,,,,,,N*53

$GPRMC,,V,,,,,,,,,,N*53

Obdrželi jsme výsledek jako návratový kód příkazu a získání atributů řetězce a pole znaků.

Odkazy

Článek jsem psal pro sebe, protože po nějaké době začínám zapomínat, jak a co dělat.

Děkuji za pozornost.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster