Iku sistem kanggo ngatur macem-macem hardware lan software.
TANGO saiki ndhukung 4 platform: Linux, Windows NT, Solaris lan HP-UX.
Ing kene kita bakal nerangake nggarap Linux (Ubuntu 18.04)
Kanggo apa?
Nyederhanakake karya karo macem-macem peralatan lan piranti lunak.
Sampeyan ora perlu mikir babagan carane nyimpen data ing database, iku wis rampung kanggo sampeyan.
Aku ora bisa miwiti saka kode sumber; Aku nggunakake gambar siap-digawe saka TangoBox 9.3 kanggo bisa.
Pandhuan nerangake carane nginstal saka paket.
Apa isine?
jive - digunakake kanggo ndeleng lan ngowahi database TANGO.
POGO - generator kode kanggo server piranti TANGO.
Astor - manajer program kanggo sistem TANGO.
Kita bakal kasengsem mung ing rong komponen pisanan.
Basa pamrograman sing didhukung
C
C ++
Jawa
JavaScript
Python
Matlab
LabVIEW
Aku kerjo karo python & c ++. Ing kene C ++ bakal digunakake minangka conto.
Saiki ayo pindhah menyang katrangan babagan carane nyambungake piranti menyang TANGO lan cara nggarap. Ragad bakal dijupuk minangka conto GPS neo-6m-0-001:
Nalika sampeyan bisa ndeleng ing gambar, kita nyambung Papan kanggo PC liwat UART CP2102. Nalika disambungake menyang PC, piranti katon /dev/ttyUSB[0-N], biasane /dev/ttyUSB0.
POGO
Saiki ayo diluncurake pogo, lan ngasilake kode kerangka kanggo nggarap papan kita.
pogo
Aku wis nggawe kode, ayo nggawe maneh File-> Anyar.
Kita entuk ing ngisor iki:
Piranti kita (ing mangsa ngarep, miturut piranti kita bakal tegese bagean piranti lunak) kosong lan duwe rong perintah kontrol: State & status.
Sampeyan kudu diisi karo atribut sing dibutuhake:
Properti piranti - nilai standar sing ditransfer menyang piranti kanggo miwiti; kanggo papan GPS, sampeyan kudu nransfer jeneng papan ing sistem com="/dev/ttyUSB0" lan kacepetan port com baudrade=9600
Prentah - printah kanggo ngontrol piranti kita; padha bisa diwenehi bantahan lan nilai bali.
STATE - ngasilake negara saiki, saka Serikat
STATUS - ngasilake status saiki, iki nglengkapi senar kanggo STATE
GPSArray - bali GPS string ing wangun DevVarCharArray
Sabanjure, setel atribut piranti sing bisa diwaca/ditulis menyang/saka. Atribut skalar - atribut prasaja (char, string, long, etc.) Atribut Spektrum - susunan siji-dimensi Atribut Gambar - susunan rong dimensi
Serikat - negara ing ngendi piranti kita dumunung.
OPEN - piranti mbukak.
CLOSE - piranti ditutup.
GAGAL - kesalahan.
ON - nampa data saka piranti.
OFF - ora ana data saka piranti.
Tuladha nambah atribut gps_string:
Periode polling wektu ing ms, sepira kerepe nilai gps_string bakal dianyari. Yen wektu nganyari ora ditemtokake, atribut bakal dianyari mung sawise dijaluk.
Kedadeyan:
Saiki sampeyan kudu nggawe kode File-> Generate
Kanthi gawan, Makefile ora digawe; sepisanan sampeyan kudu mriksa kothak kanggo nggawe. Iki ditindakake supaya owah-owahan sing ditindakake ora bakal dibusak sajrone generasi anyar. Sawise digawe lan dikonfigurasi kanggo proyek sampeyan (ndhaftar tombol kompilasi, file tambahan), sampeyan bisa lali babagan iki.
Saiki ayo pindhah menyang pemrograman. pogo kanthi ngasilake ing ngisor iki kanggo kita:
Kita bakal kasengsem ing NEO6M.cpp & NEO6M.h. Ayo njupuk conto 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 ana lan apa sing penting ing kene? Fungsi init_device() nyedhiyakake memori kanggo atribut kita: gps_string & gps_array, nanging ora penting. Sing paling penting ing kene, iki komentar:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Kabeh sing ana ing blok komentar iki ora bakal kalebu ing pogo sajrone regenerasi kode sabanjure ngalih!. Kabeh sing ora ana ing blok bakal dadi! Iki minangka papan sing bisa kita program lan nggawe suntingan kita dhewe.
Nalika kita pengin maca nilai atribut gps_string, fungsi kasebut bakal diarani kanthi urutan ing ngisor iki: tansah_eksekusi_pancing, read_attr_hardware ΠΈ maca_gps_string. Read_gps_string bakal ngisi gps_string kanthi nilai.
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
Pindhah menyang folder sumber lan:
make
Program kasebut bakal dikompilasi menyang folder ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
jive
jive
Wis sawetara piranti ing database, ayo saiki nggawe kita Sunting-> Gawe Server
Saiki ayo nyoba nyambungake:
Ora ana sing bisa digunakake, mula kita kudu mbukak program:
sudo ./NEO6M neo6m -v2
Aku mung bisa nyambung menyang port com karo hak ROOT-a. v - tingkat logging.
Saiki kita bisa nyambung:
Pelanggan
Ing grafis, ndeleng gambar mesthi apik, nanging sampeyan butuh sing luwih migunani. Ayo nulis klien sing bakal nyambung menyang piranti kita lan maca saka iku.
#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);
}
}