Pour ce qui est du matériel de mesure connectable à l'ordinateur, il y a une grande diversité : certains appareils sont des cartes à enficher à l'intérieur de l'ordinateur, d'autres sont des appareils à brancher sur une prise sérielle RS232, d'autres sur la prise parallèle, ou bien sur la prise "manettes de jeux", etc.
Dans les explications qui suivent, il sera surtout question du boitier
ADES, diffusé par la Maison des Enseignants de Provence. C'est un
petit boitier à brancher sur la prise parallèle (prise "imprimante"),
et qui a deux entrées analogiques sur 10 bits (normalement entre
0 et 5 V) et 4 sorties logiques sous forme de relais. Des adaptateurs lui
permettent d'utiliser les capteurs de Calibration, fondamentalement conçus
pour être utilisés avec les calculettes de la série
TI82 (mesure d'oxygène, de pH, etc).
Il sera aussi question de l'interface Orphy-GTS, diffusée par
Micrelec, et qui possède un grand nombre d'entrées
et de sorties logiques et analogiques. Cet appareil doit être connecté
sur une prise série.
A partir de ces deux appareils, on peut imaginer que les solutions
envisagées sont universelles.
Dans le système proposé ici, chaque DLL de mesure sera caractéristique d'un appareil de mesure (ou d'une façon d'utiliser cet appareil). La DLL contiendra les fonctions de communication avec l'appareil de mesure : lecture des entrées analogiques et logiques, commande des sorties logiques et analogiques, ainsi que des fonctions de service : indication du nom de l'appareil, de la version du pilote, du nom et du nombre des voies d'entrée et de sortie, de l'état des sorties, etc. C'est la DLL qui est capable d'envoyer les bons signaux sur la voie RS232, ou bien de changer l'état des ports de l'ordinateur... Par contre, la DLL ne fera pas les travaux compliqués tels que le traçage des graphiques des points de mesure, ou bien la sauvegarde des résultats dans un fichier compatible avec les tableurs...
Le logiciel d'application lui-même appellera les fonctions de la DLL (lecture des entrées et commande des sorties...). Il ne se posera pas le problème de savoir comment faire les mesures : il enverra simplement l'ordre à la DLL de faire la mesure et de lui renvoyer le résultat. Ensuite, c'est ce logiciel d'application qui utilisera les résultats pour les présenter à l'utilisateur, soit sous forme d'un tableau, soit sous forme d'un graphique, soit sous forme d'un cadran à aiguille, soit par une alarme qui se déclenche lorsqu'un seuil est dépassé, etc.
Ce système fonctionne correctement depuis plusieurs années
avec les logiciels de la famille Mesugraf pour Windows. Ce logiciel est
développé en Delphi 1, qui est un langage de type Pascal,
conçu pour les versions 16 bits de Windows (Windows 3.1). Il fonctionne
avec un grand nombre d'appareils de mesures (Orphy GTS et portable, Jeulin
ESAO3, ADES, Pierron SMF10 et Expert, et un grand nombre de multimètres,
luxmètres, thermomètres, balances... à brancher sur
une prise sérielle).
Je propose de développer ce système pour faire des logiciels
avec les versions 32 bits de Windows, ainsi qu'avec Linux. Les DLL développées
pour Windows 16 bits ne sont pas utilisables avec ces systèmes.
Bien que basées sur le même principe, les librairies pour
ces systèmes doivent être légèrement modifiées
et recompilées pour pouvoir fonctionner.
Directive en C++Builder | Directive en Delphi-Pascal | Ordre des paramètres | Nettoyage | Transfert de paramètre dans les registres | transformation du nom de la fonction «mafonction» par C++Builder |
__fastcall | register (par défaut) | De gauche à droite | Routine | Oui | @mafonction |
pascal ou __pascal | pascal | De gauche à droite | Routine | Non | pascal : mafonction
__pascal : MAFONCTION |
cdecl ou __cdecl (par défaut) | cdecl | De droite à gauche | Appelant | Non | cdecl : @mafonction
__cdecl : _mafonction |
__stdcall | stdcall | De droite à gauche | Routine | Non | mafonction
|
safecall | De droite à gauche | Routine | Non | (pour des «méthodes d'interface dual», sans intérêt ici) | |
Il y a donc un double problème :
D'une part, il faut que la convention d'appel soit la même pour
la librairie et le programme appelant.
D'autre part, il faut qu'il n'y ait pas de problèmes de nom,
c'est à dire que le programme appelant trouve bien la fonction avec
le nom qu'il cherche. Or C++Builder change souvent le nom des fonctions
! Si, dans le texte-source, on déclare une fonction avec le nom
mafonction (par la syntaxe int __fastcall mafonction(int n) ), en
fait, le programme écrit en Delphi devra chercher la fonction @mafonction
!
C'est une source d'embrouilles multiples.
Par conséquent, le mieux est de choisir d'utiliser une convention
d'appel possible à la fois en Delphi et en C++, et qui ne pose pas
de problème de nommage. Le mieux est de choisir la convention «stdcall»,
d'autant plus que std signifie «standard», et que la standardisation
est justement notre propos.