Controles de tango

Controles de tango

o que TANGO?

É um sistema para gerenciar diversos hardwares e softwares.
TANGO atualmente suporta 4 plataformas: Linux, Windows NT, Solaris e HP-UX.
Aqui descreveremos como trabalhar com Linux (Ubuntu 18.04)

O que é isso?

Simplifica o trabalho com diversos equipamentos e softwares.

  • Você não precisa pensar em como armazenar dados no banco de dados, isso já está feito para você.
  • É necessário apenas descrever o mecanismo de sondagem dos sensores.
  • Reduz todo o seu código a um padrão.

Onde chegar?

Não consegui iniciá-lo a partir do código-fonte; usei uma imagem pronta do TangoBox 9.3 para funcionar.
As instruções descrevem como instalar a partir de pacotes.

Em que consiste?

  • JIVE — usado para visualizar e editar o banco de dados TANGO.
  • POGO — gerador de código para servidores de dispositivos TANGO.
  • Astor — gestor do programa do sistema TANGO.

Estaremos interessados ​​apenas nos dois primeiros componentes.

Linguagens de programação suportadas

  • C
  • C + +
  • Java
  • JavaScript
  • Python
  • Matlab
  • LabVIEW

Trabalhei com isso em python e c++. Aqui C++ será usado como exemplo.

Agora vamos descrever como conectar o dispositivo ao TANGO e como trabalhar com ele. A taxa será tomada como exemplo GPS neo-6m-0-001:

Controles de tango

Como você pode ver na imagem, conectamos a placa ao PC via UART CP2102. Quando conectado a um PC, o dispositivo aparece /dev/ttyUSB[0-N], geralmente /dev/ttyUSB0.

POGO

Agora vamos lançar pogoe gerar código esqueleto para trabalhar com nossa placa.

pogo

Controles de tango

Já criei o código, vamos criá-lo novamente Ficheiro->Novo.

Controles de tango

Obtemos o seguinte:

Controles de tango

Nosso dispositivo (no futuro, por dispositivo entenderemos a parte do software) está vazio e possui dois comandos de controle: Estado & Status.

Deve ser preenchido com os atributos necessários:

Propriedade do Dispositivo — valores padrão que transferimos para o dispositivo para inicializá-lo; para a placa GPS, é necessário transferir o nome da placa no sistema com="/dev/ttyUSB0" e velocidade da porta COM taxa de transmissão = 9600

comandos — comandos para controlar nosso dispositivo; eles podem receber argumentos e um valor de retorno.

  • ESTADO - retorna o estado atual, de Unidos
  • STATUS - retorna o status atual, este é o complemento da string para ESTADO
  • Matriz GPS - retorna gps string no formato DevVarCharArray

Em seguida, defina os atributos do dispositivo que podem ser lidos/gravados nele.
Atributos escalares — atributos simples (char, string, long, etc.)
Atributos do espectro - matrizes unidimensionais
Atributos de imagem - matrizes bidimensionais

Unidos — o estado em que nosso dispositivo está localizado.

  • ABERTO — o dispositivo está aberto.
  • FECHAR - o dispositivo está fechado.
  • FALHA - erro.
  • ON — receber dados do dispositivo.
  • OFF — nenhum dado do dispositivo.

Exemplo de adição de um atributo string_gps:

Controles de tango

Período de votação time em ms, com que frequência o valor gps_string será atualizado. Se o horário de atualização não for especificado, o atributo será atualizado somente mediante solicitação.

Aconteceu:

Controles de tango

Agora você precisa gerar o código Arquivo->Gerar

Controles de tango

Por padrão, o Makefile não é gerado; na primeira vez você precisa marcar a caixa para criá-lo. Isso é feito para que as alterações feitas nele não sejam excluídas durante uma nova geração. Depois de criá-lo uma vez e configurá-lo para o seu projeto (registrar chaves de compilação, arquivos adicionais), você pode esquecê-lo.

Agora vamos passar para a programação. pogo gerou o seguinte para nós:

Controles de tango

Estaremos interessados ​​em NEO6M.cpp e NEO6M.h. Vejamos um exemplo de construtor de classe:

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
}

O que há e o que é importante aqui? A função init_device() aloca memória para nossos atributos: string_gps & matriz_gps, mas não é importante. A coisa mais importante aqui, estes são os comentários:

/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
    .......
/*----- PROTECTED REGION END -----*/    //  NEO6M::constructor_1

Tudo o que estiver dentro deste bloco de comentários não será incluído no pogo durante as regenerações de código subsequentes afastar!. Tudo o que não estiver em blocos estará! Estes são os locais onde podemos programar e fazer as nossas próprias edições.

Agora, quais são as principais funções que a classe contém? 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);

Quando queremos ler o valor do atributo string_gps, as funções serão chamadas na seguinte ordem: sempre_executado_hook, read_attr_hardware и leitura_gps_string. Read_gps_string preencherá gps_string com o valor.

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
}

Compilação

Vá para a pasta de origem e:

make

O programa será compilado na pasta ~/DeviceServers.

tango-cs@tangobox:~/DeviceServers$ ls
NEO6M

JIVE

jive

Controles de tango

Já existem alguns dispositivos no banco de dados, vamos agora criar o nosso Editar->Criar Servidor

Controles de tango

Agora vamos tentar nos conectar a ele:

Controles de tango

Nada vai funcionar, primeiro precisamos executar nosso programa:

sudo ./NEO6M neo6m -v2

Só consigo me conectar à porta de comunicação com direitos raiz-a v — nível de registro.

Agora podemos conectar:

Controles de tango

Cliente

Em gráficos, olhar fotos certamente é bom, mas você precisa de algo mais útil. Vamos escrever um cliente que se conectará ao nosso dispositivo e fará leituras dele.

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

Como compilar:

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

Resultado:

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

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

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

Obtivemos o resultado como um retorno de comando, pegando os atributos de uma string e um array de caracteres.

referências

Escrevi o artigo para mim mesmo, porque depois de um tempo começo a esquecer como e o que fazer.

Obrigado por sua atenção.

Fonte: habr.com

Adicionar um comentário