Tango Controls

Tango Controls

ÇfarĂ« Ă«shtĂ« TANGO?

Kjo është një sistem për menaxhimin e pajisjeve dhe softuerëve të ndryshëm.
TANGO mbështet 4 platforma për momentin: Linux, Windows NT, Solaris dhe HP-UX.
Këtu do të përshkruhet funksionimi me Linux (Ubuntu 18.04)

Për çfarë nevojitet?

E thjeshtëson punën me pajisje dhe softuerë të ndryshëm.

  • Nuk keni nevojĂ« tĂ« mendoni se si tĂ« ruani tĂ« dhĂ«nat nĂ« DB, kjo Ă«shtĂ« bĂ«rĂ« pĂ«r ju.
  • Duhet vetĂ«m tĂ« pĂ«rshkruani mekanizmin e pyetjes sĂ« sensorĂ«ve.
  • E redukton tĂ« gjithĂ« kodin tuaj nĂ« njĂ« standard tĂ« vetĂ«m.

Ku të merrni?

Nuk arrita ta nis nga burimet, përdorova imazhin e gatshëm TangoBox 9.3.
Udhëzimi përshkruan se si të instaloni nga paketat.

Nga çfarë përbëhet?

  • JIVE — shĂ«rben pĂ«r tĂ« parĂ« dhe redaktuar bazĂ«n e tĂ« dhĂ«nave TANGO.
  • POGO — gjenerator kodi pĂ«r serverĂ«t e pajisjeve TANGO.
  • Astor — menaxhuesi i softuerit pĂ«r sistemin TANGO.

Ne do të interesohemi vetëm për dy komponentët e parë.

Gjuhët e programimit të mbështetura

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

Kam punuar me të në python & c++. Këtu si një shembull do të përdoret c++.

Tani do të kalojmë në përshkrimin se si të lidheni me pajisjen TANGO dhe si të punoni me të. Si shembull do të marrë një pllakë GPS neo-6m-0-001:

Tango Controls

Siç duket në foto, pllakën e lidhim me PC përmes UART CP2102. Kur lidhet me PC, shfaqet pajisja /dev/ttyUSB[0-N], zakonisht /dev/ttyUSB0.

POGO

Tani do të fillojmë pogo, dhe do të gjenerojmë kodin skelet për të punuar me pllakat tonë.

pogo

Tango Controls

Unë tashmë kam krijuar kodin, le ta krijojmë përsëri File->New.

Tango Controls

Marrim këtë:

Tango Controls

Pajisja jonë (për pajisjen më vonë do të kuptohet pjesa software) është e zbrazët dhe ka dy komanda kontrolli: State & Statusi.

Duhet ta mbushim atë me atributet e nevojshme:

Device Property — vlerat standarde qĂ« i dĂ«rgojmĂ« pajisjes pĂ«r inicializim, pĂ«r pllakat GPS duhet tĂ« dĂ«rgojmĂ« emrin e pllakat nĂ« sistem com="/dev/ttyUSB0" dhe shpejtĂ«sinĂ« e portit com baudrate=9600

Commands — komandat e kontrollit pĂ«r pajisjen tonĂ«, atyre mund t'u caktojmĂ« argumente dhe vlera tĂ« kthyera.

  • STATE — kthen gjendjen aktuale, nga States
  • STATUS — kthen statusin aktual, ky Ă«shtĂ« njĂ« shtesĂ« string pĂ«r STATE
  • GPSArray — kthen gps njĂ« string nĂ« formatin DevVarCharArray

Më tej caktosen atributet e pajisjes që mund të lexohen/shkruhen në/nga të.
Scalar Attributes — atribute tĂ« thjeshta (char, string, long etj.)
Atributet Spectrum — array tĂ« njĂ«dimensionale
Atributet e Imazhit — array tĂ« dydimensionale

States — gjendjet nĂ« tĂ« cilat ndodhet pajisja jonĂ«.

  • HAPUR — pajisja Ă«shtĂ« e hapur.
  • Mbyll — pajisja Ă«shtĂ« e mbyllur.
  • DËSHTIM — gabim.
  • ON — po marrim tĂ« dhĂ«na nga pajisja.
  • OFF — nuk ka tĂ« dhĂ«na nga pajisja.

Shembuj i shtimit të atributit gps_string:

Tango Controls

Periudha e anketimit kohë në ms, sa shpesh do të përditësohet vlera gps_string. Nëse koha e përditësimit nuk caktohet, atëherë atributi do të përditësohet vetëm me kërkesë.

Arritëm:

Tango Controls

Tani duhet të gjenerojmë kodin File->Generate

Tango Controls

Me default, Makefile nuk gjenerohet, herën e parë duhet të vendosni shenjën që ta krijoni. Kjo është bërë që ndryshimet e bëra në të mos fshihen gjatë gjenerimeve të reja. Duke e krijuar atë njëherë dhe duke e konfiguroni për projektin tuaj (shkruani çelësat e kompilimit, skedarët shtesë) mund ta nisni pa u shqetësuar më për të.

Tani kalojmë drejtpërdrejt në programim. pogo na ka gjeneruar këtë:

Tango Controls

Na interesojnë NEO6M.cpp & NEO6M.h. Le ta shqyrtojmë për shembull konstruktorin e klasës:

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
}

ÇfarĂ« ka kĂ«tu dhe cila Ă«shtĂ« rĂ«ndĂ«sishmja? NĂ« funksionin init_device() ndodh alokimi i memories pĂ«r atributet tona: gps_string & gps_array, por kjo nuk ka rĂ«ndĂ«si. RĂ«ndĂ«sishmja kĂ«tu, janĂ« komentet:

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

Gjithçka që gjendet brenda këtij bloku komenti gjatë gjenerimeve të mëvonshme të kodit në pogo nuk do të fshihet!. Gjithçka që është në blloqe do! Këto janë ato vende ku mund të programojmë dhe të bëjmë ndryshimet tona.

Tani, cilat funksione kryesore përmban klasi 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);

Kur ne të duam të lexojmë vlerën e atributit gps_string, do të thirren funksionet në këtë rend: always_executed_hook, read_attr_hardware dhe read_gps_string. Në read_gps_string do të plotësohet gps_string me vlerën.

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
}

Kompilimi

Hyrë në dosjen me burimet dhe:

make

Programi do të kompilohet në dosjen ~/DeviceServers.

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

JIVE

jive

Tango Controls

Në DB tashmë ka disa pajisje, tani do të krijojmë tonën Edit->Krijo Server

Tango Controls

Tani do të përpiqemi të lidhemi me të:

Tango Controls

Nuk do të funksionojë, së pari duhet të nisni programin tonë:

sudo ./NEO6M neo6m -v2

TĂ« lidhem me portin com mundem vetĂ«m me tĂ« drejtat root-a. v — niveli i ndihmĂ«s.

Tani mundemi të lidhemi:

Tango Controls

Klienti

Në grafik është e mirë të shohim pamjet, por duhet diçka më të dobishme. Do të shkruajmë një klient që do të lidhet me pajisjen tonë dhe do të marrë të dhënat.

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

Si të kompilohet:

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

Rezultati:

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

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

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

Mori rezultat si kthim të komandës, marrja e atributeve të vargut dhe masës së karaktereve.

Linke

Artikulli është shkruar për vete, sepse pas një kohe filloj të harroj si dhe çfarë duhet bërë.

Faleminderit për vëmendjen.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster