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