Ini adalah sistem untuk mengelola berbagai perangkat keras dan perangkat lunak.
TANGO saat ini mendukung 4 platform: Linux, Windows NT, Solaris dan HP-UX.
Di sini kami akan menjelaskan bekerja dengan Linux (Ubuntu 18.04)
Π΅Π³ΠΎ ΠΎ?
Menyederhanakan pekerjaan dengan berbagai peralatan dan perangkat lunak.
Anda tidak perlu memikirkan cara menyimpan data ke database, itu sudah selesai untuk Anda.
Kita hanya perlu menjelaskan mekanisme sensor polling.
Saya tidak dapat meluncurkannya dari kode sumber; saya menggunakan gambar TangoBox 9.3 yang sudah jadi agar berfungsi.
Instruksi menjelaskan cara menginstal dari paket.
Terdiri dari apa?
Jive β digunakan untuk melihat dan mengedit database TANGO.
POGO β generator kode untuk server perangkat TANGO.
Astor β manajer program untuk sistem TANGO.
Kami hanya akan tertarik pada dua komponen pertama.
Bahasa pemrograman yang didukung
C
C + +
Jawa
JavaScript
Ular sanca
matlab
LabVIEW
Saya mengerjakannya dengan python & c++. Di sini C++ akan digunakan sebagai contoh.
Sekarang mari beralih ke penjelasan tentang cara menghubungkan perangkat ke TANGO dan cara menggunakannya. Biayanya akan diambil sebagai contoh GPS neo-6m-0-001:
Seperti yang Anda lihat pada gambar, kami menghubungkan papan ke PC melalui UART CP2102. Saat terhubung ke PC, perangkat muncul /dev/ttyUSB[0-N], biasanya /dev/ttyUSB0.
POGO
Sekarang mari kita luncurkan pogo, dan buat kode kerangka untuk bekerja dengan papan kami.
pogo
Saya sudah membuat kodenya, mari kita buat lagi File->Baru.
Kami mendapatkan yang berikut:
Perangkat kami (selanjutnya, yang kami maksud dengan perangkat adalah bagian perangkat lunak) kosong dan memiliki dua perintah kontrol: Negara & Status.
Itu harus diisi dengan atribut yang diperlukan:
Properti Perangkat β nilai default yang kami transfer ke perangkat untuk menginisialisasinya; untuk papan GPS, Anda perlu mentransfer nama papan di sistem com="/dev/ttyUSB0" dan kecepatan port com baudrade=9600
Perintah β perintah untuk mengontrol perangkat kita; mereka dapat diberikan argumen dan nilai kembalian.
NEGARA - mengembalikan keadaan saat ini, dari Negara
STATUS - mengembalikan status saat ini, ini adalah pelengkap string NEGARA
Array GPS - kembali gps string dalam bentuk DevVarCharArray
Selanjutnya, atur atribut perangkat yang dapat dibaca/ditulis ke/darinya. Atribut Skalar β atribut sederhana (char, string, long, dll.) Atribut Spektrum - array satu dimensi Atribut Gambar - array dua dimensi
Negara β keadaan di mana perangkat kita berada.
OPEN β perangkat terbuka.
TUTUP - perangkat ditutup.
GAGAL - kesalahan.
ON β menerima data dari perangkat.
MATI β tidak ada data dari perangkat.
Contoh penambahan atribut gps_string:
periode pemungutan suara waktu dalam ms, seberapa sering nilai gps_string akan diperbarui. Jika waktu pembaruan tidak ditentukan, atribut hanya akan diperbarui berdasarkan permintaan.
Terjadi:
Sekarang Anda perlu membuat kodenya File->Hasilkan
Secara default, Makefile tidak dibuat; pertama kali Anda perlu mencentang kotak untuk membuatnya. Hal ini dilakukan agar perubahan yang dilakukan tidak terhapus pada generasi baru. Setelah membuatnya sekali dan mengonfigurasinya untuk proyek Anda (mendaftarkan kunci kompilasi, file tambahan), Anda bisa melupakannya.
Sekarang mari kita beralih ke pemrograman. pogo dengan menghasilkan yang berikut ini untuk kami:
Kami akan tertarik dengan NEO6M.cpp & NEO6M.h. Mari kita ambil contoh konstruktor kelas:
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
}
Apa yang ada di sana dan apa yang penting di sini? Fungsi init_device() mengalokasikan memori untuk atribut kita: gps_string & gps_array, tapi itu tidak penting. Hal terpenting di sini, ini komentarnya:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Segala sesuatu yang ada di dalam blok komentar ini tidak akan disertakan dalam pogo selama pembuatan ulang kode berikutnya pindah!. Segala sesuatu yang tidak ada dalam blok akan menjadi! Ini adalah tempat di mana kita dapat memprogram dan melakukan pengeditan sendiri.
Sekarang apa fungsi utama yang ada di kelas tersebut? NEO6M:
Ketika kita ingin membaca nilai atribut gps_string, fungsi akan dipanggil dengan urutan sebagai berikut: selalu_eksekusi_hook, baca_attr_perangkat keras ΠΈ baca_gps_string. Read_gps_string akan mengisi gps_string dengan nilainya.
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
}
Kompilasi
Buka folder sumber dan:
make
Program akan dikompilasi ke dalam folder ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
Jive
jive
Sudah ada beberapa perangkat di database, sekarang mari kita buat perangkat kita sendiri Sunting->Buat Server
Sekarang mari kita coba menyambungkannya:
Tidak ada yang berhasil, pertama-tama kita perlu menjalankan program kita:
sudo ./NEO6M neo6m -v2
Saya hanya dapat terhubung ke port com dengan hak akarOh v β tingkat pencatatan.
Sekarang kita dapat terhubung:
Klien
Secara grafis, melihat gambar tentu bagus, namun membutuhkan sesuatu yang lebih berguna. Mari kita menulis klien yang akan terhubung ke perangkat kita dan membaca darinya.
#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);
}
}