Það er kerfi til að stjórna ýmsum vélbúnaði og hugbúnaði.
TANGO styður nú 4 palla: Linux, Windows NT, Solaris og HP-UX.
Hér munum við lýsa því að vinna með Linux (Ubuntu 18.04)
Til hvers er það?
Einfaldar vinnu með ýmsum búnaði og hugbúnaði.
Þú þarft ekki að hugsa um hvernig á að geyma gögn í gagnagrunninum, það er nú þegar gert fyrir þig.
Það er aðeins nauðsynlegt að lýsa vélbúnaði fyrir mælingarskynjara.
Ég gat ekki ræst það frá frumkóðann; ég notaði tilbúna mynd af TangoBox 9.3 til að vinna.
Leiðbeiningarnar lýsa því hvernig á að setja upp úr pakka.
Í hverju felst það?
JIVE — notað til að skoða og breyta TANGO gagnagrunninum.
POGO — kóðarafall fyrir TANGO tækjaþjóna.
Astor — dagskrárstjóri TANGO kerfisins.
Við munum aðeins hafa áhuga á fyrstu tveimur hlutunum.
Stuðningur við forritunarmál
C
C + +
Java
JavaScript
Python
matlab
LabVIEW
Ég vann með það í python & c++. Hér verður C++ notað sem dæmi.
Nú skulum við fara að lýsingu á því hvernig á að tengja tækið við TANGO og hvernig á að vinna með það. Gjaldið verður tekið sem dæmi GPS neo-6m-0-001:
Eins og þú sérð á myndinni tengjum við borðið við tölvuna í gegnum UART CP2102. Þegar það er tengt við tölvu birtist tækið /dev/ttyUSB[0-N], venjulega /dev/ttyUSB0.
POGO
Nú skulum við ræsa Pogo, og búa til beinagrind kóða til að vinna með stjórninni okkar.
pogo
Ég bjó nú þegar til kóðann, við skulum búa hann til aftur Skrá->Nýtt.
Við fáum eftirfarandi:
Tækið okkar (í framtíðinni, með tæki munum við meina hugbúnaðarhlutann) er tómt og hefur tvær stjórnskipanir: State & Staða.
Það verður að vera fyllt með nauðsynlegum eiginleikum:
Eign tækis - sjálfgefin gildi sem við flytjum yfir í tækið til að frumstilla það; fyrir GPS borðið þarftu að flytja nafn borðsins í kerfinu com="/dev/ttyUSB0" og com port hraði baudrade=9600
Skipanir — skipanir til að stjórna tækinu okkar; hægt er að gefa þeim rök og skilagildi.
STATE - skilar núverandi ástandi, frá States
STATUS - skilar núverandi stöðu, þetta er viðbót strengsins við STATE
GPSArray - skilar GPS streng í formi DevVarCharArray
Næst skaltu stilla eiginleika tækisins sem hægt er að lesa/skrifa til/frá því. Scalar eiginleikar - einfaldir eiginleikar (bleikja, strengur, langur osfrv.) Litrófseiginleikar - einvíddar fylki Myndareiginleikar - tvívíð fylki
States — ástandið sem tækið okkar er í.
OPEN — tækið er opið.
LOKA - tækið er lokað.
MIKIÐ - villa.
ON — taka á móti gögnum úr tækinu.
OFF — engin gögn úr tækinu.
Dæmi um að bæta við eigind gps_strengur:
Kjörtímabil tími í ms, hversu oft gps_string gildið verður uppfært. Ef uppfærslutíminn er ekki tilgreindur verður eigindin aðeins uppfærð sé þess óskað.
Það reyndist:
Nú þarftu að búa til kóðann Skrá->Búa til
Sjálfgefið er að Makefile er ekki búið til; í fyrsta skipti sem þú þarft að haka í reitinn til að búa hana til. Þetta er gert til að breytingarnar sem gerðar eru á henni verði ekki eytt á nýrri kynslóð. Eftir að hafa búið það til einu sinni og stillt það fyrir verkefnið þitt (skrá safnlykla, viðbótarskrár), geturðu gleymt því.
Nú skulum við halda áfram að forritun. pogo með bjó til eftirfarandi fyrir okkur:
Við munum hafa áhuga á NEO6M.cpp & NEO6M.h. Við skulum taka dæmi um bekkjasmið:
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ð er þarna og hvað er mikilvægt hér? Init_device() aðgerðin úthlutar minni fyrir eiginleika okkar: gps_strengur & gps_fylki, en það er ekki mikilvægt. Það mikilvægasta hér, þetta eru athugasemdirnar:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Allt sem er inni í þessum athugasemdareit verður ekki innifalið í pogo við síðari kóða endurnýjun flytja í burtu!. Allt sem er ekki í blokkum verður! Þetta eru staðirnir þar sem við getum forritað og gert okkar eigin breytingar.
Nú hver eru helstu aðgerðir sem bekkurinn inniheldur? NEO6M:
Þegar við viljum lesa eigindargildið gps_strengur, föllin verða kölluð í eftirfarandi röð: alltaf_framkvæmd_krók, read_attr_hardware и lesa_gps_streng. Read_gps_string mun fylla gps_string með gildinu.
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
}
Samantekt
Farðu í upprunamöppuna og:
make
Forritið verður sett saman í ~/DeviceServers möppuna.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
JIVE
jive
Það eru nú þegar nokkur tæki í gagnagrunninum, við skulum nú búa til okkar Breyta-> Búa til netþjón
Nú skulum við reyna að tengjast því:
Ekkert mun virka, fyrst þurfum við að keyra forritið okkar:
sudo ./NEO6M neo6m -v2
Ég get aðeins tengst com tenginu með réttindum rót-A. v - skráningarstig.
Nú getum við tengt:
Viðskiptavinur
Í grafík er vissulega gott að skoða myndir, en þú þarft eitthvað gagnlegra. Við skulum skrifa viðskiptavin sem mun tengjast tækinu okkar og taka lestur úr því.
#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);
}
}