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

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster