Tango Controls

Tango Controls

Hvad er TANGO?

Dette er et system til styring af forskelligt udstyr og software.
TANGO understĂžtter i Ăžjeblikket 4 platforme: Linux, Windows NT, Solaris og HP-UX.
Her vil arbejdet med Linux (Ubuntu 18.04) blive beskrevet

Hvad er det nĂždvendigt for?

Det forenkler arbejdet med forskelligt udstyr og software.

  • Du behĂžver ikke at tĂŠnke pĂ„, hvordan man gemmer data i databasen, det er allerede blevet gjort for dig.
  • Du skal kun beskrive mekanismen til afspĂžrgning af sensorer.
  • Det samler al din kode til Ă©n standard.

Hvor kan man finde det?

Jeg kunne ikke starte det fra kilden, sÄ jeg brugte et fÊrdigt billede af TangoBox 9.3.
I vejledningen er det beskrevet, hvordan man installerer fra pakker.

Hvad bestÄr det af?

  • JIVE — bruges til at se og redigere TANGO-databasen.
  • POGO — en kodegenerator til TANGO-enhedsservere.
  • Astor — en softwaremanager til TANGO-systemet.

Vi vil kun fokusere pÄ de fÞrste to komponenter.

UnderstĂžttede programmeringssprog

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

Jeg har arbejdet med det pÄ Python & C++. Her vil vi bruge C++ som eksempel.

Lad os nu gÄ videre til beskrivelsen af, hvordan man tilslutter en enhed til TANGO og hvordan man arbejder med den. Vi tager et eksempel med et kort GPS neo-6m-0-001:

Tango Controls

Som det kan ses pÄ billedet, tilslutter vi kortet til PC'en via UART CP2102. NÄr det tilsluttes til PC'en, vises enheden /dev/ttyUSB[0-N], normalt /dev/ttyUSB0.

POGO

Nu starter vi pogo, og vi genererer skeletkoden til at arbejde med vores kort.

pogo

Tango Controls

Jeg havde allerede skrevet noget kode, lad os genskabe det File->New.

Tango Controls

Vi fÄr fÞlgende:

Tango Controls

Vores enhed (under enheden vil der fremover blive refereret til softwaredelen) er tom og har to kontrolkommandoer: State & Status.

Det skal udfyldes med de nĂždvendige attributter:

Device Property — standardvĂŠrdierne som vi sender til enheden for at initialisere den, for GPS-kortet skal vi sende navnet pĂ„ kortet i systemet com="/dev/ttyUSB0" og baudrate for com-porten baudrate=9600

Commands — kontrolkommandoer til vores enhed, hvor man kan angive argumenter og returvérdi.

  • STATE — returnerer den nuvĂŠrende tilstand, fra States
  • STATUS — returnerer den aktuelle status, som er en streng, der supplerer STATE
  • GPSArray — returnerer gps strengen i form af DevVarCharArray

DernĂŠst angives attributterne for enheden, som kan lĂŠses/skrives til/fra.
Scalar Attributes — enkle attributter (char, string, long osv.)
Spectrum Attributes — en-dimensionale arrays
Image Attributes — to-dimensionale arrays

States — tilstandene enheden befinder sig i.

  • OPEN — enheden er Ă„ben.
  • CLOSE — enheden er lukket.
  • FAILT — fejl.
  • TIL — vi modtager data fra enheden.
  • OFF — der er ingen data fra enheden.

Eksempel pÄ at tilfÞje et attribut gps_string:

Tango Controls

Polling periode tiden i ms, hvor ofte gps_string vÊrdien vil blive opdateret. Hvis opdateringstiden ikke specificeres, vil attributten kun blive opdateret pÄ anmodning.

Det lykkedes:

Tango Controls

Nu skal vi generere koden Fil->Generer

Tango Controls

Som standard genereres Makefile ikke, fÞrste gang skal du sÊtte et flueben for at oprette den. Dette gÞr det, sÄ Êndringerne, der er foretaget i den, ikke slettes ved ny generation. NÄr den fÞrst er oprettet og indstillet til dit projekt (indsÊt kompileringstaster, ekstra filer), kan du glemme alt om den.

Nu gÄr vi direkte til programmering. pogo har genereret fÞlgende til os:

Tango Controls

Vi vil vĂŠre interesseret i NEO6M.cpp & NEO6M.h. Lad os tage konstruktĂžren af klassen som eksempel:

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
}

Hvad er her og hvad er det vigtigste? I funktionen init_device() tildeles der hukommelse til vores attributter: gps_string & gps_array, men det er ikke vigtigt. Det vigtigste her, er kommentarerne:

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

Alt hvad der er inde i denne kommentarblokat vil ikke blive slettet ved efterfĂžlgende genereringer af koden i pogo!. Alt hvad der ikke er i blokke vil! Det er de steder, hvor vi kan programmere og tilfĂžje vores ĂŠndringer.

Nu hvilke hovedfunktioner indeholder klassen 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);

NÄr vi Þnsker at lÊse vÊrdi af attributten gps_string, vil funktionerne blive kaldt i fÞlgende rÊkkefÞlge: always_executed_hook, read_attr_hardware og read_gps_string.I read_gps_string vil gps_string blive udfyldt med vÊrdien.

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 -----\/\*
    \/\/  Indstil attributvĂŠrdien

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

Kompilering

GĂ„ ind i mappen med kildekoden og:

make

Programmet vil blive kompilere i mappen ~\/DeviceServers.

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

JIVE

jive

Tango Controls

Der er allerede nogle enheder i databasen, lad os nu oprette vores Rediger->Opret server

Tango Controls

Nu prĂžver vi at oprette forbindelse til den:

Tango Controls

Intet vil fungere, fĂžrst skal vi starte vores program:

sudo .\/NEO6M neo6m -v2

At oprette forbindelse til com-porten kréver jeg kun at have rettigheder root-a. v — logningsniveau.

Nu kan vi oprette forbindelse:

Tango Controls

Kunde

At se pÄ billeder i grafikken er selvfÞlgelig godt, men vi har brug for noget mere nyttigt. Vi vil skrive en klient, der opretter forbindelse til vores enhed og henter mÄlinger fra den.

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

SÄdan kompileres:

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

Resultat:

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

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

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

Vi modtog resultatet som et return i kommandoen, hentning af attributter som streng og karakterarray.

Links

Jeg skrev artiklen til mig selv, fordi jeg efter nogen tid begynder at glemme, hvordan og hvad jeg skal gĂžre.

Tak for opmĂŠrksomheden.

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster