Гэта сістэма для кіравання розным абсталяваннем і праграмным забеспячэннем.
TANGO падтрымлівае 4 платформы на дадзены момант: Linux, Windows NT, Solaris і HP-UX.
Тут будзе апісана праца з Linux(Ubuntu 18.04)
Навошта трэба?
Спрашчае працу з розным абсталяваннем і софтам.
Вам не трэба думаць пра тое, як захоўваць дадзеныя ў БД, гэта ўжо зроблена за Вас.
З зыходнікаў не змог яе запусціць, для працы выкарыстаў гатовую выяву TangoBox 9.3.
У інструкцыі апісана як ставіць з пакетаў.
З чаго яна складаецца?
ДЖАЙВ - служыць для прагляду і рэдагавання базы дадзеных TANGO.
Пагога - Генератар кода для сервераў прылад TANGO.
Астор - Праграмны менеджэр для сістэмы TANGO.
Нас будуць цікавіць толькі першыя два кампаненты.
Падтрымліваюцца мовы праграмавання
C
C + +
ява
JavaScript
Пітон
Матлаб
LabVIEW
Я працаваў з ей на python & c++. Тут у якасці прыкладу будзе выкарыстоўвацца c++.
Цяпер пяройдзем да апісання як падлучыць прыладу да TANGO і як з ім працаваць. У якасці прыкладу будзе ўзята плата GPS neo-6m-0-001:
Як відаць на малюнку поплатак да ПК падлучальны праз UART CP2102. Пры падлучэнні да ПК з'яўляецца прылада /dev/ttyUSB[0-N], звычайна /dev/ttyUSB0.
Пагога
Цяпер запусцім палярны геафізічныя спадарожнік, і з генеруючы шкілет код для працы з нашай платай.
pogo
У мяне ўжо быў створаны код, створым яго нанова File->New.
Атрымліваем наступнае:
Наша прылада (пад прыладай у далейшым будзе мець на ўвазе праграмная частка) пустое і мае дзве каманды кіравання: стан & Стан.
Яго трэба запоўніць неабходнымі атрыбутамі:
Device Property - значэнні па змаўчанні якія перадаем у прыладу для яго ініцыялізацыі, для платы GPS трэба перадаць імя платы ў сістэме com="/dev/ttyUSB0" і хуткасць com порта baudrade=9600
Каманды - каманды кіравання нашай прыладай, ім можна задаць аргументы і якое вяртаецца значэнне.
СТАН - вяртае бягучы стан, з Штаты
СТАТУС — вяртае бягучы статус, гэта радковы дадатак да СТАН
GPSArray - вяртае GPS радок у выглядзе DevVarCharArray
Далей задаюцца атрыбуты прылады якія можна чытаць/пісаць у/з яго. Scalar Attributes - простыя атрыбуты (char, string, long і да т.п.) Spectrum Attributes - аднамерныя масівы Image Attributes - Двухмерныя масівы
Штаты - станы ў якім знаходзіцца наша прылада.
АДКРЫТЫ - Прылада адкрыта.
Зачыніць - Прылада зачынена.
FAILT - памылка.
ON - прымаем дадзеныя з прылады.
OFF - няма дадзеных з прылады.
Прыклад дадання атрыбуту gps_string:
Polling period час у мс, як часта будзе абнаўляцца значэнне gps_string. Калі час абнаўлення не задаць, то атрыбут будзе абнаўляцца толькі па запыце.
Атрымалася:
Цяпер трэба з генераваць код File->Generate
Па змаўчанні Makefile не генеруецца, упершыню неабходна паставіць галачку што б яго стварыць. Гэта зроблена для таго, каб унесеныя ў яго праўкі не выдаляліся пры новай генерацыі. Стварыўшы яго аднойчы і наладзіўшы пад свой праект(прапісаць ключы кампіляцыі, доп. файлы) можна забыцца пра яго.
Цяпер пераходзім непасрэдна да праграмавання. pogo з генераваў нам наступнае:
Нас будуць цікавіць 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
Усё, што знаходзіцца ўнутры гэтага блока каментара пры наступных перагенерацыя кода ў pogo не будзе выдаляцца!. Усё, што ў не блоках будзе! Гэта тыя месцы, дзе мы можам праграмаваць і ўносіць свае праўкі.
Калі мы захочам прачытаць значэнне атрыбуту gps_string, будуць выкліканыя функцыі ў наступным парадку: always_executed_hook, 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
}
Кампіляцыя
Заходзім у тэчку з зыходнікамі і:
make
Праграма скампілюецца ў тэчку ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
ДЖАЙВ
jive
У БД ужо ёсць нейкія прылады, створым зараз наша Edit->Create Server
Цяпер паспрабуем падключыцца да яго:
Ні чаго не выйдзе, спачатку трэба запусціць нашу праграму:
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);
}
}