
Vad Àr ?
Det hÀr Àr ett system för att hantera olika utrustningar och programvara.
TANGO stöder för nÀrvarande 4 plattformar: Linux, Windows NT, Solaris och HP-UX.
HĂ€r kommer arbetet med Linux (Ubuntu 18.04) att beskrivas.
Vad behövs det för?
Det förenklar arbetet med olika utrustningar och mjukvara.
- Du behöver inte tÀnka pÄ hur du lagrar data i databasen, det Àr redan gjort Ät dig.
- Det enda som behövs Àr att beskriva mekanismen för att frÄga sensorer.
- Det samlar all din kod till en standard.
Var kan man fÄ det?
Jag kunde inte starta den frÄn kÀllkoden, jag anvÀnde den fÀrdiga TangoBox 9.3-bilden.
I instruktionerna beskrivs hur man installerar frÄn paketen.
Vad bestÄr den av?
- JIVE â anvĂ€nds för att visa och redigera TANGO-databasen.
- POGO â en kodgenerator för TANGO-enhetsservrar.
- Astor â programhanterare för TANGO-systemet.
Vi kommer endast att intressera oss för de tvÄ första komponenterna.
Stödda programmeringssprÄk
- C
- C++
- Java
- JavaScript
- Python
- Matlab
- LabVIEW
Jag har arbetat med den i Python & c++. HÀr kommer c++ att anvÀndas som exempel.
Nu gÄr vi vidare till beskrivningen av hur man ansluter en enhet till TANGO och hur man arbetar med den. Som exempel kommer ett kort GPS neo-6m-0-001:

Som bildligt visar ansluter vi kortet till PC:n via UART CP2102. NÀr det Àr anslutet till PC:n visas enheten /dev/ttyUSB[0-N], vanligtvis /dev/ttyUSB0.
POGO
Nu startar vi. pogo, och vi skapar skelettkoden för att arbeta med vÄrt kort.
pogo
Jag hade redan skapat koden, lÄt oss skapa den pÄ nytt File->New.

Vi fÄr följande:

VÄr enhet (under enheten avses hÀr den programmÀssiga delen) Àr tom och har tvÄ kommandon för kontroll: State & Status.
Den behöver fyllas med nödvÀndiga attribut:
Device Property â standardvĂ€rden som vi skickar till enheten för initiering, för GPS-kortet mĂ„ste vi skicka kortets namn i systemet com="/dev/ttyUSB0" och hastigheten pĂ„ COM-porten baudrate=9600
Commands â kommandon för att styra vĂ„r enhet, de kan ges argument och returvĂ€rden.
- STATE â returnerar det aktuella tillstĂ„ndet, frĂ„n States
- STATUS â returnerar aktuell status, detta Ă€r en strĂ€ng som lĂ€ggs till STATE
- GPSArray â returnerar gps en strĂ€ng i form av DevVarCharArray
DÀrefter anges attributen för enheten som kan lÀsas/skrivas till/frÄn.
Scalar Attributes â enkla attribut (char, string, long osv.)
Spectrum Attributes â endimensionella arrayer
Image Attributes â tvĂ„dimensionella arrayer
States â tillstĂ„ndet för vĂ„r enhet.
- OPEN â enheten Ă€r öppen.
- CLOSE â enheten Ă€r stĂ€ngd.
- FAILT â fel.
- PĂ â vi tar emot data frĂ„n enheten.
- AV â det finns ingen data frĂ„n enheten.
Exempel pÄ att lÀgga till attribut gps_string:

Polling period tiden i ms, hur ofta vÀrdet för gps_string ska uppdateras. Om ingen uppdateringstid anges kommer attributet endast att uppdateras pÄ begÀran.
Det lyckades:

Nu behöver vi generera koden Fil->Generera

Som standard genereras ingen Makefile, vid första gÄngen mÄste du markera rutan för att skapa den. Detta görs sÄ att Àndringar som görs i den inte tas bort vid ny generation. NÀr den har skapats en gÄng och anpassats för ditt projekt (ange kompilationsnycklar, ytterligare filer) kan du glömma den.
Nu gÄr vi direkt till programmeringen. pogo har genererat följande:

Vi kommer att intressera oss för NEO6M.cpp & NEO6M.h. LÄt oss titta pÄ konstruktören för klassen som exempel:
NEO6M::NEO6M(Tango::DeviceClass *cl, string &s)
: TANGO_BASE_CLASS(cl, s.c_str())
{
/*----- SKYDDAD REGION ID(NEO6M::constructor_1) AKTIVERAD START -----*/
init_device();
/*----- SKYDDAD REGION SLUT -----*/ // NEO6M::constructor_1
}Vad finns hÀr och vad Àr det viktigaste? I funktionen init_device() allokeras minne för vÄra attribut: gps_string & gps_array, men det Àr oviktigt. Det viktigaste hÀr, Àr kommentarerna:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Allt som finns inom detta kommentarblock kommer vid framtida nygenereringar av koden i pogo inte att tas bort!. Allt som Àr i icke-block kommer att! Det hÀr Àr platser dÀr vi kan programmera och göra vÄra Àndringar.
Nu vilka huvudsakliga funktioner innehÄller klassen NEO6M:
void always_executed_hook();
void read_attr_hardware(vector &attr_list);
void read_gps_string(Tango::Attribute &attr);
void read_gps_array(Tango::Attribute &attr);NÀr vi vill lÀsa vÀrdet pÄ ett attribut gps_string, kommer funktionerna att anropas i följande ordning: always_executed_hook, read_attr_hardware och read_gps_string. I read_gps_string kommer gps_string att fyllas med vÀrde.
void NEO6M::read_gps_string(Tango::Attribute &attr)
{
DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) entering... " <attr_gps_string_read = Tango::string_dup(this->gps.c_str());
attr.set_value(attr_gps_string_read);
/*----- SKYDDAD REGION SLUT -----*/ // NEO6M::read_gps_string
}Kompilering
GÄ in i mappen med kÀllkoden och:
makeProgrammet kommer att kompileras i mappen ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
I databasen finns redan nÄgra enheter, lÄt oss nu skapa vÄr Redigera->Skapa server

Nu lÄt oss försöka ansluta till den:

Det kommer inte att fungera, först mÄste vi starta vÄrt program:
sudo ./NEO6M neo6m -v2Anslutning till com-porten kan jag bara göra med rĂ€ttigheter root-a. v â loggningsnivĂ„.
Nu kan vi ansluta:

Klient
Att titta pÄ bilder i diagrammet Àr visserligen bra, men vi behöver nÄgot mer anvÀndbart. LÄt oss skriva en klient som kopplar upp sig mot vÄr enhet och hÀmtar dess mÀtvÀrden.
#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Ä hÀr kompilerar du:
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++Resultatet:
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53Vi fick resultatet som en retur frÄn kommandot, hÀmtade attributen av strÀngen och arrayen av tecken.
LĂ€nkar
Jag skrev artikeln för mig sjÀlv, för efter ett tag börjar jag glömma hur och vad man ska göra.
Tack för uppmÀrksamheten.
KĂ€lla: habr.com
