Det er et system for å administrere diverse maskinvare og programvare.
TANGO støtter for tiden 4 plattformer: Linux, Windows NT, Solaris og HP-UX.
Her vil vi beskrive arbeidet med Linux (Ubuntu 18.04)
Hva er den til?
Forenkler arbeidet med diverse utstyr og programvare.
Du trenger ikke tenke på hvordan du lagrer data i databasen, det er allerede gjort for deg.
Det er bare nødvendig å beskrive mekanismen for pollingsensorer.
Jeg kunne ikke starte den fra kildekoden; Jeg brukte et ferdig bilde av TangoBox 9.3 for å fungere.
Instruksjonene beskriver hvordan du installerer fra pakker.
Hva består den av?
jive — brukes til å vise og redigere TANGO-databasen.
POGO — kodegenerator for TANGO-enhetsservere.
Astor — programleder for TANGO-systemet.
Vi vil bare være interessert i de to første komponentene.
Støttede programmeringsspråk
C
C + +
Java
Javascript
Python
matlab
LabVIEW
Jeg jobbet med det i python og c++. Her vil C++ bli brukt som eksempel.
La oss nå gå videre til en beskrivelse av hvordan du kobler enheten til TANGO og hvordan du arbeider med den. Gebyret vil bli tatt som eksempel GPS neo-6m-0-001:
Som du kan se på bildet kobler vi brettet til PC-en via UART CP2102. Når den er koblet til en PC, vises enheten /dev/ttyUSB[0-N], vanligvis /dev/ttyUSB0.
POGO
La oss nå starte pogo, og generer skjelettkode for å jobbe med brettet vårt.
pogo
Jeg har allerede laget koden, la oss lage den på nytt Fil->Ny.
Vi får følgende:
Enheten vår (i fremtiden vil vi med enhet mene programvaredelen) er tom og har to kontrollkommandoer: Tilstand & status.
Den må fylles med de nødvendige attributtene:
Enhetsegenskap — standardverdier som vi overfører til enheten for å initialisere den; for GPS-kortet må du overføre navnet på brettet i systemet com="/dev/ttyUSB0" og com-porthastighet baudrade=9600
Kommandoer — kommandoer for å kontrollere enheten vår; de kan gis argumenter og en returverdi.
STAT - returnerer gjeldende tilstand, fra Stater
STATUS - returnerer gjeldende status, dette er strengens komplement til STAT
GPSArray - returnerer gps streng i skjemaet DevVarCharArray
Angi deretter enhetsattributtene som kan leses/skrives til/fra den. Skalære attributter - enkle attributter (char, string, long, etc.) Spektrumattributter - endimensjonale arrays Bildeattributter - todimensjonale arrays
Stater — tilstanden enheten vår befinner seg i.
ÅPNE — enheten er åpen.
CLOSE - enheten er lukket.
FEIL - feil.
ON — motta data fra enheten.
AV — ingen data fra enheten.
Eksempel på å legge til et attributt gps_string:
Avstemningsperiode tid i ms, hvor ofte gps_string-verdien vil bli oppdatert. Hvis oppdateringstiden ikke er spesifisert, oppdateres attributtet kun på forespørsel.
Det viste seg:
Nå må du generere koden Fil->Generer
Som standard genereres ikke Makefilen; første gang må du merke av i boksen for å opprette den. Dette gjøres slik at endringene som er gjort på den ikke slettes i løpet av en ny generasjon. Etter å ha opprettet det en gang og konfigurert det for prosjektet ditt (registrer kompileringsnøkler, tilleggsfiler), kan du glemme det.
La oss nå gå videre til programmering. pogo med genererte følgende for oss:
Vi vil være interessert i NEO6M.cpp & NEO6M.h. La oss ta 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
}
Hva finnes og hva er viktig her? Funksjonen init_device() tildeler minne for våre attributter: gps_string & gps_array, men det er ikke viktig. Det viktigste her, dette er kommentarene:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Alt som er inne i denne kommentarblokken vil ikke bli inkludert i pogo under påfølgende koderegenereringer Flytt deg!. Alt som ikke er i blokker blir det! Dette er stedene hvor vi kan programmere og gjøre våre egne redigeringer.
Hva er hovedfunksjonene klassen inneholder? NEO6M:
Når vi ønsker å lese attributtverdien gps_string, vil funksjonene kalles opp i følgende rekkefølge: alltid_utført_krok, read_attr_hardware и read_gps_string. Read_gps_string vil fylle gps_string med verdien.
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 bli kompilert i mappen ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
jive
jive
Det er allerede noen enheter i databasen, la oss nå lage våre Rediger->Opprett server
La oss nå prøve å koble til den:
Ingenting vil fungere, først må vi kjøre programmet vårt:
sudo ./NEO6M neo6m -v2
Jeg kan bare koble til com-porten med rettigheter root-EN. v - loggingsnivå.
Nå kan vi koble til:
kunde
I grafikk er det absolutt bra å se på bilder, men du trenger noe mer nyttig. La oss skrive en klient som kobler til enheten vår og tar avlesninger 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);
}
}