探戈控制

探戈控制

什麼是 TANGO?

它是一個管理各種硬體和軟體的系統。
TANGO 目前支援 4 個平台:Linux、Windows NT、Solaris 和 HP-UX。
這裡我們將描述使用 Linux (Ubuntu 18.04)

它是做什麼用的?

簡化各種設備和軟體的工作。

  • 您無需考慮如何在資料庫中儲存數據,它已經為您完成了。
  • 只需要描述輪詢感測器的機制。
  • 將所有代碼簡化為一個標準。

到哪裡去?

我無法從原始碼啟動它;我使用了 TangoBox 9.3 的現成映像來運作。
這些說明描述如何從套件安裝。

它由什麼組成?

  • 吉夫 — 用於檢視和編輯 TANGO 資料庫。
  • POGO — TANGO 設備伺服器的代碼產生器。
  • 阿斯特 — TANGO 系統的專案經理。

我們只對前兩個組成部分感興趣。

支援的程式語言

  • C
  • C + +中
  • Java的
  • JavaScript的
  • 蟒蛇
  • Matlab的
  • 虛擬儀器

我在 python 和 c++ 中使用它。 這裡以C++為例。

現在讓我們繼續描述如何將裝置連接到 TANGO 以及如何使用它。 將以費用為例 GPS Neo-6m-0-001:

探戈控制

如圖所示,我們透過 UART CP2102 將開發板連接到 PC。 連接到 PC 時,會出現該設備 /dev/ttyUSB[0-N],通常是/dev/ttyUSB0。

POGO

現在讓我們啟動 波戈,並產生與我們的板子配合使用的框架程式碼。

pogo

探戈控制

我已經創建了程式碼,讓我們再次創建它 文件->新建.

探戈控制

我們得到以下資訊:

探戈控制

我們的設備(將來,我們所說的設備將指軟體部分)是空的,並且有兩個控制命令: & Status.

它必須填充必要的屬性:

設備屬性 — 我們傳輸到裝置以對其進行初始化的預設值;對於 GPS 板,您需要傳輸系統中板的名稱 com=“/dev/ttyUSB0” 和 com 連接埠速度 波特率=9600

命令 — 控制我們設備的命令;它們可以被賦予參數和返回值。

  • - 返回目前狀態,來自 美國
  • 狀態 - 傳回目前狀態,這是字串的補碼
  • GPS陣列 - 退貨 GPS 表單中的字串 DevVarCharArray

接下來,設定可以讀取/寫入的設備屬性。
標量屬性 — 簡單屬性(char、string、long 等)
頻譜屬性 - 一維數組
圖像屬性 - 二維數組

美國 — 我們的設備所在的狀態。

  • 打開 — 設備已開啟。
  • 關閉 - 設備已關閉。
  • 失敗 - 錯誤。
  • ON — 從設備接收資料。
  • OFF — 設備沒有資料。

新增屬性的範例 GPS_字串:

探戈控制

投票週期 時間(以毫秒為單位),gps_string 值更新的頻率。 如果未指定更新時間,則僅根據請求更新該屬性。

發生:

探戈控制

現在您需要產生程式碼 文件->生成

探戈控制

預設情況下,不會產生 Makefile;第一次需要選取此方塊來建立它。 這樣做是為了避免在新一代期間刪除對其所做的更改。 一旦創建它並為您的專案配置它(註冊編譯密鑰、附加檔案),您就可以忘記它。

現在讓我們繼續編程。 pogo 為我們產生了以下內容:

探戈控制

我們將對 NEO6M.cpp 和 NEO6M.h 感興趣。 讓我們舉一個類別構造函數的例子:

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
}

這裡有什麼以及什麼是重要的? init_device() 函數為我們的屬性分配記憶體: GPS_字串 & GPS_數組,但這並不重要。 這裡最重要的是,這些是評論:

/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
    .......
/*----- PROTECTED REGION END -----*/    //  NEO6M::constructor_1

在後續程式碼重新產生期間,此註解區塊內的所有內容都不會包含在 pogo 中 走開!。 所有不在塊中的東西都將是! 這些是我們可以編程和進行自己編輯的地方。

那麼這個類別主要包含哪些功能呢? 新6M:

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

當我們想要讀取屬性值時 GPS_字串,函數將按以下順序呼叫: 總是執行的鉤子, 讀取屬性硬體 и 讀取 GPS 字串。 Read_gps_string 將會用該值填入 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
}

彙編

轉到來源資料夾並:

make

程式將被編譯到 ~/DeviceServers 資料夾中。

tango-cs@tangobox:~/DeviceServers$ ls
NEO6M

吉夫

jive

探戈控制

資料庫中已經有一些設備,現在讓我們創建我們的設備 編輯->建立伺服器

探戈控制

現在讓我們嘗試連接到它:

探戈控制

什麼都行不通,首先我們需要執行我們的程式:

sudo ./NEO6M neo6m -v2

我只能連接到有權限的com端口 -A。 v — 日誌記錄等級。

現在我們可以連接:

探戈控制

顧客

在圖形中,查看圖片當然很好,但您需要更有用的東西。 讓我們編寫一個連接到我們的設備並從中讀取讀數的客戶端。

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

如何編譯:

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

其結果是:

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

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

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

我們將結果作為命令返回,採用字串和字元數組的屬性。

引用

我為自己寫這篇文章,因為一段時間後我開始忘記如何做以及做什麼。

感謝您的關注。

來源: www.habr.com

添加評論