探戈控制

探戈控制

什么是 探戈?

它是一个管理各种硬件和软件的系统。
TANGO 目前支持 4 个平台:Linux、Windows NT、Solaris 和 HP-UX。
在这里我们将描述使用 Linux (Ubuntu 18.04)

它是做什么用的?

简化各种设备和软件的工作。

  • 您无需考虑如何在数据库中存储数据,它已经为您完成了。
  • 只需要描述轮询传感器的机制。
  • 将所有代码简化为一个标准。

从哪里得到它?

我无法从源代码启动它;我使用了 TangoBox 9.3 的现成映像来工作。
这些说明描述了如何从包安装。

它由什么组成?

  • 吉夫 — 用于查看和编辑 TANGO 数据库。
  • POGO — TANGO 设备服务器的代码生成器。
  • 阿斯特 — TANGO 系统的项目经理。

我们只对前两个组成部分感兴趣。

支持的编程语言

  • C
  • C + +中
  • 爪哇岛
  • JavaScript的
  • 蟒蛇
  • MATLAB
  • LabVIEW的

我在 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端口 秒。 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

添加评论