Tango Controls

Tango Controls

Čo je to TANGO?

Je to systém na správu rôzneho hardvéru a softvéru.
TANGO aktuálne podporuje 4 platformy: Linux, Windows NT, Solaris a HP-UX.
Tu bude popísaná práca s Linuxom (Ubuntu 18.04)

Na čo je potrebný?

Uľahčuje prácu s rôznym hardvérom a softvérom.

  • Nemusíte sa zaoberať tým, ako uchovávať dáta v DB, to už za vás bolo urobené.
  • Treba len opísať mechanizmus dotazovania senzorov.
  • Zjednocuje celý váš kód do jedného štandardu.

Kde získať?

Z pôvodných súborov som to nedokázal spustiť, pre prácu som použil hotový obraz TangoBox 9.3.
V návode je popísané, ako nainštalovať z balíkov.

Z čoho sa skladá?

  • JIVE — slúži na prezeranie a editovanie databázy TANGO.
  • POGO — generátor kódu pre zariadenia TANGO.
  • Astor — softvérový manažér pre systém TANGO.

Zaujímať nás budú iba prvé dva komponenty.

Podporované programovacie jazyky

  • C
  • C++
  • Java
  • JavaScript
  • Python
  • Matlab
  • LabVIEW

Pracoval som s ním na python & c++. Tu v príklade sa bude používať c++.

Teraz prejdeme k popisu, ako pripojiť zariadenie k TANGO a ako s ním pracovať. Ako príklad vezmeme dosku GPS neo-6m-0-001:

Tango Controls

Ako je vidieť na obrázku, dosku pripájame k PC cez UART CP2102. Po pripojení k PC sa objaví zariadenie /dev/ttyUSB[0-N], zvyčajne /dev/ttyUSB0.

POGO

Teraz spustíme pogo, a vygenerujeme kostru kódu pre našu dosku.

pogo

Tango Controls

Už som mal vytvorený kód, vytvoríme ho nanovo File->New.

Tango Controls

Získavame nasledovné:

Tango Controls

Naše zariadenie (pod zariadením sa neskôr myslí softvérová časť) je prázdne a má dve ovládacie príkazy: State & Stav.

Je potrebné ho vyplniť potrebnými atribútmi:

Device Property — hodnoty predvolené, ktoré posielame do zariadenia na jeho inicializáciu, pre dosku GPS je potrebné poslať názov dosky v systéme com="/dev/ttyUSB0" a rýchlosť com portu baudrade=9600

Commands — príkazy na ovládanie nášho zariadenia, ktorým môžeme zadávať argumenty a návratovú hodnotu.

  • STATE — vracia aktuálny stav, z States
  • STATUS — vracia aktuálny status, je to reťazec doplnenia k STATE
  • GPSArray — vracia gps reťazec vo forme DevVarCharArray

Ďalej sa zadávajú atribúty zariadenia, ktoré je možné čítať/písať do/z neho.
Scalar Attributes — základné atribúty (char, string, long a pod.)
Spectrum Attributes — jednorozmerné polia
Image Attributes — dvojrozmerné polia

States — stavy, v ktorých sa naše zariadenie nachádza.

  • OPEN — zariadenie je otvorené.
  • CLOSE — zariadenie je zatvorené.
  • FAILT — chyba.
  • ÁNO — prijímame údaje z urządzenia.
  • VYPNUTÉ — nie sú údaje z urządzenia.

Príklad pridania atribútu gps_string:

Tango Controls

Obdobie dotazovania čas v ms, ako často sa bude aktualizovať hodnota gps_string. Ak nie je zadaný čas aktualizácie, attribút sa aktualizuje len na požiadanie.

Podarilo sa:

Tango Controls

Teraz potrebujeme vygenerovať kód Súbor->Generovať

Tango Controls

Podľa predpokladu sa Makefile nevytvára, po prvýkrát je potrebné zaškrtnúť políčko, aby sa vytvoril. Urobilo sa to preto, aby sa zmeny, ktoré do neho zasahujete, neodstránili pri novej generácii. Akonáhle ho vytvoríte raz a nastavíte ho pre svoj projekt (zaznačenie kompilátorských kľúčov, dodatkových súborov), môžete na neho zabudnúť.

Teraz prejdeme priamo k programovaniu. pogo nám vygeneroval nasledovné:

Tango Controls

Zaujímajú nás NEO6M.cpp & NEO6M.h. Pozrime sa na príklad konštruktora triedy:

NEO6M::NEO6M(Tango::DeviceClass *cl, string &s)
 : TANGO_BASE_CLASS(cl, s.c_str())
{
    
    /*----- CHRÁNENÁ REGIÓN ID(NEO6M::constructor_1) POVOLENÁ ZAČIATOK -----*/
    init_device();

    /*----- CHRÁNENÁ REGIÓN KONIEC -----*/    //  NEO6M::constructor_1
}

Čo tu je a čo je tu dôležité? Vo funkcii init_device() dochádza k alokácii pamäte pre naše atribúty: gps_string & gps_array, ale to nie je dôležité. Najdôležitejšie je tu, to sú komentáre:

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

Všetko, čo sa nachádza v tomto bloku komentárov, sa pri následných re-ženériách kódu v pogo neodstráni! Za to všetko, čo nie je v blokoch, sa odstráni! To sú miesta, kde môžeme programovať a robiť svoje úpravy.Teraz, aké hlavné funkcie obsahuje trieda

NEO6M void always_executed_hook(); void read_attr_hardware(vector<long> &attr_list); void read_gps_string(Tango::Attribute &attr); void read_gps_array(Tango::Attribute &attr);:

Keď sa pokúsime prečítať hodnotu atribútu

, budú sa volať funkcie v nasledujúcom poradí: gps_stringalways_executed_hook read_attr_hardware, read_gps_string a . V read_gps_string sa naplní gps_string hodnotou.void NEO6M::read_gps_string(Tango::Attribute &attr) { DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) vstup... " << endl; /*----- CHRÁNENÁ REGIÓN ID(NEO6M::read_gps_string) POVOLENÁ ZAČIATOK -----*/ // Nastaviť hodnotu atribútu*this->attr_gps_string_read = Tango::string_dup(this->gps.c_str());attr.set_value(attr_gps_string_read);/*----- CHRÁNENÁ REGIÓN KONIEC -----*/ // NEO6M::read_gps_string }

Vstupujeme do priečinka so zdrojovými kódmi a:

Kompilácia

Program sa skompiluje do priečinka ~\/DeviceServers.

make

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

jive

JIVE

V DB už existujú nejaké zariadenia, teraz si vytvoríme naše

Tango Controls

Upraviť->Vytvoriť Server Teraz sa pokúsime pripojiť k nemu:

Tango Controls

Nič z toho nebude fungovať, najprv musíte spustiť náš program:

Tango Controls

sudo .\/NEO6M neo6m -v2

Pripojiť sa k com portu môžem len s právami

-a. root-á. v — úroveň logovania.

Teraz sa môžeme pripojiť:

Tango Controls

Klienta

Vo grafike je pekné pozerať sa na obrázky, ale potrebujeme niečo užitočnejšie. Napíšeme klienta, ktorý sa pripojí k nášmu zariadeniu a zozbiera z neho údaje.

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

Ako kompilovať:

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++

Výsledok:

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

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

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

Dostali sme výsledok vo forme návratovej hodnoty príkazu, vyzdvihnutia atribútov reťazca a poľa znakov.

Odkazy

Článok som písal pre seba, pretože po čase začínam zabúdať, ako a čo robiť.

Ďakujem za pozornosť.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster