É 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.
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:
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
Já criei o código, vamos criá-lo novamente Ficheiro->Novo.
Obtemos o seguinte:
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:
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:
Agora você precisa gerar o código Arquivo->Gerar
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:
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:
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
Já existem alguns dispositivos no banco de dados, vamos agora criar o nosso Editar->Criar Servidor
Agora vamos tentar nos conectar a ele:
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:
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);
}
}