Delphi, niveau 2, page 3

Contenu de cette page : Composant pilotant les cartes d'acquisition Candibus, description, installation, mode d'emploi, fonctions, code source (pour nos collaborateurs), transfert de mesures sur un réseau local (intranet) ou global (Internet), utilisation de la base de registre de Windows, pour sauvegarder des paramètres

Page modifiée le 8 décembre 2001. Version 6 du composant, déboguée pour Delphi 3, comportant un événement supplémentaire destiné à limiter les erreurs des élèves et déboguée pour les acquisitions point par point. Une erreur sur la FFT 1024 points corrigée. (Donc sur cette version, tout doit fonctionner parfaitement).

Charger le composant Candibus, PhyJiC télécharger le composant PhyJiC
 

Une version allégée de ce composant est maintenant proposée ; elle est 50 % moins rapide pour la FFT sur un nombre de points quelconque (1023 par exemple), mais n'emploie plus la librairie Math, apparemment indisponible sur certaines versions de Delphi.
 

1 Description


Ce composant PhyJiC, de la classe TPhyJiC, pilote les cartes Candibus et propose quelques autres fonctions utiles. Il est livré avec un fichier d'aide en ligne que vous pouvez ouvrir (avant même d'avoir installé le composant) par un simple double clic dans Windows. Ce fichier comporte des explications concernant l'installation et l'emploi du composant, en plus de la description des variables, procédures, méthodes et événements disponibles. Le tout avec des exemples de code Delphi.

Pour associer cette aide à Delphi 5 et avec les dernières versions de Delphi 4 (cela ne marche hélas pas avec les autres versions), copiez cette aide dans le dossier Delphi5 (ou 4) \ Help \. Puis, dans Delphi 5, faites : Aide | Personnaliser. OpenHelp s'ouvre. Sélectionnez l'onglet Index et faites : Édition | Ajouter des fichiers. Retrouvez le fichier d'aide PhyJiC.hlp, validez et sauvegardez. En cliquant sur l'icône du composant et en faisant F1, le fichier s'ouvrira. Par contre, vous ne pouvez pas l'ouvrir sur une fonction ou propriété particulière, car le code correspondant n'a pas été écrit.

Dans les autres versions de Delphi, faites de même F1, mais Delphi ne retrouve pas seul le fichier. Vous pouvez le rechercher, à partir de l'aide qui s'ouvre, en revenant en arrière et en faisant : Fichier | Ouvrir.

Le composant pilote les entrées sorties numériques de la carte et le convertisseur analogique numérique. Il  lance une salve d'acquisitions de tensions sur deux canaux, ou une mesure de tension moyenne, ou même une mesure unique pour ceux qui aiment se faire soufrir (procédures gardées à titre pédagogique). Il peut de plus effectuer la transformation de Fourier numérique (FFT) des mesures obtenues, ou la FFT de Hamming.

Pour éviter qu'une acquisition ne soit interrompue de manière aléatoire par Windows, le composant prend le contrôle des horloges du PC, pendant les mesures ; vous perdez donc pendant un moment le contrôle de votre ordinateur, vous n'avez plus de souris... Vous avez donc le choix : Faire une salve de mesure pas trop longues (par Acquerir) ou déclencher des mesures successives (de préférence de tensions moyennes pour diminuer les parasites) par le Timer (imprécis) de Delphi Windows.

Ce composant permet aussi de transférer par copier coller les mesures et données, par exemple dans Excel. Il peut sauvegarder ces données dans un fichier, lancer une communication sur Internet, ou un fichier d'aide en ligne.

Charger le composant Candibus, PhyJiC télécharger le composant PhyJiC
 

Une version allégée de ce composant est maintenant proposée ; elle est 50 % moins rapide pour la FFT sur un nombre de points quelconque (1023 par exemple), mais n'emploie plus la librairie Math, apparemment indisponible sur certaines versions de Delphi.

2 Installation (revue et corrigée)


Les fichiers nécessaires vous sont livrés compressés, dans un dossier auto extractible, nommé candibus.exe. Décompressez le par un double clic, en notant où tout va se ranger. (Vous pouvez avoir intérêt à créer au préalable un dossier de rangement). Vous disposez alors de quatre fichiers, OscilloC.res, UPhyJiC.dcu, UPhyJiC.pas et PhyJiC.hlp.

Recherchez le dossier Delphi sur votre disque dur. Si vous l'ignorez totalement, vous pouvez faire Démarrer | Rechercher ou cliquer droit sur l'icône Delphi, si celle-ci est visible sur votre bureau, et faire Propriétés | Raccourci.
Collez dans le dossier Delphi \ Lib  les fichiers OscilloC.res (l'image qui figurera dans votre barre de composants VCL Delphi), UPhyJiC.pas et UPhyJiC.dcu, unité Delphi compilée qui contient le code pilotant la carte.

Il vaudrait mieux, dans le dossier Delphi \ Lib, créer un sous-dossier Personnel, pour ne pas mélanger ce composant aux autres, mais cela est un peu plus compliqué et je vous conseille de procéder ainsi si vous créez vos propres composants, ce qui nécessite de nombreux tests, donc de nombreuses modifications.

Dans Delphi \ Help, collez Candibus.hlp.

Il faut maintenant installer le composant dans un paquet. Dans Delphi, faites Composant | Installer un composant, retrouvez par la boîte de dialogue, UPhyJiC.pas qui se trouve dans Lib, acceptez le paquet proposé (dclusr30 ou 40 ou 50, selon que votre version de Delphi est la 3, la 4 ou la 5) et répondez Oui à chaque demande, paquet reconstruit, compilé, enregistré.
Voilà, c'est fini.

Le composant est opérationnel,  un nouvel onglet Physique apparaît dans votre VCL (bibliothèque de composants visuels), avec l'icône du composant PhyJiC.PhyJiC, composant. Pour l'installation de l'aide en ligne, voyez le paragraphe 1, Description.

Haut de cette page
 

3 Mode d'emploi


Placer un exemplaire de ce composant non visuel sur votre Form (fenêtre). Dans l'inspecteur d'objets donnez lui un nom, Name sympathique, par exemple P.
Quelques propriétés sont modifiables dans l'inspecteur d'objet : AdressOffset normalement à 0, à modifier uniquement si vous avez déplacé des cavaliers sur la carte pour décaler ses adresses, et Configuration qui vous propose différentes possibilités pour congigurer les 3 ports logiques en entrée ou sortie. Cela vous évitera de devoir retenir les valeurs numériques correspondantes, mais il est possible d'effectuer une configuration classique par écriture du bon octet à la bonne adresse. SeparateurDecimal vous permet de choisir le point ou la virgule comme séparateurs décimaux, pour transférer vos données vers d'autres logiciels.

Toutes les autres variables, procédures et fonctions publiques sont accessibles dans le corps du programme. Entrez le nom de votre composant suivi d'un point et attendez une seconde ; la liste de ce qui est possible apparaît. Si elle n'apparaît pas (et si le composant est bien installé), c'est que votre programme comporte déjà un bug. Validez une fonction ou une procédure, ajoutez une parenthèse ouvrante, attendez une seconde, Delphi vous précise le type de variable attendue, avec un nom destiné à vous guider. A la compilation, ces procédures seront automatiquement incluses dans votre exécutable. Merveilleux !

Pour l'instant ce fichier d'aide en ligne associé au composant n'est pas appelable directement par F1 ; la technique à appliquer nous a paru hermétique. Sélectionnez le composant, faites F1, faites Annuler dans Rubriques d'aide et dans Aide Delphi, faites Fichier | Ouvrir et recherchez ce fichier d'aide que vous aurez eu la bonne idée de coller dans Delphi \ Help.

Note importante :


Lorsqu'une acquisition est en cours, pour éviter une intervention incongrue du système d'exploitation, les interruptions du processeur sont invalidées. Cela signifie que l'acquisition est déclenchée de manière bien régulière par l'une des horloges de votre PC (pas de trou intempestif dans les mesures parce que Windows a décidé de faire tourner inutilement le disque dur ou autre fantaisie). Par contre pendant ce temps, clavier, souris ... sont neutralisés. Tant que vous êtes en mode débogage sous Delphi, vous pouvez cependant reprendre le contrôle de la machine. Mais pas lorsque l'exécutable tourne de façon indépendante, donc veillez à interdire une acquisition trop longue, par un test.

Haut de cette page
 

4 Quelques fonctions disponibles

Liste incomplète, car le composant a beaucoup été amélioré, donc voyez aussi l'aide en ligne et la liste qui se déroule dans le code source Delphi lorsque vous entrez le nom du composant, suivi d'un point.

Liste des variables


avertissement : String ; Si vous commettez une erreur (demande de fréquence d'acquisition trop élevée, négative ...) le composant choisit une valeur mieux appropriée et fait la mesure. Seule la lecture de la variable avertissement vous permet de savoir que quelque chose d'anormal s'est passé. Nous avons préféré cette technique, à celle qui aurait consisté à afficher systématiquement une boîte de dialogue, interrompant par la même le déroulement du programme. Il vous revient d'afficher avertissement, dans un StatusBar par exemple. Cela est simple en employant l'évènement OnUsing qui renvoie systématiquement les messages d'erreur. Voir dans l'aide en ligne, un exemple de code associé à cet évènement.

frequenceVraie : Real ; Lorque vous choisissez une fréquence (raisonnable), la valeur exacte demandée n'est pas toujours possible car le timer doit faire un nombre entier de 'tours' avant de déclencher une nouvelle mesure ; le composant choisit la valeur la plus proche possible et écrit cette valeur réellement employée dans la variable frequenceVraie, que vous pouvez consulter.

delaiMesureTensionMoyenne : Real ; Même chose lorsqu'on mesure une tension moyenne sur une certaine durée.

tensionVoie1, tensionVoie2 : Real ; Valeurs de retours des mesures de tensions moyennes sur les deux voies.

mesure1 ;  tableau des tensions (entiers convertis en nombres réels) mesurées sur voie 1,
mesure2 ;  réels mesurés sur voie 2,

module ; tableau des modules obtenus par FFT,
partieReelle ; tableau des parties réelles obtenues par FFT,
partieImaginaire ; tableau des parties imaginaires obtenues par FFT.

Haut de cette page
 

Liste des fonctions logiques :


Procedure Configurer(valeur : Byte) : Configure les 3 ports en entrée ou sortie (voir la notice de la carte Candibus,
pour les valeurs à inscrire)

Procedure EcrireDansA(valeur : Byte) : pour écrire un octet sur le port A,
Procedure EcrireDansB(valeur : Byte),
Procedure EcrireDansC(valeur : Byte),

Function LireA : Byte : pour lire un octet sur le port A,
Function LireB : Byte,
Function LireC : Byte.

Liste des fonctions d'acquisition par conversion analogique -> numérique :

Procedure AcquerirMoyenne(nombrePoints : Cardinal ; frequence : Real) : Effectue nombrePoints mesures, et en
donne la valeur moyenne dans tensionVoie1, et tensionVoie2.

Procedure Acquerir(nombrePoints : Word ; frequence : Real) : Effectue nombrePoints mesures, et donne les résultats
dans les tableaux mesure1, et mesure2.

Procedure FFT(numeroCourbeOuSigne, nombreDePoints : Integer) : Si numeroCourbeOuSigne vaut 1, effectue la
FFT sur nombreDePoints du tableau mesure1 ; s'il vaut 2 c'est mesure2 qui est transformé. nombreDePoints doit être
inférieur ou égal à 1024. Il ne doit pas impérativement être une puissance de 2, mais en ce cas, le calcul est plus lent.
Les résultats de la FFT sont rangés dans les tableaux module, partieReelle, partieImaginaire.
Si numeroCourbeOuSigne vaut -1, c'est la FFT réciproque qui est calculée, mais ici uniquement sur un nombre de
points qui est une puissance de deux. Les nombres sont pris dans les tableaux partieReelle, partieImaginaire et les
résultats sont rangés comme dans le cas précédent. Nous avons choisi cette façon de faire pour ne pas perturber les
élèves avec la transformée inverse.

Procedure FFTHamming(numeroCourbeOuSigne, nombreDePoints : Integer) : Calcule un spectre de Fourier, avec
une fenêtre de Hamming, si numeroCourbeOuSigne vaut 1 ou 2 (mesure1 ou mesure2, correspondant aux voies 1 et
2). Si numeroCourbeOuSigne vaut -1, une FFT inverse est calculée, sans fenêtrage.

Procedure LancerEchantNumVoie1 : Pour effectuer une seule mesure à la fois, on lance l'acquisition
Procedure LancerEchantNumVoie2

Function LireVoie1 : Real : après échantillonnage et numérisation, on lit une valeur.
Function LireVoie2 : Real

Procedure Copier(nombrePoints : Word ; nomDeLaListe : String) : Copie dans le presse-papiers le nombre de points
indiqué par nombrePoints. Vous devez indiquer les points qui vous intéressent, mesure1,
mesure2, module, partieReelle, partieImaginaire, mesures1Et2. Exemple Copier(128, module) envoie 128 fréquences et 128
points du module de la FFT dans le presse-papiers.
Une fois copiés, les points peuvent être transférés dans Excel.

Première technique : Vous cliquez dans la case vide en haut à gauche et vous faites un Coller, accessible soit par Edition | Coller, soit par Clic droit | Coller. Les 2 x 128 cases se remplissent automatiquement.

Ainsi que les procédures Enregistrer, EnregistrerSous...

Haut de cette page
 

Liste des autres fonctions


qui n'ont rien à voir avec la carte Candibus, mais qui sont susceptibles d'améliorer grandement la présentation d'un
logiciel :
Procedure LancerAideEnLigne(nomDuFichierDaide : String) : Le fichier d'aide peut être rangé au même niveau que
l'exécutable (dans le même dossier), ou dans un sous dossier nommé Aide, ou Aides, ou Help. Si le fichier d'aide se
nomme aideMesure.hlp, faire : LancerAideEnLigne(aideMesure) ; .

Function AdresseDuDossierPrincipal : String : Retourne l'adresse du dossier où se trouve l'exécutable.

Procedure AccederAUnSiteInternet(adresseSite : String) : A associer au menu déroulant Aide.
Procedure EcrireAuxAuteurs (adresseMail : String).
Procedure Enregistrer
Procedure EnregistrerSous

Quelques fonctions et procédures sont destinées à faciliter les transmissions de données à travers un réseau.

Enfin deux événements sont asociés au composant :

OnNeFaitRien (comme son nom l'indique) qui est destiné à pallier aux erreurs des élèves qui auraient la mauvaise idée d'écrire du code déclenchant une acquisition dans l'événement qui s'ouvre automatiquement par un double clic sur l'icône représentant le composant PhyJiC. Déclencher une acquisition dans l'événement OnUsing qui est déclenché par l'utilisation de la carte, conduit à une procédure s'appelant elle-même, d'où débordement de la pile et plantage de l'ordinateur. Voyez les leçons dans le chapitre TP, IESP, MPI.

OnUsing, destiné à utiliser les messages d'erreur renvoyés par le composant PhyJiC (voir un exemple de code dans l'aide en ligne).

Charger le composant Candibus, PhyJiC télécharger le composant PhyJiC
 

Une version allégée de ce composant est maintenant proposée ; elle est 50 % moins rapide pour la FFT sur un nombre de points quelconque (1023 par exemple), mais n'emploie plus la librairie Math, apparemment indisponible sur certaines versions de Delphi.

Haut de cette page
 

5 Code source


Les collègues désirant s'inspirer de ce composant pour piloter d'autres cartes peuvent me contacter pour obtenir le mot de passe d'accès au domaine réservé aux collaborateurs de ce site. Ils pourront disposer du source avec les fichiers d'accompagnement permettant le déboggage (il faut savoir que celui-ci est nettement plus difficile avec un composant, qu'avec une simple Form).

Haut de cette page
 

6 Transfert de mesures sur un réseau local (intranet) ou global (Internet)


Diverses solutions existent, comportant toutes leurs avantages et leurs inconvénients. Vous trouverez sur ce site un logiciel libre qui réalise cela en écrivant (poste serveur) ou en lisant (autres postes) les données numériques sous forme d'un fichier Html. Les paramétrages ne sont à effectuer qu'une fois, si vous ne changez pas de serveur. Ainsi, vous pouvez installer une expérience (de chimie par exemple) sur un seul poste, faire l'acquisition et traiter les résultats sur tous les postes raccordés en réseau. Seules les données numériques sont transmises, pour éviter les bavardages réseau.

Les collègues désirant transférer des données par programmation peuvent me contacter pour obtenir le mot de passe d'accès au domaine de ce site réservé aux professeurs . Ils pourront disposer d'information complémentaires pour réaliser facilement en Delphi les logiciels nécessaires.

Haut de cette page
 

7 Utilisation de la base de registre


Beaucoup de programmes ont besoin d'enregistrer, pour un usage ultérieur, des paramètres. Le mieux est de faire cela dans la base de registre.

Voici un exemple extrait de notre programme de transfert de données sur réseau, par création et lecture d'un fichier Html. Notez la protection contre une éventuelle erreur par Try Except, ou Try Finally.

Dans la clause Uses de l'Unit concernée, ajoutez Registry.

Uses
   Registry ;

A l'endroit adéquat, déclarez les variables nécessaires. Cela évitera les erreurs d'adresses dues aux fautes de frappe

Var
nomBaseRegistre : String = 'Software\PhyJi\' ;
nomDeCeProgramme : String = 'TransfertsHTML' ;
Const
cleRegAdr : String = 'Adresse' ;
cleRegRetLigne : String = 'Retour ligne' ;
cleRegSepDecim : String = 'Separateur decimal' ;
cleRegNOctets : String = 'Nombre octets par page' ;
cleRegChiffrSignif : String = 'Nombre de chiffres' ;

Renvoyez la procédure Initialization de votre Unit à une procédure, nommée ici FaireAuDemarrage (cela permet de déclarer des variables locales à l'initialisation, ce qui n'est pas possible dans Initialization). De même pour laprocédure Finalization.

Initialization
//adresseDossierDeExecutable := ExtractFilePath(Application.EXEName)
FaireAuDemarrage ;
SepDecimal := DecimalSeparator ;  on stocke l'ancien séparateur décimal

Finalization
FaireALaFermeture ;
DecimalSeparator := SepDecimal ;
 

Procedure FaireAuDemarrage ;
Var
registre : TRegistry ;
adresseRegistre : String ;
Begin
adresseRegistre := nomBaseRegistre + nomDeCeProgramme ;
registre := TRegistry.Create ;
Try
   If (registre.OpenKey(adresseRegistre, False)) Then Begin on ne force pas la création de la clé
   If registre.ValueExists(cleRegAdr) Then
   adresseLecturePageHTML := registre.ReadString(cleRegAdr) on lit la String contenant l'adresse
   Else adresseLecturePageHTML := '' ;
   If registre.ValueExists(cleRegChiffrSignif) Then
   nombreChiffres := registre.ReadInteger(cleRegChiffrSignif) Else on lit l'Integer nombre de chiffres significatifs
   nombreChiffres := 4 ;
   End ;
Finally registre.Free End ;
End ;
 

Procedure FaireALaFermeture ;
Var
registre : TRegistry ;
adresseRegistre : String ;
Begin
adresseRegistre := nomBaseRegistre + nomDeCeProgramme ;
registre := TRegistry.Create ;
//lorsque "adresse" n'existe pas, True force sa création la réponse est
//True s'il n'y a pas de problème. False interdit la création et la
//réponse vaudra False si "adresse" n'existe pas
Try
   registre.OpenKey(adresseRegistre, True) ;
   registre.WriteString(cleRegAdr, adresseLecturePageHTML) ; on lit une String
   registre.WriteInteger(cleRegChiffrSignif, nombreChiffres) ; on lit un Integer
Finally registre.Free End ;
End ;
 

Notez que l'exemple précédent travaille dans la clé principale par défaut. Pour vous placer dans la clé principale souhaitée, commencez votre procédure par du code de ce style :

registre.RootKey := HKEY_CURRENT_USER ; ou bien
registre.RootKey := HKEY_LOCAL_MACHINE ;

Haut de cette page