Tango Controls

Tango Controls

Што такое TANGO?

Гэта сістэма для кіравання розным абсталяваннем і праграмным забеспячэннем.
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:

Tango Controls

Як відаць на малюнку поплатак да ПК падлучальны праз UART CP2102. Пры падлучэнні да ПК з'яўляецца прылада /dev/ttyUSB[0-N], звычайна /dev/ttyUSB0.

Пагога

Цяпер запусцім палярны геафізічныя спадарожнік, і з генеруючы шкілет код для працы з нашай платай.

pogo

Tango Controls

У мяне ўжо быў створаны код, створым яго нанова File->New.

Tango Controls

Атрымліваем наступнае:

Tango Controls

Наша прылада (пад прыладай у далейшым будзе мець на ўвазе праграмная частка) пустое і мае дзве каманды кіравання: стан & Стан.

Яго трэба запоўніць неабходнымі атрыбутамі:

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:

Tango Controls

Polling period час у мс, як часта будзе абнаўляцца значэнне gps_string. Калі час абнаўлення не задаць, то атрыбут будзе абнаўляцца толькі па запыце.

Атрымалася:

Tango Controls

Цяпер трэба з генераваць код File->Generate

Tango Controls

Па змаўчанні Makefile не генеруецца, упершыню неабходна паставіць галачку што б яго стварыць. Гэта зроблена для таго, каб унесеныя ў яго праўкі не выдаляліся пры новай генерацыі. Стварыўшы яго аднойчы і наладзіўшы пад свой праект(прапісаць ключы кампіляцыі, доп. файлы) можна забыцца пра яго.

Цяпер пераходзім непасрэдна да праграмавання. pogo з генераваў нам наступнае:

Tango Controls

Нас будуць цікавіць 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 не будзе выдаляцца!. Усё, што ў не блоках будзе! Гэта тыя месцы, дзе мы можам праграмаваць і ўносіць свае праўкі.

Цяпер якія галоўныя функцыі змяшчае клас NEO6M:

void always_executed_hook();
void read_attr_hardware(vector<long> &attr_list);
void read_gps_string(Tango::Attribute &attr);
void read_gps_array(Tango::Attribute &attr);

Калі мы захочам прачытаць значэнне атрыбуту 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

Tango Controls

У БД ужо ёсць нейкія прылады, створым зараз наша Edit->Create Server

Tango Controls

Цяпер паспрабуем падключыцца да яго:

Tango Controls

Ні чаго не выйдзе, спачатку трэба запусціць нашу праграму:

sudo ./NEO6M neo6m -v2

Падключыцца да com порце ў мяне можна толькі з правамі корань-а. v - узровень лагіравання.

Цяпер можам падключыцца:

Tango Controls

Кліент

У графіцы глядзець на карцінкі вядома добра, але трэба нешта больш карыснае. Напішам кліент які будзе падлучацца да нашай прылады і забіраць з яе паказанні.

#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);
    }
}

Як кампіляваць:

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++

Вынік:

tango-cs@tangobox:~/workspace/c$ ./a.out 
$GPRMC,,V,,,,,,,,,,N*53

$GPRMC,,V,,,,,,,,,,N*53

$GPRMC,,V,,,,,,,,,,N*53

Атрымалі вынік у якасці вяртання каманды, узяцця атрыбутаў радка і масіва сімвалаў.

Спасылкі

Артыкул пісаў для сябе, таму што праз некаторы час пачынаю забываць як і што рабіць.

Дзякуй за ўвагу.

Крыніца: habr.com

Дадаць каментар