En revenant au
premier article, je voudrais expliquer où est apparu le besoin de développer un mécanisme d'extension avec une interface graphique (GUI) et expliquer plus en détail le mécanisme de création de plugins.
Une mission a été reçue pour développer un logiciel technologique pour le réglage, la régulation, le contrôle, la collecte et l'analyse des informations des canons automoteurs (systèmes de contrôle automatisés) du moteur sur le système d'exploitation russe. Où l'échange entre les canons automoteurs et le programme technologique s'effectue via l'interface RS-232 ou RS422, selon un protocole d'échange spécial.
Après avoir examiné et analysé les capacités de la liste des systèmes d'exploitation russes, le système d'exploitation AstraLinux a été choisi. Il s'agit d'un système à usage spécial basé sur la distribution Debian, conçu pour protéger complètement les informations et créer des systèmes automatisés sécurisés. Le système d'exploitation Astra Linux est développé en deux versions: Common Edition (gratuite, à usage général) et Special Edition (payante, à usage spécial avec un ensemble d'algorithmes de protection).
Lors du développement du logiciel, la bibliothèque Qt a été utilisée.
Le logiciel se compose de modules fonctionnels, chacun d'eux vous permettant d'effectuer un travail spécifique sur les paramètres du moteur.
Le module fonctionnel est un widget composé de divers composants visuels, graphiques et tableaux, où les paramètres du moteur sont affichés sous une forme conviviale.
Module fonctionnel «Dashboard»
Module fonctionnel qui vous permet de contrôler dynamiquement les valeurs des paramètres dans des limites acceptables
Module de fonction pour régler les caractéristiques des canons automoteursLe logiciel développé (programme technologique) n'était destiné qu'à un certain type de moteur. Pour un nouveau type de moteur, il était nécessaire de développer un nouveau logiciel, ce qui a entraîné une augmentation significative des coûts de main-d'œuvre pour le développement, les tests, le débogage et, par conséquent, des retards dans la mise en œuvre de ce logiciel - malgré le fait que ce logiciel était déjà en demande au stade de développement ACS.
Afin de sortir de cette pratique coûteuse de développement de logiciels technologiques, il a été décidé de développer un progiciel qui s'adaptera à tout moteur dont ACS supporte le même protocole d'échange.
Le concept dans le développement du progiciel était la possibilité d'étendre les fonctionnalités basées sur la technologie de plug-in avec le support des modules graphiques.
Le progiciel se compose de trois parties principales:
- Noyau fonctionnel du complexe
- Moteur de système d'extension
- Ensemble de plugins
Les fonctions principales incluent la garantie d'un échange de données fiable avec ACS et l'exécution des tâches suivantes:
- Communication RS232 utilisant un protocole spécial
- Surveillance continue de la liste des paramètres du moteur
- Demande de modification des paramètres moteur
- Lire les requêtes de lecture du moteur
- Afficher les paramètres sous forme de tableau
- Traitement des demandes des extensions (création d'une nouvelle liste de surveillance si nécessaire, demandes d'écriture et de lecture uniques)
Système d'extension avec les fonctions suivantes:
- Rechercher des extensions
- Obtention de graphiques d'extension
- Afficher les objets d'extension
- La tâche de relier les demandes (signaux) des objets au noyau logiciel
Chaque plugin est une fabrique d'objets, et la fonction principale du plugin est de créer un objet graphique.
La tâche du système d'extension est d'obtenir un objet et de l'associer au cœur du programme (en utilisant des interfaces bien connues), d'initialiser et d'activer l'objet.
La connexion des objets avec le noyau s'effectue à l'aide d'une classe virtuelle d'interfaces. Pour développer une nouvelle extension, il vous suffit de connaître les interfaces prises en charge par le cœur du programme technologique. La structure du programme est présentée dans la figure suivante.

Développer une hiérarchie de plugins.

