Бул ар кандай аппараттык жана программалык камсыздоону башкаруу системасы.
TANGO учурда 4 платформаны колдойт: Linux, Windows NT, Solaris жана HP-UX.
Бул жерде биз Linux менен иштөөнү сүрөттөп беребиз (Ubuntu 18.04)
Бул эмне үчүн?
Ар кандай жабдуулар жана программалык камсыздоо менен иштөөнү жеңилдетет.
Маалыматтар базасында маалыматтарды кантип сактоо керектиги жөнүндө ойлонуунун кажети жок, ал сиз үчүн мурунтан эле жасалган.
Бул сенсорлорду добуш берүү механизмин сүрөттөп берүү үчүн гана зарыл.
Мен аны баштапкы коддон ишке киргизе алган жокмун, мен иштөө үчүн TangoBox 9.3 дун даяр сүрөтүн колдондум.
Нускамалар пакеттерден кантип орнотууну сүрөттөйт.
ал турат, эмне кылат?
jive — TANGO маалымат базасын көрүү жана оңдоо үчүн колдонулат.
POGO — TANGO түзмөгүнүн серверлери үчүн код генератору.
Astor — TANGO системасынын программалык менеджери.
Бизди биринчи эки компонент гана кызыктырат.
Колдоого алынган программалоо тилдери
C
C ++
Java
JavaScript
Python
MATLAB
LabVIEW
Мен аны менен python & c++ менен иштедим. Бул жерде C++ мисал катары колдонулат.
Эми аппаратты TANGOго кантип туташтыруу жана аны менен кантип иштөө керектигинин сүрөттөлүшүнө өтөбүз. Мисал катары төлөм алынат GPS neo-6m-0-001:
Сүрөттө көрүнүп тургандай, тактаны компьютерге UART CP2102 аркылуу туташтырабыз. Компьютерге туташтырылганда, аппарат пайда болот /dev/ttyUSB[0-N], адатта /dev/ttyUSB0.
POGO
Эми ишке киргизели пого, жана биздин такта менен иштөө үчүн скелет кодун түзүңүз.
pogo
Мен мурунтан эле кодду түздүм, аны кайра түзөлү Файл->Жаңы.
Биз төмөнкүлөрдү алабыз:
Биздин аппарат (келечекте, аппарат менен биз программалык камсыздоо бөлүгүн билдирет) бош жана эки башкаруу буйругу бар: мамлекет & абал.
Ал керектүү атрибуттар менен толтурулушу керек:
Түзмөк касиети — демейки маанилер, биз аны GPS тактасы үчүн инициализациялоо үчүн, сиз тутумдагы тактанын атын өткөрүп беришиңиз керек; com="/dev/ttyUSB0" жана com порт ылдамдыгы baudrade = 9600
буйруктары — биздин аппаратты башкаруу үчүн буйруктар, аларга аргументтер жана кайтаруу мааниси берилиши мүмкүн;
МАМЛЕКЕТТИК - учурдагы абалын кайтарат, тартып States
АБАЛЫ - учурдагы абалды кайтарат, бул саптын толуктоосу МАМЛЕКЕТТИК
GPSArray - кайтып келет GPS формадагы сап DevVarCharArray
Андан кийин, ага/окууга/жазууга мүмкүн болгон аспаптын атрибуттарын коюңуз. Скалярдык атрибуттар — жөнөкөй атрибуттар (чар, сап, узун ж.б.) Спектрдин атрибуттары - бир өлчөмдүү массивдер Сүрөттүн атрибуттары - эки өлчөмдүү массивдер
States — биздин аппаратыбыз жайгашкан мамлекет.
OPEN — аппарат ачык.
ЖАБУУ - аппарат жабык.
FAILT - ката.
ON — аппараттан маалыматтарды алуу.
OFF — аппараттан маалымат жок.
Атрибут кошуунун мисалы gps_string:
Добуш берүү мезгили убакыт мс менен, gps_string мааниси канчалык көп жаңыртылат. Эгерде жаңыртуу убактысы көрсөтүлбөсө, атрибут сурам боюнча гана жаңыланат.
Болду:
Эми сиз кодду түзүшүңүз керек Файл-> Түзүү
Демейки боюнча, Makefile түзүлбөйт, аны түзүү үчүн кутучаны биринчи жолу белгилешиңиз керек. Бул ага киргизилген өзгөртүүлөр жаңы муун учурунда жок кылынбашы үчүн жасалат. Аны бир жолу түзүп, аны долбооруңуз үчүн конфигурациялагандан кийин (каттоо компиляция ачкычтары, кошумча файлдар), сиз бул жөнүндө унутуп койсоңуз болот.
Эми программалоону уланталы. пого менен биз үчүн төмөнкүлөрдү жаратты:
Биз NEO6M.cpp & NEO6M.h кызыкдар болот. Класстын конструкторунун мисалын алалы:
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
}
Бул жерде эмне бар жана эмне маанилүү? init_device() функциясы биздин атрибуттар үчүн эстутумду бөлөт: gps_string & gps_array, бирок бул маанилүү эмес. Бул жерде эң негизгиси, бул комментарийлер:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Бул комментарий блогунун ичиндеги нерселердин баары кийинки кодду калыбына келтирүү учурунда погого киргизилбейт кет!. Блокторго кирбегендин баары болот! Булар биз программалап, өзүбүздүн түзөтүүлөрдү жасай ала турган жерлер.
Биз атрибуттун маанисин окугубуз келгенде gps_string, функциялар төмөнкү тартипте чакырылат: ар дайым_аткарылган_илмек, read_attr_hardware и read_gps_string. Read_gps_string gps_string маанисин толтурат.
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
}
Compilation
Булак папкасына өтүңүз жана:
make
Программа ~/DeviceServers папкасына түзүлөт.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
jive
jive
Маалыматтар базасында буга чейин кээ бир түзмөктөр бар, келгиле, өзүбүздүкүн түзөлү Түзөтүү->Сервер түзүү
Эми ага кошулууга аракет кылалы:
Эч нерсе иштебейт, адегенде программабызды иштетишибиз керек:
sudo ./NEO6M neo6m -v2
Мен укуктар менен com портуна гана туташа алам тамыр-А. 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);
}
}