Nó là một hệ thống để quản lý các phần cứng và phần mềm khác nhau.
TANGO hiện hỗ trợ 4 nền tảng: Linux, Windows NT, Solaris và HP-UX.
Ở đây chúng tôi sẽ mô tả cách làm việc với Linux (Ubuntu 18.04)
Nó dùng để làm gì?
Đơn giản hóa công việc với nhiều thiết bị và phần mềm khác nhau.
Bạn không cần phải suy nghĩ về cách lưu trữ dữ liệu trong cơ sở dữ liệu, việc đó đã được thực hiện sẵn cho bạn.
Chỉ cần mô tả cơ chế hoạt động của cảm biến thăm dò.
Tôi không thể khởi chạy nó từ mã nguồn; tôi đã sử dụng hình ảnh có sẵn của TangoBox 9.3 để hoạt động.
Hướng dẫn mô tả cách cài đặt từ gói.
Nó bao gồm những gì?
nhảy múa — được sử dụng để xem và chỉnh sửa cơ sở dữ liệu TANGO.
POGO — trình tạo mã cho máy chủ thiết bị TANGO.
Astor — người quản lý chương trình cho hệ thống TANGO.
Chúng ta sẽ chỉ quan tâm đến hai thành phần đầu tiên.
Ngôn ngữ lập trình được hỗ trợ
C
C + +
Java
JavaScript
Python
matlab
LabVIEW
Tôi đã làm việc với nó trong python & c++. Ở đây C++ sẽ được sử dụng làm ví dụ.
Bây giờ chúng ta hãy chuyển sang phần mô tả về cách kết nối thiết bị với TANGO và cách làm việc với thiết bị. Lệ phí sẽ được lấy làm ví dụ GPS neo-6m-0-001:
Như bạn có thể thấy trong hình, chúng ta kết nối bo mạch với PC thông qua UART CP2102. Khi kết nối với PC, thiết bị sẽ xuất hiện /dev/ttyUSB[0-N], thường là /dev/ttyUSB0.
POGO
Bây giờ hãy khởi động pogovà tạo mã khung để làm việc với bảng của chúng tôi.
pogo
Tôi đã tạo mã rồi, hãy tạo lại mã Tệp->Mới.
Chúng tôi nhận được những điều sau đây:
Thiết bị của chúng tôi (trong tương lai, theo thiết bị, chúng tôi sẽ muốn nói đến phần mềm) trống và có hai lệnh điều khiển: Tiểu bang & Trạng thái.
Nó phải chứa đầy các thuộc tính cần thiết:
Thuộc tính thiết bị — các giá trị mặc định mà chúng ta chuyển sang thiết bị để khởi tạo, đối với bảng GPS, bạn cần chuyển tên của bảng trong hệ thống com="/dev/ttyUSB0" và tốc độ cổng com baudrade=9600
Lệnh — các lệnh để điều khiển thiết bị của chúng ta; chúng có thể được cung cấp các đối số và giá trị trả về.
TIỂU BANG - trả về trạng thái hiện tại, từ Bang
TÌNH TRẠNG - trả về trạng thái hiện tại, đây là phần bù của chuỗi cho TIỂU BANG
Mảng GPS - trả về gps chuỗi ở dạng DevVarCharMảng
Tiếp theo, đặt thuộc tính thiết bị có thể được đọc/ghi vào/từ thiết bị đó. Thuộc tính vô hướng - các thuộc tính đơn giản (char, chuỗi, dài, v.v.) Thuộc tính phổ - mảng một chiều Thuộc tính hình ảnh - mảng hai chiều
Bang - trạng thái nơi thiết bị của chúng tôi được đặt.
MỞ - thiết bị đang mở.
ĐÓNG - thiết bị đã đóng.
LỖI - lỗi.
ON - nhận dữ liệu từ thiết bị.
TẮT - không có dữ liệu từ thiết bị.
Ví dụ về việc thêm thuộc tính gps_string:
Thời gian bỏ phiếu thời gian tính bằng ms, tần suất giá trị gps_string sẽ được cập nhật. Nếu thời gian cập nhật không được chỉ định, thuộc tính sẽ chỉ được cập nhật theo yêu cầu.
Hóa ra:
Bây giờ bạn cần tạo mã Tệp-> Tạo
Theo mặc định, Makefile không được tạo; lần đầu tiên bạn cần chọn hộp để tạo nó. Điều này được thực hiện để những thay đổi được thực hiện đối với nó không bị xóa trong thế hệ mới. Sau khi tạo nó một lần và định cấu hình nó cho dự án của bạn (đăng ký các khóa biên dịch, các tệp bổ sung), bạn có thể quên nó đi.
Bây giờ hãy chuyển sang lập trình. pogo đã tạo ra những điều sau đây cho chúng tôi:
Chúng tôi sẽ quan tâm đến NEO6M.cpp & NEO6M.h. Hãy lấy một ví dụ về một hàm tạo lớp:
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
}
Ở đó có gì và điều gì quan trọng ở đây? Hàm init_device() phân bổ bộ nhớ cho các thuộc tính của chúng ta: gps_string & gps_mảng, nhưng nó không quan trọng. Điều quan trọng nhất ở đây, đây là những nhận xét:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Mọi thứ bên trong khối nhận xét này sẽ không được đưa vào pogo trong các lần tạo lại mã tiếp theo chuyển đi!. Mọi thứ không nằm trong khối sẽ có! Đây là nơi chúng ta có thể lập trình và thực hiện các chỉnh sửa của riêng mình.
Khi chúng ta muốn đọc giá trị thuộc tính gps_string, các hàm sẽ được gọi theo thứ tự sau: luôn_executed_hook, read_attr_hardware и read_gps_string. Read_gps_string sẽ điền giá trị vào 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
}
Tổng hợp
Chuyển đến thư mục nguồn và:
make
Chương trình sẽ được biên dịch vào thư mục ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
nhảy múa
jive
Đã có một số thiết bị trong cơ sở dữ liệu, bây giờ hãy tạo thiết bị của chúng ta Chỉnh sửa->Tạo máy chủ
Bây giờ hãy thử kết nối với nó:
Sẽ không có gì hoạt động, trước tiên chúng ta cần chạy chương trình của mình:
sudo ./NEO6M neo6m -v2
Tôi chỉ có thể kết nối với cổng com bằng quyền nguồn gốc-một. v - mức độ ghi nhật ký.
Bây giờ chúng ta có thể kết nối:
Khách hàng
Về đồ họa, nhìn vào hình ảnh chắc chắn là tốt, nhưng bạn cần thứ gì đó hữu ích hơn. Hãy viết một ứng dụng khách sẽ kết nối với thiết bị của chúng ta và đọc dữ liệu từ thiết bị đó.
#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);
}
}