Det är ett system för att hantera olika hård- och mjukvara.
TANGO stöder för närvarande fyra plattformar: Linux, Windows NT, Solaris och HP-UX.
Här kommer vi att beskriva att arbeta med Linux (Ubuntu 18.04)
Vad är det för?
Förenklar arbetet med diverse utrustning och mjukvara.
Du behöver inte tänka på hur du lagrar data i databasen, det är redan gjort åt dig.
Det är bara nödvändigt att beskriva mekanismen för pollingsensorer.
Jag kunde inte starta den från källkoden; jag använde en färdig bild av TangoBox 9.3 för att fungera.
Instruktionerna beskriver hur man installerar från paket.
Vad består den av?
JIVE — används för att visa och redigera TANGO-databasen.
POGO — Kodgenerator för TANGO-enhetsservrar.
Astor — Programledare för TANGO-systemet.
Vi kommer bara att vara intresserade av de två första komponenterna.
Programmeringsspråk som stöds
C
C + +
java
JavaScript
Python
matlab
LabVIEW
Jag arbetade med det i python & c++. Här kommer C++ att användas som exempel.
Låt oss nu gå vidare till en beskrivning av hur man ansluter enheten till TANGO och hur man arbetar med den. Avgiften kommer att tas som exempel GPS neo-6m-0-001:
Som du kan se på bilden ansluter vi kortet till PC:n via UART CP2102. När enheten är ansluten till en dator visas enheten /dev/ttyUSB[0-N], vanligtvis /dev/ttyUSB0.
POGO
Låt oss nu starta pogo, och generera skelettkod för att arbeta med vår styrelse.
pogo
Jag har redan skapat koden, låt oss skapa den igen Arkiv->Ny.
Vi får följande:
Vår enhet (i framtiden, med enhet kommer vi att mena mjukvarudelen) är tom och har två kontrollkommandon: Ange & status.
Den måste fyllas med de nödvändiga attributen:
Enhetsegenskap — standardvärden som vi överför till enheten för att initiera den; för GPS-kortet måste du överföra namnet på kortet i systemet com="/dev/ttyUSB0" och com-porthastighet baudrade=9600
Kommandon — kommandon för att styra vår enhet; de kan ges argument och ett returvärde.
STAT - returnerar det aktuella läget, från Stater
STATUS - returnerar aktuell status, detta är strängens komplement till STAT
GPSArray - returnerar gps sträng i formuläret DevVarCharArray
Ställ sedan in enhetsattributen som kan läsas/skrivas till/från den. Skalära attribut — enkla attribut (char, string, long, etc.) Spektrumattribut - endimensionella arrayer Bildattribut - tvådimensionella arrayer
Stater — i vilket tillstånd vår enhet befinner sig.
ÖPPEN — enheten är öppen.
NÄRA — enheten är stängd.
FEL - fel.
ON — ta emot data från enheten.
AV — inga data från enheten.
Exempel på att lägga till ett attribut gps_string:
Valperiod tid i ms, hur ofta gps_string-värdet kommer att uppdateras. Om uppdateringstiden inte anges kommer attributet att uppdateras endast på begäran.
Hände:
Nu måste du generera koden Arkiv->Generera
Som standard genereras inte Makefilen; första gången måste du markera rutan för att skapa den. Detta görs för att de ändringar som gjorts i den inte ska raderas under en ny generation. Efter att ha skapat det en gång och konfigurerat det för ditt projekt (registrera kompileringsnycklar, ytterligare filer), kan du glömma det.
Låt oss nu gå vidare till programmering. pogo med genererade följande åt oss:
Vi kommer att vara intresserade av NEO6M.cpp & NEO6M.h. Låt oss ta ett exempel på en klasskonstruktor:
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
}
Vad finns där och vad är viktigt här? Funktionen init_device() allokerar minne för våra attribut: gps_string & gps_array, men det är inte viktigt. Det viktigaste här, dessa är kommentarerna:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Allt som finns i det här kommentarsblocket kommer inte att inkluderas i pogo under efterföljande kodregenerering flytta på dig!. Allt som inte är i block kommer att vara! Det här är platserna där vi kan programmera och göra våra egna redigeringar.
Vilka är nu huvudfunktionerna som klassen innehåller? NEO6M:
När vi vill läsa attributvärdet gps_string, kommer funktionerna att anropas i följande ordning: alltid_exekverad_krok, read_attr_hardware и read_gps_string. Read_gps_string kommer att fylla gps_string med värdet.
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
}
Kompilering
Gå till källmappen och:
make
Programmet kommer att kompileras till mappen ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
JIVE
jive
Det finns redan några enheter i databasen, låt oss nu skapa våra Redigera->Skapa server
Låt oss nu försöka ansluta till den:
Inget kommer att fungera, först måste vi köra vårt program:
sudo ./NEO6M neo6m -v2
Jag kan bara ansluta till com-porten med rättigheter rots. v — loggningsnivå.
Nu kan vi ansluta:
kund
Inom grafik är det säkert bra att titta på bilder, men du behöver något mer användbart. Låt oss skriva en klient som kommer att ansluta till vår enhet och ta avläsningar från 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);
}
}