Tango kontrol

Tango kontrol

Hvad er TANGO?

Det er et system til styring af forskellig hardware og software.
TANGO understøtter i øjeblikket 4 platforme: Linux, Windows NT, Solaris og HP-UX.
Her vil vi beskrive arbejdet med Linux (Ubuntu 18.04)

Hvad er det for?

Forenkler arbejdet med forskelligt udstyr og software.

  • Du behøver ikke tænke på, hvordan du gemmer data i databasen, det er allerede gjort for dig.
  • Det er kun nødvendigt at beskrive mekanismen til pollingsensorer.
  • Reducerer al din kode til én standard.

Hvor skal man få det?

Jeg kunne ikke starte det fra kildekoden; Jeg brugte et færdiglavet billede af TangoBox 9.3 til at fungere.
Instruktionerne beskriver, hvordan du installerer fra pakker.

Hvad består den af?

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

Vi vil kun være interesserede i de to første komponenter.

Understøttede programmeringssprog

  • C
  • C + +
  • Java
  • JavaScript
  • Python
  • matlab
  • LabVIEW

Jeg arbejdede med det i python & c++. Her vil C++ blive brugt som eksempel.

Lad os nu gå videre til en beskrivelse af, hvordan man forbinder enheden til TANGO, og hvordan man arbejder med den. Gebyret vil blive taget som eksempel GPS neo-6m-0-001:

Tango kontrol

Som du kan se på billedet, forbinder vi kortet til pc'en via UART CP2102. Når den er tilsluttet en pc, vises enheden /dev/ttyUSB[0-N], normalt /dev/ttyUSB0.

POGO

Lad os nu starte Pogo, og generer skeletkode til at arbejde med vores board.

pogo

Tango kontrol

Jeg har allerede oprettet koden, lad os oprette den igen Fil->Ny.

Tango kontrol

Vi får følgende:

Tango kontrol

Vores enhed (i fremtiden vil vi med enhed mene softwaredelen) er tom og har to kontrolkommandoer: Tilstand & Status.

Den skal udfyldes med de nødvendige attributter:

Enhedsegenskab — standardværdier, som vi overfører til enheden for at initialisere den; for GPS-kortet skal du overføre navnet på kortet i systemet com="/dev/ttyUSB0" og com port hastighed baudrade=9600

Kommandoer — kommandoer til at styre vores enhed; de kan gives argumenter og en returværdi.

  • STAT - returnerer den aktuelle tilstand, fra Stater
  • STATUS - returnerer den aktuelle status, dette er strengens komplement til STAT
  • GPSArray - vender tilbage gps streng i formen DevVarCharArray

Indstil derefter de enhedsattributter, der kan læses/skrives til/fra den.
Skalære attributter — simple attributter (char, streng, lang osv.)
Spektrum attributter - endimensionelle arrays
Billedattributter - todimensionelle arrays

Stater — den tilstand, hvori vores enhed er placeret.

  • ÅBEN — enheden er åben.
  • LUK - enheden er lukket.
  • FEJL - fejl.
  • ON — modtage data fra enheden.
  • OFF — ingen data fra enheden.

Eksempel på tilføjelse af en attribut gps_streng:

Tango kontrol

Afstemningsperiode tid i ms, hvor ofte gps_string-værdien vil blive opdateret. Hvis opdateringstidspunktet ikke er angivet, vil attributten kun blive opdateret efter anmodning.

sket:

Tango kontrol

Nu skal du generere koden Fil->Generer

Tango kontrol

Som standard genereres Makefilen ikke; første gang skal du markere afkrydsningsfeltet for at oprette det. Dette gøres, så de ændringer, der er foretaget i den, ikke slettes i løbet af en ny generation. Når du har oprettet det én gang og konfigureret det til dit projekt (registrer kompileringsnøgler, yderligere filer), kan du glemme det.

Lad os nu gå videre til programmering. pogo med genererede følgende til os:

Tango kontrol

Vi vil være interesserede i NEO6M.cpp & NEO6M.h. Lad os tage et eksempel på en klassekonstruktør:

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 der, og hvad er vigtigt her? Funktionen init_device() allokerer hukommelse til vores attributter: gps_streng & gps_array, men det er ikke vigtigt. Det vigtigste her, disse er kommentarerne:

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

Alt, hvad der er inde i denne kommentarblok, vil ikke blive inkluderet i pogo under efterfølgende kodegenereringer Flyt dig!. Alt, hvad der ikke er i blokke, bliver det! Det er de steder, hvor vi kan programmere og lave vores egne redigeringer.

Hvad er nu hovedfunktionerne i 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 vil læse attributværdien gps_streng, vil funktionerne blive kaldt i følgende rækkefølge: altid_udført_hook, read_attr_hardware и læs_gps_streng. Read_gps_string vil udfylde gps_string 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 -----*/
    //  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
}

Samling

Gå til kildemappen og:

make

Programmet vil blive kompileret i mappen ~/DeviceServers.

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

JIVE

jive

Tango kontrol

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

Tango kontrol

Lad os nu prøve at oprette forbindelse til det:

Tango kontrol

Intet vil fungere, først skal vi køre vores program:

sudo ./NEO6M neo6m -v2

Jeg kan kun oprette forbindelse til com-porten med rettigheder rod-EN. v - logningsniveau.

Nu kan vi forbinde:

Tango kontrol

Kunde

I grafik er det bestemt godt at se på billeder, men du har brug for noget mere nyttigt. Lad os skrive en klient, der vil oprette forbindelse til vores enhed og tage aflæsninger 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 fik resultatet som en kommando retur, der tager attributterne for en streng og en række tegn.

RЎSЃS <P "RєRё

Jeg skrev artiklen til mig selv, for efter et stykke tid begynder jeg at glemme, hvordan og hvad jeg skal gøre.

Tak for din opmærksomhed.

Kilde: www.habr.com

Tilføj en kommentar