การควบคุมแทงโก้

การควบคุมแทงโก้

อะไร TANGO?

เป็นระบบการจัดการฮาร์ดแวร์และซอฟต์แวร์ต่างๆ
ปัจจุบัน TANGO รองรับ 4 แพลตฟอร์ม: Linux, Windows NT, Solaris และ HP-UX
ที่นี่เราจะอธิบายการทำงานกับ Linux (Ubuntu 18.04)

มีไว้เพื่ออะไร?

ลดความยุ่งยากในการทำงานด้วยอุปกรณ์และซอฟต์แวร์ต่างๆ

  • คุณไม่จำเป็นต้องคิดเกี่ยวกับวิธีการจัดเก็บข้อมูลในฐานข้อมูล มันทำเพื่อคุณแล้ว
  • จำเป็นต้องอธิบายกลไกของเซ็นเซอร์โพลเท่านั้น
  • ลดรหัสทั้งหมดของคุณให้เป็นมาตรฐานเดียว

จะได้รับที่ไหน?

ฉันไม่สามารถเปิดใช้งานจากซอร์สโค้ดได้ ฉันใช้อิมเมจสำเร็จรูปของ TangoBox 9.3 เพื่อทำงาน
คำแนะนำจะอธิบายวิธีการติดตั้งจากแพ็คเกจ

ประกอบด้วยอะไรบ้าง?

  • หลอก — ใช้เพื่อดูและแก้ไขฐานข้อมูล TANGO
  • ฮอปเปอร์ — ตัวสร้างโค้ดสำหรับเซิร์ฟเวอร์อุปกรณ์ TANGO
  • สตอร์ — ผู้จัดการโปรแกรมสำหรับระบบ TANGO

เราจะสนใจเฉพาะสององค์ประกอบแรกเท่านั้น

ภาษาการเขียนโปรแกรมที่รองรับ

  • C
  • C + +
  • ชวา
  • JavaScript
  • หลาม
  • MATLAB
  • แล็บวิว

ฉันทำงานกับมันใน python & c++ ในที่นี้จะใช้ C++ เป็นตัวอย่าง

ตอนนี้เรามาดูคำอธิบายวิธีเชื่อมต่ออุปกรณ์กับ TANGO และวิธีการใช้งาน ค่าธรรมเนียมจะถูกนำมาเป็นตัวอย่าง จีพีเอส นีโอ-6m-0-001:

การควบคุมแทงโก้

อย่างที่คุณเห็นในภาพเราเชื่อมต่อบอร์ดกับพีซีผ่าน UART CP2102 เมื่อเชื่อมต่อกับพีซี อุปกรณ์จะปรากฏขึ้น /dev/ttyUSB[0-N]โดยปกติแล้ว /dev/ttyUSB0.

ฮอปเปอร์

ตอนนี้เรามาเปิดตัวกัน โปโกและสร้างรหัสโครงร่างสำหรับการทำงานกับบอร์ดของเรา

pogo

การควบคุมแทงโก้

ฉันสร้างโค้ดไว้แล้ว มาสร้างใหม่อีกครั้ง ไฟล์ -> ใหม่.

การควบคุมแทงโก้

เราได้รับสิ่งต่อไปนี้:

การควบคุมแทงโก้

อุปกรณ์ของเรา (ในอนาคตตามอุปกรณ์เราจะหมายถึงส่วนของซอฟต์แวร์) ว่างเปล่าและมีคำสั่งควบคุมสองคำสั่ง: สถานะ & Status.

จะต้องกรอกคุณสมบัติที่จำเป็น:

คุณสมบัติของอุปกรณ์ — ค่าเริ่มต้นที่เราถ่ายโอนไปยังอุปกรณ์เพื่อเริ่มต้นใช้งาน สำหรับบอร์ด GPS คุณต้องถ่ายโอนชื่อของบอร์ดในระบบ com="/dev/ttyUSB0" และความเร็วพอร์ตคอม บอดเรด=9600

คำสั่ง — คำสั่งเพื่อควบคุมอุปกรณ์ของเรา โดยสามารถให้อาร์กิวเมนต์และคืนค่าได้

  • สถานะ - ส่งคืนสถานะปัจจุบันจาก สหรัฐอเมริกา
  • สถานภาพ - ส่งคืนสถานะปัจจุบัน ซึ่งเป็นส่วนเสริมของสตริง สถานะ
  • GPSArray - ส่งคืน จีพีเอส สตริงในรูปแบบ DevVarCharArray

จากนั้น ตั้งค่าคุณลักษณะของอุปกรณ์ที่สามารถอ่าน/เขียนไปยัง/จากอุปกรณ์ได้
คุณสมบัติสเกลาร์ — คุณลักษณะแบบง่าย (ถ่าน, สตริง, ยาว ฯลฯ )
คุณสมบัติสเปกตรัม - อาร์เรย์หนึ่งมิติ
คุณสมบัติรูปภาพ - อาร์เรย์สองมิติ

สหรัฐอเมริกา — สถานะที่อุปกรณ์ของเราตั้งอยู่

  • เปิด — อุปกรณ์เปิดอยู่
  • CLOSE - อุปกรณ์ปิดอยู่
  • ล้มเหลว - ข้อผิดพลาด.
  • ON - รับข้อมูลจากอุปกรณ์
  • ปิด - ไม่มีข้อมูลจากอุปกรณ์

ตัวอย่างการเพิ่มแอตทริบิวต์ gps_string:

การควบคุมแทงโก้

ช่วงการเลือกตั้ง เวลาเป็น ms ความถี่ที่ค่า 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 ในระหว่างการสร้างโค้ดใหม่ในภายหลัง ย้ายออก!. ทุกสิ่งที่ไม่อยู่ในบล็อกจะเป็น! นี่คือที่ที่เราสามารถตั้งโปรแกรมและแก้ไขเองได้

แล้วฟังก์ชันหลักในคลาสนี้ประกอบด้วยอะไรบ้าง? นีโอ6เอ็ม:

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

เราได้รับผลลัพธ์จากการส่งคืนคำสั่ง โดยรับแอตทริบิวต์ของสตริงและอาร์เรย์ของอักขระ

การอ้างอิง

ฉันเขียนบทความเพื่อตัวเองเพราะหลังจากนั้นไม่นานฉันก็เริ่มลืมว่าต้องทำอย่างไรและอย่างไร

ขอบคุณสำหรับความสนใจของคุณ

ที่มา: will.com

เพิ่มความคิดเห็น