Tango Controls

Tango Controls

Kaj je TANGO?

Je sistem za upravljanje različne strojne in programske opreme.
TANGO trenutno podpira 4 platforme: Linux, Windows NT, Solaris in HP-UX.
Tukaj bomo opisali delo z Linuxom (Ubuntu 18.04)

Čemu služi?

Poenostavlja delo z različno opremo in programsko opremo.

  • Ni vam treba razmišljati o tem, kako shraniti podatke v zbirko podatkov, to je že narejeno namesto vas.
  • Treba je le opisati mehanizem za anketiranje senzorjev.
  • Zmanjša vso vašo kodo na en standard.

Kje naj ga dobim?

Nisem ga mogel zagnati iz izvorne kode; za delo sem uporabil že pripravljeno sliko TangoBox 9.3.
Navodila opisujejo namestitev iz paketov.

Kaj je sestavljeno?

  • V ŽIVO — uporablja se za ogled in urejanje baze podatkov TANGO.
  • POGO — generator kode za strežnike naprav TANGO.
  • Astor — programski vodja sistema TANGO.

Zanimali nas bodo le prvi dve komponenti.

Podprti programski jeziki

  • C
  • C + +
  • Java
  • JavaScript
  • Python
  • matlab
  • LabVIEW

Delal sem z njim v python & c++. Tu bo kot primer uporabljen C++.

Zdaj pa preidimo na opis, kako napravo povezati s TANGO in kako delati z njo. Pristojbina bo vzeta kot primer GPS neo-6m-0-001:

Tango Controls

Kot lahko vidite na sliki, ploščo povežemo z osebnim računalnikom preko UART CP2102. Ko je naprava povezana z osebnim računalnikom, se prikaže naprava /dev/ttyUSB[0-N], običajno /dev/ttyUSB0.

POGO

Zdaj pa zaženimo pogoin ustvarite okvirno kodo za delo z našo ploščo.

pogo

Tango Controls

Kodo sem že ustvaril, ustvarimo jo znova Datoteka->Novo.

Tango Controls

Dobimo naslednje:

Tango Controls

Naša naprava (z napravo bomo v prihodnje razumeli programski del) je prazna in ima dva krmilna ukaza: Država & Status.

Izpolnjen mora biti s potrebnimi atributi:

Lastnost naprave — privzete vrednosti, ki jih prenesemo v napravo za inicializacijo; za GPS ploščo morate prenesti ime plošče v sistem com="/dev/ttyUSB0" in hitrost com porta baudrate=9600

ukazi — ukazi za nadzor naše naprave; lahko jim damo argumente in vrnjeno vrednost.

  • DRŽAVA - vrne trenutno stanje, od Države
  • STANJE - vrne trenutno stanje, to je dopolnilo niza DRŽAVA
  • GPSArray - vrača gps niz v obliki DevVarCharArray

Nato nastavite atribute naprave, ki jih je mogoče brati/pisati v/iz nje.
Skalarni atributi — enostavni atributi (char, string, long itd.)
Atributi spektra - enodimenzionalni nizi
Atributi slike - dvodimenzionalni nizi

Države — stanje, v katerem se nahaja naša naprava.

  • ODPRTO — naprava je odprta.
  • ZAPRI - naprava je zaprta.
  • NAPAKA - napaka.
  • ON — prejemanje podatkov iz naprave.
  • OFF — ni podatkov iz naprave.

Primer dodajanja atributa gps_string:

Tango Controls

Volilno obdobje čas v ms, kako pogosto bo vrednost gps_string posodobljena. Če čas posodobitve ni določen, bo atribut posodobljen samo na zahtevo.

Zgodilo se je:

Tango Controls

Zdaj morate ustvariti kodo Datoteka->Ustvari

Tango Controls

Privzeto se datoteka Makefile ne ustvari; prvič morate potrditi polje, da jo ustvarite. To se naredi tako, da se spremembe, ki so bile narejene v njej, med novo generacijo ne izbrišejo. Ko ste ga enkrat ustvarili in konfigurirali za svoj projekt (ključi prevajanja registra, dodatne datoteke), lahko pozabite nanj.

Zdaj pa preidimo na programiranje. pogo with je za nas ustvaril naslednje:

Tango Controls

Zanimala nas bosta NEO6M.cpp & NEO6M.h. Vzemimo primer konstruktorja razreda:

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
}

Kaj je tam in kaj je tukaj pomembno? Funkcija init_device() dodeli pomnilnik našim atributom: gps_string & gps_matrika, vendar ni pomembno. Tu je najpomembnejša stvar, to so komentarji:

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

Vse, kar je znotraj tega bloka komentarjev, ne bo vključeno v pogo med nadaljnjimi regeneracijami kode premakni se!. Vse kar ni v blokih bo! To so mesta, kjer lahko programiramo in sami urejamo.

Katere so glavne funkcije, ki jih vsebuje razred? 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);

Ko želimo prebrati vrednost atributa gps_string, bodo funkcije poklicane v naslednjem vrstnem redu: vedno_izvedena_kljuka, read_attr_hardware и read_gps_string. Read_gps_string bo napolnil gps_string z vrednostjo.

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
}

Sestavljanje

Pojdite v izvorno mapo in:

make

Program bo preveden v mapo ~/DeviceServers.

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

V ŽIVO

jive

Tango Controls

V zbirki podatkov je že nekaj naprav, ustvarimo svojo Uredi->Ustvari strežnik

Tango Controls

Zdaj pa se poskusimo povezati z njim:

Tango Controls

Nič ne bo delovalo, najprej moramo zagnati naš program:

sudo ./NEO6M neo6m -v2

Na vrata com se lahko povežem samo s pravicami koren-A. v — raven beleženja.

Zdaj lahko povežemo:

Tango Controls

Stranka

Seveda je gledanje slik dobro v grafiki, vendar potrebujete nekaj bolj uporabnega. Napišimo odjemalca, ki se bo povezal z našo napravo in z nje jemal odčitke.

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

Kako sestaviti:

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

Rezultat:

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

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

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

Rezultat smo dobili kot vrnitev ukaza, pri čemer smo vzeli atribute niza in niza znakov.

reference

Članek sem napisal zase, ker čez nekaj časa začnem pozabljati, kako in kaj narediti.

Hvala za vašo pozornost.

Vir: www.habr.com

Dodaj komentar