Membuat Sistem Ekstensi di Perpustakaan Qt - Bagian 2

Kembali ke artikel pertama, saya ingin menjelaskan di mana kebutuhan muncul untuk mengembangkan mekanisme ekstensi dengan antarmuka grafis (GUI) dan menjelaskan secara lebih rinci mekanisme untuk membuat plug-in.

Sebuah tugas diterima untuk mengembangkan perangkat lunak teknologi untuk menyetel, mengatur, mengendalikan, mengumpulkan, dan menganalisis informasi dari senjata self-propelled (sistem kontrol otomatis) dari mesin pada sistem operasi Rusia. Dimana pertukaran antara senjata self-propelled dan program teknologi dilakukan melalui antarmuka RS-232 atau RS422, sesuai dengan protokol pertukaran khusus.

Setelah meninjau dan menganalisis kemampuan daftar sistem operasi Rusia, sistem operasi AstraLinux dipilih. Ini adalah sistem tujuan khusus berdasarkan distribusi Debian, yang dirancang untuk melindungi informasi secara komprehensif dan membangun sistem otomatis yang aman. Sistem operasi Astra Linux sedang dikembangkan dalam dua versi: Edisi Umum (gratis, tujuan umum) dan Edisi Khusus (berbayar, tujuan khusus dengan serangkaian algoritma perlindungan).
Saat mengembangkan perangkat lunak, perpustakaan Qt digunakan.

Perangkat lunak ini terdiri dari modul fungsional, yang masing-masing memungkinkan Anda untuk melakukan pekerjaan tertentu pada pengaturan mesin.

Modul fungsional adalah widget yang terdiri dari berbagai komponen visual, grafik dan tabel, di mana parameter mesin ditampilkan dalam bentuk yang mudah digunakan.


Modul fungsional "Dasbor"


Modul fungsional yang memungkinkan Anda mengontrol nilai parameter secara dinamis dalam batas yang dapat diterima


Modul fungsi untuk mengatur karakteristik senjata self-propelled

Perangkat lunak yang dikembangkan (program teknologi) dimaksudkan hanya untuk jenis mesin tertentu. Untuk jenis mesin baru, perlu untuk mengembangkan perangkat lunak baru, yang menyebabkan peningkatan signifikan dalam biaya tenaga kerja untuk pengembangan, pengujian, debugging dan, sebagai akibatnya, keterlambatan dalam implementasi perangkat lunak ini - terlepas dari kenyataan bahwa perangkat lunak tersebut sudah diminati pada tahap pengembangan ACS.

Untuk menghindari praktik pengembangan perangkat lunak teknologi yang mahal ini, diputuskan untuk mengembangkan paket perangkat lunak yang akan beradaptasi dengan mesin apa pun yang ACS-nya mendukung protokol pertukaran yang sama.

Konsep dalam mengembangkan paket perangkat lunak adalah kemungkinan memperluas fungsionalitas berdasarkan teknologi plug-in dengan dukungan untuk modul grafis.

Paket perangkat lunak terdiri dari tiga bagian utama:

  1. Inti fungsional kompleks
  2. Mesin sistem ekstensi
  3. Set plugin

Fungsi inti termasuk memastikan pertukaran data yang dapat diandalkan dengan ACS dan melakukan tugas-tugas berikut:

  • Komunikasi RS232 menggunakan protokol khusus
  • Pemantauan terus menerus dari daftar parameter engine
  • Permintaan untuk perubahan parameter mesin
  • Baca permintaan baca mesin
  • Menampilkan parameter dalam bentuk tabel
  • Memproses permintaan dari ekstensi (membuat daftar pemantauan baru jika diperlukan, permintaan tulis dan baca tunggal)

Sistem ekspansi dengan fungsi-fungsi berikut:

  • Cari ekstensi
  • Mendapatkan Grafik Ekstensi
  • Tampilkan objek ekstensi
  • Tugas menghubungkan permintaan (sinyal) dari objek ke inti perangkat lunak

Setiap plugin adalah pabrik objek, dan fungsi utama plugin adalah untuk membuat objek grafik.

Tugas sistem ekstensi adalah untuk mendapatkan objek dan menghubungkannya dengan inti program (menggunakan antarmuka yang terkenal), menginisialisasi dan mengaktifkan objek.

Koneksi objek dengan kernel terjadi menggunakan kelas antarmuka virtual. Untuk mengembangkan ekstensi baru, Anda hanya perlu mengetahui antarmuka yang didukung inti dari program teknologi. Struktur program disajikan pada gambar berikut.



Kembangkan hierarki plugin.



