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 deri më tani: Linux, Windows NT, Solaris dhe HP-UX.
Këtu do të përshkruhet puna me Linux (Ubuntu 18.04)

Për çfarë nevojitet?

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

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

Ku të gjej?

Nuk kam mundur ta nis atë nga burimet, për punë kam përdorur imazhin e gatshëm TangoBox 9.3.
Në udhëzime përshkruhet si të instalohet nga paketat.

Ç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 — menaxheri softuerik pĂ«r sistemin TANGO.

Na interesojnë vetëm dy komponentët e parë.

Gjuhet e mbështetura të programimit

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

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

Tani do të kalojmë te përshkrimi i mënyrës se si të lidhni pajisjen me TANGO dhe si të punoni me të. Si shembull do të marrë një bord GPS neo-6m-0-001:

Tango Controls

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

POGO

Tani le të nisim pogo, dhe gjenerojmë skeletin e kodit për të punuar me bordin tonë.

pogo

Tango Controls

Unë tashmë kam krijuar kodin, do ta krijojmë sërish File->New.

Tango Controls

Kemi rezultatet si më poshtë:

Tango Controls

Pajisja jonë (në vazhdim do të ketë parasysh pjesën softuerike) është bosh dhe ka dy komanda kontrolli: State & Status.

Duhet ta mbushni me atributet e nevojshme:

Device Property — vlerat e paracaktuar qĂ« i dĂ«rgohen pajisjes pĂ«r inicializim, pĂ«r bordin GPS duhet tĂ« dĂ«rgohet emri i bordit nĂ« sistem com="/dev/ttyUSB0" dhe shpejtĂ«sia e portit com baudrade=9600

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

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

Më pas përcaktohen atributet e pajisjes që mund të lexohen/shkruhen në/nga ajo.
Scalar Attributes — atributet e thjeshta (char, string, long etj.)
Spectrum Attributes — vargje njĂ«-dimensional
Image Attributes — vargje dy-dimensional

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

  • OPEN — pajisja Ă«shtĂ« e hapur.
  • CLOSE — pajisja Ă«shtĂ« e mbyllur.
  • FAILT — gabim.
  • PO — marrim tĂ« dhĂ«na nga pajisja.
  • OFF — nuk ka tĂ« dhĂ«na nga pajisja.

Shembull i shtimit të një atribute gps_string:

Tango Controls

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

I arritëm:

Tango Controls

Tani duhet të gjenerojmë kodin File->Generate

Tango Controls

Për herë të parë, Makefile nuk krijohet automatikisht, duhet të vendosni shenjën që ta krijoni. Kjo bëhet që ndryshimet e bërë prej tij të mos fshihen gjatë një gjenerimi të ri. Pasi ta krijoni një herë dhe ta konfiguroni për projektin tuaj (për të shkruar çelësat e kompilimit, skedarët shtesë), mund të harroni për të.

Tani kalojmë direkt në programim. pogo na gjeneroi këtë:

Tango Controls

Ne do të jemi të interesuar për NEO6M.cpp & NEO6M.h. Le të shohim 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 çfarĂ« Ă«shtĂ« e rĂ«ndĂ«sishme? NĂ« funksionin init_device() ndodh ndarja e memories pĂ«r atributet tona: gps_string & gps_array, por kjo nuk ka rĂ«ndĂ«si. E rĂ«ndĂ«sishmja kĂ«tu, janĂ« komentet:

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

Çdo gjĂ« qĂ« ndodhet brenda kĂ«tij bloku komenti gjatĂ« gjenerimeve tĂ« ardhshme tĂ« kodit nĂ« pogo nuk do tĂ« fshihet!. Çdo gjĂ« qĂ« ndodhet jashtĂ« blloqeve do tĂ« fshihet! KĂ«to janĂ« vendet ku mund tĂ« programojmĂ« dhe tĂ« bĂ«jmĂ« ndryshime tĂ« veta.

Tani, cilat funksione kryesore përmban klasa 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 të dëshirojmë të lexojmë vlerën e atributit gps_string, do të thirren funksionet në rendin e mëposhtëm: always_executed_hook, read_attr_hardware dhe read_gps_string. Në read_gps_string do të ndodhë mbushja e 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

Hyni në dosjen me burimet dhe:

make

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

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

JIVE

jive

Tango Controls

Në bazën e të dhënave tashmë ka disa pajisje, tani do të krijojmë tonën Edit->Create Server

Tango Controls

Tani le të provonim të lidhemi me të:

Tango Controls

Nuk do të funksionojë, duhet të filloni programin tonë:

sudo ./NEO6M neo6m -v2

TĂ« lidhemi me portin com mundem vetĂ«m me tĂ« drejtat root-a. v — niveli i logarit.

Tani mund të lidhemi:

Tango Controls

KÎ»ÎŻÎżÏ…ent

Të shikosh imazhet në grafik është sigurisht e bukur, por duhen gjëra më të dobishme. Do të shkruajmë një klient që do të lidhet me pajisjen tonë dhe do të marrë të dhënat prej saj.

#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ë kompilosh:

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

Marrë rezultatin si kthim të komandës, marrjen e atributeve të vargjeve dhe masave të karaktereve.

Linket

Artikulli është shkruar për vete, sepse pas një periudhe harroj si dhe çfarë të bëj.

Faleminderit për vëmendjen.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster