La technologie d'acquisition de données joue un rôle important dans le contrôle et l'automatisation industriels et dans d'autres domaines. Le processus général de collecte des données est le suivant :
①Envoyez la commande de sélection de canal à la carte de capture. ②Sélectionnez le numéro de chaîne à collecter. ③Démarrez la conversion A/D. ④Attendez que la conversion soit terminée. ⑤Lisez les données de la carte d'acquisition. Pour l'acquisition multicanal, deux méthodes sont généralement utilisées dans la conception des programmes. Méthode de requête ou méthode d'interruption. La méthode dite de requête consiste à utiliser une boucle pour collecter chaque canal de données en séquence. L'avantage de la méthode de requête est que le programme est simple et facile à mettre en œuvre ; l'inconvénient est que pendant le processus de collecte, le CPU passe la plupart de son temps à attendre, ce qui entraîne un gaspillage de ressources. La méthode d'interruption adopte la forme d'une interruption matérielle - démarrez d'abord la conversion A/D et envoyez un signal d'interruption à la fin de la conversion - le CPU lit les données collectées en répondant à l'interruption de la carte d'acquisition. De cette manière, en attendant la conversion, le CPU peut effectuer d'autres calculs sans être en état d'attente. L'avantage de la méthode d'interruption est que les ressources peuvent être pleinement utilisées ; cependant, la conception du programme est complexe, en particulier lorsque les ressources d'interruption matérielle du système sont limitées, il est également facile de provoquer des conflits d'interruption dans les systèmes d'exploitation tels que Windows ou ; Win95, les utilisateurs ne sont pas autorisés à installer des gestionnaires d'interruptions, cela ne peut pas être réalisé.
---- Les deux méthodes décrites ci-dessus sont toutes deux des méthodes sous DOS ; sous Win95, il existe désormais une meilleure méthode : la technologie multi-threading. Désormais, nous pouvons profiter de la technologie multithread pour la collecte de données.
---- 1. Avantages de l'utilisation du multi-threading pour la collecte de données
---- La chose la plus populaire à propos de Win95/98, outre la belle interface, est le multithreading et le multitâche. Dans l'environnement DOS, le programme en cours d'exécution peut monopoliser toutes les ressources ; dans l'environnement Windows, bien qu'il s'agisse d'un environnement multitâche légèrement rudimentaire, votre programme peut toujours contrôler tout le temps CPU aussi longtemps que vous le souhaitez. Cependant, sous Windows95 et Windows NT, un programme ne peut pas monopoliser tout le temps d'exécution du processeur. De plus, un programme n’est pas une ligne du début à la fin. Au contraire, un programme peut être divisé en plusieurs fragments de programme lors de son exécution et exécutés simultanément. Ces fragments de programme pouvant être exécutés simultanément sont appelés threads. Sous Windows 95 et Windows NT, le système d'exploitation peut exécuter à tour de rôle plusieurs programmes en même temps, ce qui constitue un mode multitâche.
---- L'utilisation du multithreading pour la collecte de données peut efficacement accélérer la vitesse de réponse du programme et augmenter l'efficacité de l'exécution. Les programmes généraux doivent traiter les entrées de l'utilisateur, mais par rapport à la vitesse d'exécution du processeur, la vitesse d'entrée de l'utilisateur est comme marcher ou voler. De cette façon, le processeur perdra beaucoup de temps à attendre les entrées de l'utilisateur (comme dans un environnement DOS). Si le multithreading est utilisé, un thread peut être utilisé pour attendre la saisie de l'utilisateur ; l'autre thread peut effectuer un traitement de données ou d'autres travaux. Pour les programmes de collecte de données, un thread distinct peut être utilisé pour la collecte de données. De cette manière, la nature en temps réel de la collecte peut être garantie au maximum, tandis que d'autres threads peuvent répondre aux opérations de l'utilisateur ou effectuer le traitement des données en temps opportun. Sinon, le programme ne peut pas répondre aux opérations de l'utilisateur lors de la collecte de données ; il ne peut pas collecter de données lors de la réponse aux opérations de l'utilisateur. Surtout lorsque la quantité de données collectées est importante et que la tâche de traitement des données est lourde, la longue attente lors de la collecte est très acceptable si le multithreading n'est pas utilisé.
---- Cependant, le multithreading est beaucoup plus complexe que la programmation ordinaire. Étant donné que plusieurs threads peuvent s'exécuter simultanément à tout moment, de nombreuses variables et données peuvent être modifiées par d'autres threads. Il s’agit du problème de contrôle de synchronisation le plus critique entre les threads dans les programmes multithread.
---- 2. Problèmes qui devraient être résolus par le multithread pour la collecte de données
---- En fait, la complexité de la programmation multithread est temporaire ; si vous utilisez le C traditionnel pour la conception multithread, vous devez alors contrôler vous-même la synchronisation entre les threads. Ce serait compliqué. Cependant, si vous utilisez des méthodes de conception orientées objet et utilisez Delphi pour la programmation multithread, le problème sera beaucoup plus simple. En effet, Delphi a géré pour nous la complexité du multithreading et tout ce que nous avons à faire est d'hériter.
---- Plus précisément, la collecte de données multithread doit effectuer le travail suivant :
---- ① Dérivez votre propre classe SampleThread à partir de la classe TThread. C'est la classe que nous utilisons pour la collecte de données. Lors de la collecte, créez simplement une instance de SampleThread.
---- ② Surcharger la méthode Execute de la super classe TThread. Dans cette méthode, la tâche de collecte de données sera spécifiquement effectuée.
---- ③ Si vous souhaitez collecter et afficher en même temps, écrivez plusieurs processus pour afficher la progression de la collecte pour que la méthode Execute appelle.
----Les attributs/méthodes les plus couramment utilisés dans la classe TThread sont les suivants :
Méthode Create : constructeur Create
(CreateSuspended : booléen );
----Le paramètre CreateSuspended détermine si le thread sera exécuté immédiatement lors de sa création. Si True, le nouveau thread est suspendu après la création ; si False, le thread est exécuté immédiatement après la création.
Attribut FreeOnTerminate :
PRerty FreeOnTerminate : booléen ;
---- Cet attribut détermine si le programmeur est responsable de l'annulation du thread. Si cette propriété est True, VCL détruira automatiquement l'objet thread à la fin du thread. Sa valeur par défaut est False.
Propriétés OnTerminate :
propriété OnTerminate : TNotifyEvent ;
---- Cet attribut spécifie un événement qui se produit lorsque le thread se termine.
---- Regardons un exemple spécifique :
---- 3. Mise en œuvre de la collecte de données multithread
---- Il s'agit d'un programme développé par l'auteur pour mesurer le diagramme de performance d'une unité de pompage. Sa fonction est de collecter les données de charge et de déplacement du point de suspension de l'unité de pompage, puis de réaliser un schéma de travail de l'unité de pompage après traitement. La figure 1 (omise) montre l'interface lors de la collecte de données. Après avoir cliqué sur le bouton "Collecter les données", le programme créera un nouveau fil de discussion et définira ses propriétés. Ce nouveau fil terminera la tâche de collecte de données. La procédure est la suivante :
ProcédureTsampleForm.
DoSampleBtnClick (Expéditeur : TObject);
Commencer
ReDrawBtn.Enabled := Vrai ;
DoSampleBtn.Enabled := False;
FFTBtn.Enabled := Vrai ;
TheSampler := SampleThread.Create(False);
Créer un fil de collecte
TheSampler.OnTerminate := FFTBtnClick;
Tâches à effectuer une fois la collecte terminée
TheSampler.FreeOnTerminate := True;
Annuler une fois la collecte terminée
Fin;
----La définition de classe du thread de collection est la suivante :
Taper
SampleThread = classe (TThread)
Publique
fonction AdRead(ach : octet) : entier ;
Fonction pour lire la carte A/D
procédure UpdateCaption ;
Afficher l'heure de collecte
privé
{Déclarations privées}
protégé
thes, thep : réel ;
dt : réel ;
identifiant : entier ;
st, éd. : LongInt ;
procédure Exécuter ; remplacement ;
C'est la clé.
Fin;
---- Dans cette classe, une fonction AdRead est définie pour faire fonctionner la carte A/D, et les deux processus sont utilisés pour afficher la progression et l'heure de la collecte. Il convient de noter que la fonction AdRead est écrite en assembleur et que le format d'appel des paramètres doit être safecall.
----Le code de la méthode surchargée de clé Execute est le suivant :
Procédure SampleThread.Execute ;
Commencer
StartTicker := GetTickCount;
identifiant := 0;
Répéter
ces := Adread(15) * ad2mv * mv2l;
Acquérir le canal 15
thep := Adread(3) * ad2mv * mv2n;
Acquérir le canal 3
dt := GetTickCount - StartTicker ;
sarray[id] := ces;
parray[id] := thep;
tarray[id] := dt;
inc(id);
Synchroniser (UpdateCaption);
Remarque : Afficher la progression de la collecte
Jusqu'à l'identifiant >=4096 ;
ed := GetTickCount;
Synchroniser (ShowCostTime);
Remarque : Afficher le temps passé
fin;
---- Comme le montre le code ci-dessus, Execute n'est pas essentiellement différent du code ordinaire. La seule différence est que lors de l'affichage de la progression de la collecte et de l'affichage de l'heure, les procédures respectives ne peuvent pas être appelées directement, mais indirectement en appelant Synchronize. Ceci est fait pour maintenir la synchronisation entre les processus.
---- 4.Conclusion
----Le programme ci-dessus est programmé à l'aide de Delphi 4.0 et implémenté sur AMD-K6-2/300. Les résultats du test sont les suivants : en utilisant le multi-threading, il faut généralement 10 à 14 secondes pour collecter 4096 points ; si le multi-threading n'est pas utilisé, cela prend 1 minute à 1 minute et demie ; On peut voir que le multithreading peut améliorer considérablement l'efficacité d'exécution du programme.