Tango-Kontroloj

Tango-Kontroloj

Kio TANGO?

Ĝi estas sistemo por administri diversajn aparataron kaj programaron.
TANGO nuntempe subtenas 4 platformojn: Linukso, Windows NT, Solaris kaj HP-UX.
Ĉi tie ni priskribos labori kun Linukso (Ubuntu 18.04)

Por kio ĝi estas?

Simpligas laboron kun diversaj ekipaĵoj kaj programaro.

  • Vi ne bezonas pensi pri kiel konservi datumojn en la datumbazo, ĝi jam estas farita por vi.
  • Estas nur necese priskribi la mekanismon por balotaj sensiloj.
  • Reduktas vian tutan kodon al unu normo.

Kie akiri

Mi ne povis lanĉi ĝin de la fontkodo; mi uzis pretan bildon de TangoBox 9.3 por funkcii.
La instrukcioj priskribas kiel instali el pakaĵoj.

El kio ĝi konsistas?

  • jive — uzata por vidi kaj redakti la datumbazon TANGO.
  • POGO — kodgeneratoro por TANGO-aparataj serviloj.
  • Astor — programestro por la TANGO-sistemo.

Ni interesiĝos nur pri la unuaj du komponantoj.

Subtenataj programlingvoj

  • C
  • C ++
  • java
  • JavaScript
  • python
  • matlab
  • LabVIEW

Mi laboris kun ĝi en python & c++. Ĉi tie C++ estos uzata kiel ekzemplo.

Nun ni transiru al priskribo pri kiel konekti la aparaton al TANGO kaj kiel labori kun ĝi. La kotizo estos prenita kiel ekzemplo GPS neo-6m-0-001:

Tango-Kontroloj

Kiel vi povas vidi en la bildo, ni konektas la tabulon al la komputilo per UART CP2102. Kiam li estas konektita al komputilo, la aparato aperas /dev/ttyUSB[0-N], kutime /dev/ttyUSB0.

POGO

Nun ni lanĉu pogo, kaj generi skeletkodon por labori kun nia tabulo.

pogo

Tango-Kontroloj

Mi jam kreis la kodon, ni kreu ĝin denove Dosiero->Nova.

Tango-Kontroloj

Ni ricevas la jenon:

Tango-Kontroloj

Nia aparato (en la estonteco, per aparato ni signifos la programaran parton) estas malplena kaj havas du kontrolkomandojn: Ŝtato & Statuso.

Ĝi devas esti plenigita per la necesaj atributoj:

Aparato Propraĵo - defaŭltaj valoroj, kiujn ni transdonas al la aparato por pravalorigi ĝin; por la GPS-tabulo, vi devas transdoni la nomon de la tabulo en la sistemon com="/dev/ttyUSB0" kaj com-havenrapido baudrade=9600

Komandoj — komandoj por kontroli nian aparaton; oni povas doni al ili argumentojn kaj revenan valoron.

  • Ŝtato - resendas la nunan staton, de ŝtatoj
  • STATUSO - redonas la aktualan staton, ĉi tio estas la komplemento de la ĉeno Ŝtato
  • GPSArray - revenas gps ŝnuro en la formo DevVarCharArray

Poste, agordu la aparatajn atributojn, kiujn oni povas legi/skribi al/de ĝi.
Skalaraj Atributoj - simplaj atributoj (char, string, long, ktp.)
Spektro-Atributoj - unudimensiaj tabeloj
Bildaj Atributoj - dudimensiaj tabeloj

ŝtatoj — la stato en kiu nia aparato troviĝas.

  • OPEN — la aparato estas malfermita.
  • CLOSE - la aparato estas fermita.
  • FALSO - eraro.
  • ON — ricevi datumojn de la aparato.
  • OFF - neniuj datumoj de la aparato.

Ekzemplo de aldono de atributo gps_string:

Tango-Kontroloj

Periodo de balotado tempo en ms, kiom ofte la gps_string-valoro estos ĝisdatigita. Se la ĝisdatigotempo ne estas specifita, la atributo estos ĝisdatigita nur laŭ peto.

Okazis:

Tango-Kontroloj

Nun vi devas generi la kodon Dosiero->Generu

Tango-Kontroloj

Defaŭlte, la Makedosiero ne estas generita; la unuan fojon vi devas marki la skatolon por krei ĝin. Ĉi tio estas farita por ke la ŝanĝoj faritaj al ĝi ne estu forigitaj dum nova generacio. Kreinte ĝin unufoje kaj agordinte ĝin por via projekto (registru kompilajn ŝlosilojn, pliajn dosierojn), vi povas forgesi ĝin.

Nun ni transiru al programado. pogo kun generis la jenon por ni:

Tango-Kontroloj

Ni interesiĝos pri NEO6M.cpp & NEO6M.h. Ni prenu ekzemplon de klaskonstruilo:

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
}

Kio estas tie kaj kio estas grava ĉi tie? La funkcio init_device() asignas memoron por niaj atributoj: gps_string & gps_array, sed ĝi ne estas grava. La plej grava afero ĉi tie, jen la komentoj:

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

Ĉio, kio estas ene de ĉi tiu komenta bloko, ne estos inkluzivita en pogo dum postaj kodaj regeneradoj foriru!. Ĉio, kio ne estas en blokoj, estos! Ĉi tiuj estas la lokoj kie ni povas programi kaj fari niajn proprajn redaktojn.

Nun, kiaj estas la ĉefaj funkcioj, kiujn enhavas la klaso? 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);

Kiam ni volas legi la atributan valoron gps_string, la funkcioj estos nomitaj en la sekva sinsekvo: ĉiam_ekzekutita_hoko, read_attr_hardware и read_gps_string. Read_gps_string plenigos gps_string kun la valoro.

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 -----*/
    //  Set the attribute value

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

Kompilo

Iru al la fonta dosierujo kaj:

make

La programo estos kompilita en la dosierujon ~/DeviceServers.

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

jive

jive

Tango-Kontroloj

Jam estas kelkaj aparatoj en la datumbazo, ni nun kreu la niajn Redakti-> Krei Servilon

Tango-Kontroloj

Nun ni provu konekti al ĝi:

Tango-Kontroloj

Nenio funkcios, unue ni devas ruli nian programon:

sudo ./NEO6M neo6m -v2

Mi povas konektiĝi al la kom-haveno nur kun rajtoj radikon-A. v — registra nivelo.

Nun ni povas konektiĝi:

Tango-Kontroloj

Kliento

En grafiko, rigardi bildojn certe estas bona, sed vi bezonas ion pli utilan. Ni skribu klienton, kiu konektos al nia aparato kaj prenos legaĵojn de ĝi.

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

Kiel kompili:

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

Rezulto:

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

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

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

Ni ricevis la rezulton kiel komanda reveno, prenante la atributojn de ĉeno kaj tabelo da signoj.

referencoj

Mi skribis la artikolon por mi, ĉar post iom da tempo mi komencas forgesi kiel kaj kion fari.

Dankon pro via atento.

fonto: www.habr.com

Aldoni komenton