Considérez la hiérarchie de l'objet graphique créé par le plugin. Puisque lorsque vous travaillez avec des plugins, vous devez opérer sur des objets Qt, la classe principale, comme dans la bibliothèque Qt, sera la classe QObject, qui prend en charge le mécanisme de créneau de signal Qt.
La classe suivante est QWidget - il est nécessaire de créer vos propres formes graphiques.
Ensuite, vous avez besoin de votre propre classe d'interfaces, interfaceWidget. Pour ce faire, une classe abstraite est créée, qui sera héritée de QWidget. Dans cette classe, les interfaces (signaux, fonctions, slots) sont déclarées qui connecteront le projet principal et l'objet plug-in. Une classe abstraite fournit un support d'interface dans le projet principal.
La classe MyFormQt, qui hérite de la classe d'interface interfaceWidget et définit les interfaces et dans laquelle les graphiques et les fonctionnalités internes du module sont développés. Grâce à ce schéma d'héritage, la classe MyFormQt prend en charge les fonctionnalités de la classe QWidget et les interfaces de communication développées avec l'objet d'application principal.
class interfaceWidget: public QWidget { public:
Une telle hiérarchie permet de contourner le problème de l'héritage en forme de diamant, tout en conservant le mécanisme de fente de signal pour l'objet créé, ce qui est un point important dans la technologie proposée pour le développement de logiciels technologiques.
Processus d'initialisation et d'échange de données. L'ensemble du projet est basé sur une zone MDI, donc tous les plugins seront chargés dans une fenêtre MDI distincte.
Le plugin d'usine crée un objet de la classe MyFormQt, convertit le pointeur vers l'objet créé en un pointeur vers QObject et le transmet au programme technologique, où l'objet est converti à l'aide de l'opération dynamic_cast en un objet de la classe interfaceWidget, ce qui nous donne un accès complet à la forme graphique et aux interfaces de cet objet .
Fonction Factory (création d'un objet fonction graphique dans le plugin).
Fonction d'obtention et d'initiation d'un objet fonctionnel graphique dans un programme technologique (core).
Un objet de la classe interfaceWidget (objet de fonction graphique) est placé sur la fenêtre QmdiSubWindow créée, le définissant ainsi comme un enfant.
Ensuite, connectez (connectez) les signaux et les fentes de l'objet avec les signaux et les fentes du cœur du programme technologique et la dernière étape de l'affichage de la fenêtre en utilisant la méthode show (). Lorsque vous fermez la fenêtre QmdiSubWindow, l'objet de la classe interfaceWidget sera également supprimé, car la propriété DeleteOnClose a été définie à l'avance pour la sous-fenêtre dans laquelle l'objet a été placé.
L'échange de données entre des objets fonctionnels graphiques et un programme technologique se fait à l'aide du marshaling de données et de deux modes:
• Mode unique (requête-réponse);
• Mode surveillance, nous recevons constamment des données avec une période déterminée par le mécanisme d'échange de données avec l'appareil cible;
Le marshaling est le processus de conversion des données dans un format adapté au stockage ou à la transmission. Il est utilisé lorsque des informations doivent être transférées entre différentes parties d'un programme ou d'un programme à un autre.Dans un seul mode, l'utilisateur appuie sur un bouton dans un objet fonctionnel graphique (widget) génère un signal contenant une liste de paramètres, dont les données doivent être lues dans l'appareil cible (ACS) et transférées vers l'objet fonctionnel graphique. Le mécanisme d'échange de données du programme principal traite le signal et commence à demander des données RS-232 aux canons automoteurs, les données reçues sont emballées dans QbyteArray et envoyées avec un signal à un objet graphique. L'objet a une liste de paramètres demandés et, par conséquent, connaît leurs types, décompresse les données contenues dans QbyteArray et les affiche sous la forme de graphiques et de tableaux et de widgets graphiques spécialisés (indicateurs de flèche, indicateurs numériques, boutons rétro-éclairés, etc.).
En mode surveillance, lorsque le plug-in est initialisé, le système demande immédiatement la liste des paramètres nécessaires pour le plug-in, et pendant la surveillance constante de ses paramètres, il lit des paramètres supplémentaires pour le plug-in et les émet sous la forme d'un paquet d'octets pour chaque cycle d'échange de données. La période du cycle d'échange de données dépend du nombre de paramètres demandés.
À l'heure actuelle, les tests sont en cours et en même temps le développement de groupes de plug-ins pour différentes tâches.
Un modèle de plugin a été créé pour accélérer le processus de développement de nouveaux plugins. En utilisant le modèle de plug-in pour le développement d'un nouveau module fonctionnel, il est nécessaire de créer une nouvelle forme graphique et de mettre en œuvre des algorithmes de traitement et de visualisation des données.
Des modules logiciels de pilotes physiques pour l'interface filaire RS-232 et WIFI sans fil et Bluetooth ont été développés.
À ce jour, le progiciel fonctionne en mode 2 canaux, c'est-à-dire qu'il peut fonctionner simultanément avec 2 pistolets automoteurs (c'était l'exigence du client). Les plugins des modules fonctionnels sont connectés à l'un des 2 canaux par l'utilisateur.
Pendant les tests, nous avons réussi à lancer simultanément 12 plugins qui ont été traités avec succès par le noyau. Et même 12 plugins ne sont pas la limite de ce système. En raison du système de double tampon Qt, le temps passé à dessiner des plug-ins est réduit et empêche les plug-ins de scintiller.Ainsi, lors de l'augmentation du nombre de plug-ins à l'avenir, le principal fardeau ne concernera que l'échange de données via l'interface RS-232. Bien que la pratique montre que pendant le débogage, le réglage et les tests d'un moteur ACS, 3-4 plug-ins fonctionnant en même temps suffisent.
À la suite de travaux, nous avons reçu un progiciel pour le développement rapide de programmes technologiques destinés au réglage, à la mise en service et au test de canons automoteurs pour différents types de moteurs (systèmes mécatroniques).
2 jeux de plug-ins ont été développés pour différents types de moteurs.
En connectant un ensemble de plug-ins pour un type spécifique de pistolets automoteurs au progiciel, nous obtenons un programme multifonctionnel pour configurer, mettre en service et tester ce type de pistolets automoteurs.

À l'avenir, nous prévoyons d'écrire un article sur le développement de nos propres widgets graphiques, pour des tâches spécifiques et un article séparé sur la mise en page des objets graphiques.