Charger
le composant Candibus, 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.
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
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.
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..
Pour l'installation de l'aide en ligne, voyez le paragraphe 1, Description.
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.
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.
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.
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...
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
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.
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).
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.
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 ;