
Hvad er ?
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:

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
Jeg havde allerede skrevet noget kode, lad os genskabe det File->New.

Vi fÄr fÞlgende:

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:

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:

Nu skal vi generere koden Fil->Generer

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:

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_1Alt 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:
makeProgrammet vil blive kompilere i mappen ~\/DeviceServers.
tango-cs@tangobox:~\/DeviceServers$ ls
NEO6MJIVE
jive
Der er allerede nogle enheder i databasen, lad os nu oprette vores Rediger->Opret server

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

Intet vil fungere, fĂžrst skal vi starte vores program:
sudo .\/NEO6M neo6m -v2At oprette forbindelse til com-porten krĂŠver jeg kun at have rettigheder root-a. v â logningsniveau.
Nu kan vi oprette forbindelse:

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*53Vi 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
