Tango Controls

Tango Controls

Mis see on TANGO?

See on sĂŒsteem erinevate riistvara ja tarkvara haldamiseks.
TANGO toetab hetkel 4 platvormi: Linux, Windows NT, Solaris ja HP-UX.
Siin kirjeldatakse töö tegemist Linuxiga (Ubuntu 18.04)

Milleks seda on vaja?

Lihtsustab töötamist erineva riistvara ja tarkvaraga.

  • Te ei pea muretsema andmete hoidmise ĂŒle andmebaasis, see on juba teie eest tehtud.
  • Tuleb lihtsalt kirjeldada andurite kĂŒsitluse mehhanismi.
  • Komponeerib kogu teie koodi ĂŒheks standardiks.

Kust seda saada?

Allikatest ei saanud seda kÀivitada, tööks kasutasin valmis pilti TangoBox 9.3.
Juhendis on kirjeldatud, kuidas installida pakettide kaudu.

Millest see koosneb?

  • JIVE — kasutatakse TANGO andmebaasi vaatamiseks ja redigeerimiseks.
  • POGO — TANGO seadme serverite koodi generaator.
  • Astor — programmesĂŒsteemi TANGO haldur.

Meid huvitavad ainult esimesed kaks komponenti.

Toetatud programmeerimiskeeled

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

Olen töötanud selle kallal pythonis & c++. Siin kasutatakse nÀitena c++.

NĂŒĂŒd rÀÀgime, kuidas seadet TANGO-sse ĂŒhendada ja kuidas sellega töötada. NĂ€iteks vĂ”tame arvesse plaadi GPS neo-6m-0-001:

Tango Controls

Nagu pildilt nĂ€ha, ĂŒhendame plaadi arvutiga lĂ€bi UART CP2102. Arvutiga ĂŒhendamisel ilmub seade /dev/ttyUSB[0-N], tavaliselt /dev/ttyUSB0.

POGO

NĂŒĂŒd kĂ€ivitage pogo, ja genereerime skelett-koodi meie plaadiga töötamiseks.

pogo

Tango Controls

Mul oli juba kood loodud, loome selle uuesti File->New.

Tango Controls

Saame jÀrgneva:

Tango Controls

Meie seade (edaspidi mĂ”istame seadme all tarkvaralist osa) on tĂŒhi ja sellel on kaks juhtimiskĂ€sku: State & Olek.

See tuleb tÀita vajalike atribuutidega:

Device Property — vÀÀrtused, mida edastame seadmele selle initsialiseerimiseks, GPS-plaadi puhul tuleb edastada plaadi nimi sĂŒsteemis com="/dev/ttyUSB0" ja COM-porti kiirus baudrate=9600

Commands — kĂ€skude haldamine meie seadme ĂŒle, neile saab mÀÀrata argumente ja tagastatava vÀÀrtuse.

  • STATE — tagastab praeguse oleku, States
  • OLEK — tagastab praeguse staatuse, see on stringiline tĂ€iendav info STATE
  • GPSArray — tagastab gps stringina DevVarCharArray

SeejÀrel mÀÀratakse seadme atribuudid, mida saab lugeda/kirjutada sisse/vÀlja.
Scalar Attributes — lihtsad atribuudid (char, string, long jne)
Spectrum atribuudid — ĂŒhemÔÔtmelised massiivid
Pildi atribuudid — kahemÔÔtmelised massiivid

States — olek, milles meie seade asub.

  • AVADA — seade on avatud.
  • SUFRE — seade on suletud.
  • VIGA — viga.
  • KAS — saame seadme andmeid.
  • EI — seadme andmeid ei ole.

Atribuudi lisamise nÀide gps_string:

Tango Controls

Polling period aeg ms, kui tihti vÀrskendatakse gps_string vÀÀrtust. Kui vÀrskendamise aega ei mÀÀrata, siis atribuut vÀrskendatakse ainult pÀringu korral.

Saime:

Tango Controls

NĂŒĂŒd peame genereerima koodi Fail->Genereeri

Tango Controls

Vaikimisi Makefile'i ei genereerita, esmakordsel kasutamisel tuleb mÀrkida, et selle loomine on vajalik. See on tehtud selleks, et sinna tehtud muudatusi ei kustutataks uue genereerimise kÀigus. Kui olete selle kord juba loonud ja oma projekti jaoks seadistanud (kompilaatori vÔtmed, lisafailid), vÔite sellest unustada.

NĂŒĂŒd liigume otseselt programmeerimise juurde. Pogo genereeris meile jĂ€rgmist:

Tango Controls

Meid huvitavad NEO6M.cpp & NEO6M.h. VÔtame nÀiteks klassi konstruktori:

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
}

Mida siin on ja mis on oluline? Funktsioonis init_device() toimub mÀlu eraldamine meie atribuutide jaoks: gps_string & gps_array, aga see ei ole oluline. Siin on kÔige olulisem, see on kommentaarid:

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

KÔik, mis asub selle kommentaaribloki sees, ei eemaldata jÀrgmiste koodigeneratsioonide kÀigus pogo-s ole!... KÔik, mis pole plokkides, jÀÀb! Need on kohad, kus saame programmeerida ja teha oma muutusi.

NĂŒĂŒd, millised peamised funktsioonid sisaldab klass 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);

Kui me soovime lugeda atribuudi vÀÀrtust gps_string, kutsutakse funktsioonid jÀrgmises jÀrjekorras: always_executed_hook, read_attr_hardware ja read_gps_string. Funktsioonis read_gps_string tÀidetakse gps_string vÀÀrtusega.

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 -----*/
    //  Seadista atribuudivÀÀrtus

        *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
}

Kompileerimine

Siseneme kausta, kus on lÀhtekoodid ja:

make

Programm kompileeritakse kausta ~/DeviceServers.

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

JIVE

jive

Tango Controls

Andmebaasis on juba mĂ”ned seadmed, loome nĂŒĂŒd oma Muuda->Loo server

Tango Controls

NĂŒĂŒd proovime sellele ĂŒhenduda:

Tango Controls

Ei Ônnestu, esmalt peame kÀivitama meie programmi:

sudo ./NEO6M neo6m -v2

COM-porti ĂŒhendamine on vĂ”imalik ainult Ă”igustega root-a. v — logimise tase.

NĂŒĂŒd saame ĂŒhenduda:

Tango Controls

Klient

Graafikul piltide vaatamine on hea, kuid vajame midagi kasulikumat. Kirjutame kliendi, mis ĂŒhendub meie seadmega ja vĂ”tab sealt nĂ€idud.

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

Kuidas kompileerida:

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

Tulemus:

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

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

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

Saime tulemuse kÀsu tagastusena, atribuutide stringi ja massiivide vÔtmisena.

Lingid

Kirjutasin artikli endale, kuna mÔne aja pÀrast hakkan unustama, kuidas ja mida teha.

AitÀh tÀhelepanu eest.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster