何ですか TANGO ?
さまざまなハードウェアやソフトウェアを管理するためのシステムです。
TANGO は現在、Linux、Windows NT、Solaris、HP-UX の 4 つのプラットフォームをサポートしています。
ここでは、Linux (Ubuntu 18.04) での作業について説明します。
それはなんのためですか?
さまざまな機器やソフトウェアを使用して作業を簡素化します。
- データベースにデータを保存する方法を考える必要はありません。それはすでに行われています。
- センサーをポーリングするメカニズムのみを説明する必要があります。
- すべてのコードを XNUMX つの標準にまとめます。
それをどこで入手できますか?
ソース コードからは起動できなかったので、TangoBox 9.3 の既成のイメージを使用して動作させました。
この手順では、パッケージからインストールする方法について説明します。
それは何で構成されていますか?
- ジャイブ — TANGO データベースの表示と編集に使用されます。
- POGO — TANGO デバイスサーバー用のコードジェネレーター。
- アスター — TANGO システムのプログラム マネージャー。
最初の XNUMX つのコンポーネントのみに注目します。
サポートされているプログラミング言語
- C
- C + +
- Java
- JavaScriptを
- Python
- Matlab
- LabVIEW
私はPythonとC++で作業しました。 ここでは例として C++ を使用します。
それでは、デバイスを TANGO に接続する方法とその操作方法の説明に移りましょう。 料金を例に挙げます GPSネオ-6m-0-001:
写真でわかるように、UART CP2102 を介してボードを PC に接続します。 PCに接続するとデバイスが表示されます /dev/ttyUSB[0-N]、通常は/dev/ttyUSB0。
POGO
さあ、起動しましょう ポゴ、ボードを操作するためのスケルトン コードを生成します。
pogo
コードはすでに作成済みなので、もう一度作成しましょう ファイル -> 新規.
以下の結果が得られます。
私たちのデバイス (将来的には、デバイスとはソフトウェア部分を意味します) は空で、XNUMX つの制御コマンドがあります。 都道府県 & Status:.
必要な属性を入力する必要があります。
デバイスのプロパティ — デバイスを初期化するためにデバイスに転送するデフォルト値。GPS ボードの場合は、システム内のボード名を転送する必要があります com="/dev/ttyUSB0" およびCOMポートの速度 ボードラード=9600
コマンド — デバイスを制御するコマンド。引数と戻り値を指定できます。
- 状態 - 現在の状態を返します。 米国
- ステータス - 現在のステータスを返します。これは文字列の補数です。 状態
- GPSアレイ - 戻り値 GPS フォーム内の文字列 DevVarCharArray
次に、読み書きできるデバイス属性を設定します。
スカラー属性 — 単純な属性 (char、string、long など)
スペクトルの属性 - XNUMX次元配列
画像の属性 - 二次元配列
米国 — デバイスが置かれている状態。
- OPEN — デバイスが開いています。
- 閉じる - デバイスが閉じられています。
- 失敗しました - エラー。
- ON — デバイスからデータを受信します。
- オフ — デバイスからのデータがありません。
属性の追加例 gps_string:
ポーリング期間 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_string & gps_array、しかしそれは重要ではありません。 ここで最も重要なこと、コメントは次のとおりです。
/*----- 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_stringの場合、関数は次の順序で呼び出されます。 always_executed_hook, read_attr_hardware и read_gps_string。 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 ポートにのみ接続できます ルートああ。 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
文字列と文字の配列の属性を取得して、コマンドの戻り値として結果を取得しました。
リファレンス
しばらくすると、どうやって何をすべきかを忘れ始めたので、私は自分のためにこの記事を書きました。
ご清聴ありがとうございました。
出所: habr.com