Pertimbangkan hierarki objek grafis yang dibuat oleh plugin. Karena ketika bekerja dengan plugin Anda harus beroperasi pada objek Qt, kelas utama, seperti di perpustakaan Qt, akan menjadi kelas QObject, yang mendukung mekanisme slot sinyal Qt.

Kelas berikutnya adalah QWidget - perlu membuat formulir grafik Anda sendiri.

Selanjutnya, Anda perlu kelas antarmuka interfaceWidget Anda sendiri. Untuk melakukan ini, kelas abstrak dibuat, yang akan diwarisi dari QWidget. Di kelas ini, antarmuka (sinyal, fungsi, slot) dinyatakan yang akan menghubungkan proyek utama dan objek plug-in. Kelas abstrak menyediakan dukungan antarmuka dalam proyek utama.

Kelas MyFormQt, yang mewarisi dari kelas antarmuka interfaceWidget dan mendefinisikan antarmuka dan di mana grafik dan fungsionalitas internal modul dikembangkan. Berkat skema pewarisan ini, kelas MyFormQt mendukung fungsionalitas kelas QWidget dan antarmuka komunikasi yang dikembangkan dengan objek aplikasi utama.

/** \class interfaceWidget \brief  ,      */ class interfaceWidget: public QWidget { public: /// \brief  virtual ~interfaceWidget() = default; /// \brief    /// \param ba,     /// \param ok,    virtual void getByte(QByteArray ba, bool ok) = 0; /// \brief     /// \param ba,     virtual void getRetrieveDate(QByteArray ba, bool ok) = 0; /// \brief     /// \param fl,   virtual void successfullyWritten(bool fl) = 0; /// \brief      /// \param ok     /// \return        virtual QVector<QString > regParam(bool &ok) = 0; signals: /// \brief       /// \param       virtual void signal_writeByteByName(QVector<TVARPARAM > vecParam) = 0; /// \brief      /// \param nameParam   virtual void signal_getByteByName(QVector<QString > nameParam) = 0; /// \brief      /// \param addr       /// \param ndata -    virtual void signal_getByteByAddress(quint32 addr, quint32 ndata) = 0; /// \brief       /// \param addr      /// \param ba    virtual void signal_writeByteByAddress(quint32 addr, QByteArray ba) = 0; /// \brief      /// \param fl, true  , false   virtual void signal_enableMonitoring(bool fl) = 0; }; 

Hirarki semacam itu memungkinkan untuk menghindari masalah warisan berbentuk berlian, sambil mempertahankan mekanisme slot sinyal untuk objek yang dibuat, yang merupakan poin penting dalam teknologi yang diusulkan untuk pengembangan perangkat lunak teknologi.

Inisialisasi dan proses pertukaran data. Seluruh proyek didasarkan pada area MDI, oleh karena itu, semua plugin akan dimuat sebagai jendela MDI yang terpisah.

Plugin pabrik membuat objek kelas MyFormQt, mengonversi pointer ke objek yang dibuat menjadi pointer ke QObject dan meneruskannya ke program teknologi, di mana objek tersebut dikonversi menggunakan operasi dynamic_cast ke objek dari interfaceWidget class, sebagai hasilnya kita mendapatkan akses penuh ke bentuk grafis dan antarmuka objek ini. .

Fungsi pabrik (membuat objek fungsi grafis dalam plugin).

 //------------------------------------------------------------------ QObject *screenOnlinePlugin::getPluginWidget() { MyFormQt *screen = new MyFormQt(); return qobject_cast<QObject *>(screen); //    } //------------------------------------------- 

Fungsi memperoleh dan memulai objek fungsional grafis dalam program teknologi (inti).

 //----------------------------------------------------------------- void PluginSystem::showPluginWidget(QString dirFabrica) { QMdiSubWindow *sWPS = new QMdiSubWindow; pQtTM->m_pma->addSubWindow(sWPS); sWPS->setAttribute(Qt::WA_DeleteOnClose, true); //--------  QPluginLoader loader(dirFabrica); //   QObject *pobj = qobject_cast<QObject*>(loader.instance()); if(!pobj) return; pluginInterface *fabrica = qobject_cast<pluginInterface *>(pobj); if(!fabric) return; QObject *ob = fabrica→getPluginWidget(); //    if(!ob) return; interfaceWidget *interFaceW = dynamic_cast<interfaceWidget *>(ob); if(!interFaceW) return; delete fabrica; //   connect(interFaceW, SIGNAL(), this, SLOT()); sWPS->setWidget(interFaceW); sWPS->show(); //   QVector<QString > vecParam; vecParam = interFaceW→regParam(paramOK); //   if(paramOK) regParamList(vecPlugin[i].namePlugin ,vecParam); } //-------------------------------------------------------------------------------- 

Objek dari kelas interfaceWidget (objek fungsi grafik) ditempatkan pada jendela QmdiSubWindow yang dibuat, dengan demikian mengaturnya sebagai anak.

Selanjutnya, hubungkan (hubungkan) sinyal dan slot objek dengan sinyal dan slot inti program teknologi dan tahap terakhir tampilan jendela menggunakan metode show (). Ketika Anda menutup jendela QmdiSubWindow, objek dari kelas interfaceWidget juga akan dihapus, karena properti DeleteOnClose ditetapkan di muka untuk subWindow di mana objek ditempatkan.

Pertukaran data antara objek fungsional grafik dan program teknologi berlangsung menggunakan data marshaling dan dua mode:
• Mode tunggal (permintaan-respons);
• Mode pemantauan, kami terus menerima data dengan periode yang ditentukan oleh mekanisme pertukaran data dengan perangkat target;

Marshaling adalah proses mengubah data menjadi format yang cocok untuk penyimpanan atau transmisi. Ini digunakan ketika informasi perlu ditransfer antara bagian-bagian berbeda dari satu program atau dari satu program ke yang lain.

Dalam mode tunggal, pengguna menekan tombol dalam objek fungsi grafis (widget) menghasilkan sinyal yang berisi daftar parameter, data yang harus dibaca di perangkat target (ACS) dan ditransfer ke objek fungsi grafik. Mekanisme pertukaran data dalam program utama memproses sinyal dan mulai meminta data RS-232 dari senjata self-propelled, data yang diterima dikemas dalam QbyteArray dan dikirim dengan sinyal ke objek grafis. Objek memiliki daftar parameter yang diminta dan, karenanya, mengetahui tipenya, membongkar data yang terkandung dalam QbyteArray dan menampilkannya dalam bentuk grafik dan tabel dan widget grafik khusus (indikator panah, indikator digital, tombol backlit, dll.).

Dalam mode pemantauan, ketika plug-in diinisialisasi, sistem segera meminta daftar parameter yang diperlukan untuk plug-in, dan selama pemantauan konstan parameternya, ia membaca parameter tambahan untuk plug-in dan memberikannya sebagai paket byte setiap siklus pertukaran data. Periode siklus pertukaran data tergantung pada jumlah parameter yang diminta.

Saat ini, pengujian sedang dilakukan dan pada saat yang sama pengembangan kelompok plug-in untuk tugas yang berbeda.

Templat plugin telah dibuat yang mempercepat proses pengembangan plugin baru. Dengan menggunakan templat plug-in untuk pengembangan modul fungsional baru, perlu untuk membuat bentuk grafik baru dan mengimplementasikan pemrosesan data dan algoritma visualisasi.

Modul perangkat lunak driver fisik untuk antarmuka RS-232 kabel dan WIFI nirkabel dan Bluetooth telah dikembangkan.

Hingga saat ini, paket perangkat lunak beroperasi dalam mode 2-channel, yaitu, ia dapat bekerja secara bersamaan dengan 2 senjata self-propelled (ini adalah persyaratan dari pelanggan). Plugin modul fungsional terhubung ke salah satu dari 2 saluran oleh pengguna.

Selama pengujian, kami berhasil meluncurkan 12 plugin secara bersamaan yang berhasil diproses oleh kernel. Dan bahkan 12 plugin bukanlah batasan untuk sistem ini. Karena sistem buffer ganda Qt, waktu yang dihabiskan untuk menggambar plug-in berkurang dan mencegah plug-in berkedip, jadi ketika menambah jumlah plug-in di masa depan, beban utama hanya akan terjadi pada pertukaran data melalui antarmuka RS-232. Meskipun latihan menunjukkan bahwa selama debugging, tuning, pengujian mesin ACS, 3-4 plug-in bekerja pada saat yang sama sudah cukup.

Sebagai hasil dari pekerjaan, kami menerima paket perangkat lunak untuk pengembangan cepat dari program-program teknologi yang ditujukan untuk penyetelan, commissioning dan pengujian senjata self-propelled untuk berbagai jenis mesin (sistem mekatronika).

2 set plug-in dikembangkan untuk berbagai jenis mesin.

Dengan menghubungkan satu set plug-in untuk jenis senjata self-propelled tertentu ke paket perangkat lunak, kami mendapatkan program multifungsi untuk mengonfigurasi, commissioning, dan menguji jenis senjata self-propelled ini.



Di masa depan, kami berencana untuk menulis artikel tentang pengembangan widget grafis kami sendiri, untuk tugas-tugas khusus dan artikel terpisah tentang tata letak objek grafik.

Source: https://habr.com/ru/post/id457744/


All Articles