Điều khiển tango

Điều khiển tango

Cái gì TANGO?

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ò.
  • Giảm tất cả mã của bạn xuống một tiêu chuẩn.

Lấy ở đâu

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:

Điều khiển tango

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

Điều khiển tango

Tôi đã tạo mã rồi, hãy tạo lại mã Tệp->Mới.

Điều khiển tango

Chúng tôi nhận được những điều sau đây:

Điều khiển tango

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:

Điều khiển tango

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:

Điều khiển tango

Bây giờ bạn cần tạo mã Tệp-> Tạo

Điều khiển tango

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:

Điều khiển tango

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.

Bây giờ các chức năng chính của lớp là gì? 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);

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

Điều khiển tango

Đã 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ủ

Điều khiển tango

Bây giờ hãy thử kết nối với nó:

Điều khiển tango

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:

Điều khiển tango

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

Cách biên dịch:

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

Kết quả:

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

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

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

Chúng tôi nhận được kết quả dưới dạng trả về lệnh, lấy các thuộc tính của một chuỗi và một mảng ký tự.

tài liệu tham khảo

Tôi viết bài này cho chính mình, vì sau một thời gian tôi bắt đầu quên mất cách thức và việc phải làm.

Cảm ơn bạn đã quan tâm của bạn.

Nguồn: www.habr.com

Thêm một lời nhận xét