ضوابط التانغو

ضوابط التانغو

ما هو تانغو?

إنه نظام لإدارة الأجهزة والبرامج المختلفة.
يدعم TANGO حاليًا 4 منصات: Linux، وWindows NT، وSolaris، وHP-UX.
سنصف هنا العمل مع Linux (Ubuntu 18.04)

لما هذا؟

يبسط العمل مع مختلف المعدات والبرامج.

  • لا تحتاج إلى التفكير في كيفية تخزين البيانات في قاعدة البيانات، فقد تم ذلك بالفعل من أجلك.
  • من الضروري فقط وصف آلية أجهزة استشعار الاقتراع.
  • يقلل كل التعليمات البرمجية الخاصة بك إلى معيار واحد.

أين يمكن الحصول عليه؟

لم أتمكن من تشغيله من الكود المصدري؛ لقد استخدمت صورة جاهزة من TangoBox 9.3 للعمل.
تصف التعليمات كيفية التثبيت من الحزم.

مما تتكون؟

  • جيف - يستخدم لعرض وتحرير قاعدة بيانات TANGO.
  • بوجو - مولد الأكواد لخوادم أجهزة TANGO.
  • أستور — مدير برنامج لنظام التانجو.

سنكون مهتمين فقط بالمكونين الأولين.

لغات البرمجة المدعومة

  • C
  • C + +
  • جافا
  • جافا سكريبت
  • بايثون
  • ماتلاب
  • ابفيف

لقد عملت معها في بايثون وC++. هنا سيتم استخدام C++ كمثال.

ننتقل الآن إلى وصف كيفية توصيل الجهاز بـ TANGO وكيفية العمل معه. سيتم أخذ الرسوم كمثال نظام تحديد المواقع الجديد-6m-0-001:

ضوابط التانغو

كما ترون في الصورة، نقوم بتوصيل اللوحة بالكمبيوتر عبر UART CP2102. عند توصيله بجهاز الكمبيوتر، يظهر الجهاز /ديف/ttyUSB[0-N]، عادةً /dev/ttyUSB0.

بوجو

الآن دعونا نركض بوجو، وإنشاء كود هيكلي للعمل مع مجلسنا.

pogo

ضوابط التانغو

لقد قمت بالفعل بإنشاء الكود، فلنقم بإنشائه مرة أخرى ملف->جديد.

ضوابط التانغو

نحصل على ما يلي:

ضوابط التانغو

جهازنا (في المستقبل، سنعني بالجهاز جزء البرنامج) فارغ ويحتوي على أمرين للتحكم: الولايه او المحافظه & الحالة.

يجب أن تكون مليئة بالسمات اللازمة:

خاصية الجهاز - القيم الافتراضية التي ننقلها إلى الجهاز لتهيئته، بالنسبة للوحة GPS، تحتاج إلى نقل اسم اللوحة في النظام كوم = "/ديف/ttyUSB0" وسرعة منفذ كوم بودراد=9600

أوامر - أوامر للتحكم في أجهزتنا، ويمكن إعطاؤها وسيطات وقيمة إرجاع.

  • STATE - إرجاع الحالة الحالية، من المحافظة
  • الوضع - يُرجع الحالة الحالية، وهذا هو مكمل للسلسلة STATE
  • GPSArray - عائدات نظام تحديد المواقع سلسلة في النموذج DevVarCharArray

بعد ذلك، قم بتعيين سمات الجهاز التي يمكن قراءتها/كتابتها إليه/ منه.
السمات العددية - سمات بسيطة (شار، سلسلة، طويلة، الخ)
سمات الطيف - المصفوفات أحادية البعد
سمات الصورة - صفائف ثنائية الأبعاد

المحافظة — الحالة التي يقع فيها جهازنا.

  • فتح - الجهاز مفتوح .
  • إغلاق - الجهاز مغلق .
  • فشل - خطأ.
  • ON - استقبال البيانات من الجهاز.
  • اضافي - لا توجد بيانات من الجهاز.

مثال على إضافة سمة gps_string:

ضوابط التانغو

فترة الاقتراع الوقت بالمللي ثانية، كم مرة سيتم تحديث قيمة gps_string. إذا لم يتم تحديد وقت التحديث، فسيتم تحديث السمة فقط عند الطلب.

حدث:

ضوابط التانغو

الآن أنت بحاجة إلى إنشاء الكود ملف->إنشاء

ضوابط التانغو

بشكل افتراضي، لا يتم إنشاء ملف Makefile؛ في المرة الأولى التي تحتاج فيها إلى تحديد المربع لإنشائه. يتم ذلك حتى لا يتم حذف التغييرات التي تم إجراؤها عليه خلال الجيل الجديد. بعد إنشائه مرة واحدة وتكوينه لمشروعك (تسجيل مفاتيح الترجمة والملفات الإضافية)، يمكنك نسيان الأمر.

الآن دعنا ننتقل إلى البرمجة. بوجو مع إنشاء ما يلي بالنسبة لنا:

ضوابط التانغو

سنكون مهتمين بـ 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

لقد حصلنا على النتيجة كأمر إرجاع، مع أخذ سمات سلسلة ومجموعة من الأحرف.

مراجع

لقد كتبت المقال بنفسي، لأنه بعد فترة بدأت أنسى كيف وماذا أفعل.

شكرا لكم على اهتمامكم.

المصدر: www.habr.com

إضافة تعليق