
何ですか ?
さまざまな機器やソフトウェアを管理するためのシステムです。
TANGOは現在、4つのプラットフォームをサポートしています。 Linux, Windows NT、Solaris、HP-UX。
ここでは、 Linux(Ubuntu 18.04)
それは何のためですか?
さまざまな機器やソフトウェアを使った作業を簡素化します。
- データベースにデータを保存する方法について考える必要はありません。すでに保存されています。
- センサーをポーリングするためのメカニズムを説明するだけで十分です。
- すべてのコードを 1 つの標準に統合します。
それをどこで入手できますか?
ソースコードから実行することができなかったので、作業には既製の TangoBox 9.3 イメージを使用しました。
説明書にはバッグから取り付ける方法が書かれています。
それは何から構成されていますか?
- ジャイブ — TANGO データベースを表示および編集するために使用されます。
- POGO — TANGO デバイス サーバー用のコード ジェネレーター。
- アスター — TANGO システムのソフトウェア マネージャー。
私たちが注目するのは最初の 2 つのコンポーネントだけです。
サポートされているプログラミング言語
- 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
すでにコードが作成されているので、もう一度作成してみましょう ファイル->新規.

以下の結果が得られます。

私たちのデバイス(以下、デバイスはソフトウェア部分を意味します)は空で、2 つの制御コマンドがあります。 州/地域 & ステータス.
必要な属性を入力する必要があります。
デバイスのプロパティ — デバイスの初期化のために渡すデフォルト値。GPSボードの場合は、システム内のボードの名前を渡す必要があります。 com="/dev/ttyUSB0" COMポートの速度 ボーレート=9600
コマンド — デバイスを制御するコマンドでは、引数を設定したり、値を返すことができます。
- 状態 - 現在の状態を返します。 米国
- ステータス - 現在のステータスを返します。これは、 状態
- GPSアレイ - 返品 GPS フォーム内の行 DevVarCharArray
次に、読み取り/書き込み可能なデバイス属性を指定します。
スカラー属性 — 単純な属性 (char、string、long など)
スペクトル属性 — 1次元配列
画像属性 — 2次元配列
米国 — デバイスが配置されている状態。
- OPEN — デバイスが開いています。
- 閉じる — デバイスが閉じられています。
- 失敗 - エラー。
- ON — デバイスからデータを受信します。
- オフ - デバイスからのデータがありません。
属性を追加する例 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_arrayしかし、それは問題ではありません。 ここで最も重要なことはコメントは次のとおりです:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1このコメント ブロック内の内容は、pogo での以降のコード再生成には含まれません。 離れてください!。ブロックにないものはすべてブロックになります。これらは、独自のプログラミングや編集を行うことができる場所です。
さて、このクラスに含まれる主な機能は何でしょうか? 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);属性の値を読み取りたい場合 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ポートにのみ接続できます ルートああ。 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
