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.
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:
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
Jeg har allerede oprettet koden, lad os oprette den igen Fil->Ny.
Vi får følgende:
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:
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:
Nu skal du generere koden Fil->Generer
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:
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.
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
Der er allerede nogle enheder i databasen, lad os nu oprette vores Rediger->Opret server
Lad os nu prøve at oprette forbindelse til det:
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:
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);
}
}