Syntaxe proposée pour les DLL :

(retour au menu programmation 32 bits)

Fonctions de base

La numérotation des voies commencera à zéro, au moins pour ce qui est de la programmation. Ceci n'empêche pas éventuellement que la première voie (numérotée 0 pour la programmation) puisse porter un nom tel que "Voltmètre 1".

La syntaxe proposée ici est voisine de celle commandant la centrale de mesure Orphy-GTS de Micrelec ; si l'opération qu'elles doivent faire est incorrecte (voie inexistante, par exemple) elles renvoient une valeur fixe (par exemple -777 pour ce qui est des fonctions numériques).

Pour les réels ( de type "double"), la fonction sera précédée de P (comme "Pointeur") lorsqu'elle renverra l'adresse du résultat et non celui-ci directement.

Lors du chargement de la DLL, chaque fonction est identifiée par son nom, qui est une chaîne de caractères. Il y a une différence entre les majuscules et les minuscules ; il vaut mieux convenir que tous les noms de fonctions seront en minuscule.
 
 

Chaque variante de fonction de mesure sera associée à un nom particulier. Un premier intérêt en est d'indiquer clairement à quoi correspond la variante. Par exemple, pour les interfaces ayant plusieurs calibres sélectionnables logiciellement (Leybold-Cassy...), chaque voie de mesure correspondra à un calibre, qui sera indiqué dans ce nom, ou bien pour les interfaces ayant plusieurs voies, spécialisées chacune dans un type de mesure (Orphy-GTS, qui a des calibres différents selon les connecteurs, ou bien Pierron SMF10, qui a des entrées spécialisées pour le pH ou le magnétisme...), ce nom indiquera ces spécialités.

Un deuxième avantage, plus universel, est que ce nom permettra au programme appelant de savoir quelles sont les voies réellement appelables. Toutes les voies ayant un nom (non nul) seront appelables, et les voies qui n'existent pas réellement auront un nom de longueur nulle.

Le plus simple est de faire commencer le nom de la fonction qui renvoie le nom de la voie par la lettre N, comme "Nom". Le format de ces nom sera le type "chaîne à zéro terminal" ou "Asciiz", déclaré dans le langage Pascal comme Pchar.
 

function stdea(n:integer) : integer ;stdcall;export;
nième entrée analogique (résultat directement renvoyé par le convertisseur analogique-numérique)

function stdnea(n:integer):pchar ;stdcall;export;
nom de la nième entrée analogique

function stdead(n:integer):double ;stdcall;export;
nième entrée analogique (résultat converti en unité SI, le plus souvent en Volts)

function stdnead(n:integer):pchar ;stdcall;export;
nom de la nième entrée analogique renvoyant le résultat sous forme de "double"

function stdsa(n:integer;valeur:integer):integer;stdcall;export;
envoi de valeur au convertisseur numérique analogique sur la nième sortie analogique ; si tout s'est bien passé, elle renvoie valeur.

function stdnsa(n:integer):pchar;stdcall;export;
nom de la nième sortie analogique fixant directement la valeur du CNA.

function stdsad(n:integer; valeur:double):double;stdcall;export;
Elle permet la fixation de la nième sortie analogique à valeur. Pour la plupart des interface, la valeur sera en volts, mais on peut imaginer des systèmes plus complexes, où une sortie puisse commander une température, une vitesse de rotation, une intensité lumineuse, ou d'autres grandeurs pouvant varier.

function stdnsad(n:integer):pchar;stdcall;export;
C'est le nom de la  fonction précédente

function stdeb(n:integer):integer ;stdcall;export;
nième entrée binaire (ou entrée logique). Le résultat "vrai" correspondra à 1, et le résultat "faux" correspondra à zéro.

function stdneb(n:integer):pchar;stdcall;export;
C'est le nom de la nième entrée binaire

function stdsb(n:integer;valeur:integer):integer;stdcall;export;
fixation de la nième sortie binaire à "vrai" si valeur vaut 1, et à "faux" si valeur vaut zéro ; si tout s'est bien passé, elle renvoie valeur

function stdnsb(n:integer):pchar;stdcall;export;
nom de la nième sortie binaire.

function stdtitre : pchar;stdcall;export;
renvoie le titre de la DLL, que l'on pourra utiliser dans des boites de dialogue.

function stddetail : pchar ;stdcall;export;
renvoie le nom détaillé de la DLL, avec par exemple le nom de l'auteur, la date de révision, etc.

Fonctions permettant d'utiliser plusieurs logiciels d'application simultanément, avec la même interface et la même DLL

Ces fonctions de base sont déjà définies depuis plusieurs années. Je me suis aperçu au fil du temps que d'autres fonctions étaient utiles, en particulier pour Mesugraf pour Windows, qui commande les sorties logiques et analogiques, et qui doit donc mémoriser leur état dans la DLL elle-même, de façon à ce qu'une même DLL puisse être appelée par plusieurs logiciels différents.

J'ai donc introduit les fonctions suivantes, qui commencent par R,
comme "réponse" :

function stdrsa(n:integer):integer;stdcall;export;
renvoie l'état de la nième sortie analogique

function stdrsad(n:integer):double;stdcall;export;
renvoie l'état de la nième sortie analogique, convertie
en volts ou autre unité appropriée

function stdrsb(n:integer):integer;stdcall;export;
renvoie l'état de la nième sortie binaire, 0 pour hors-tension, 1 pour sous-tension.
 
 

Fonction permettant d'ouvrir une fenêtre de réglage

function stdcalibration : integer ;stdcall;export;
cette fonction provoque l'ouverture d'une boite de dialogue qui permet d'afficher et de faire les réglages. Bien sûr, le résultat est que cette DLL est plus grosse que si elle ne contenait pas de boite
de dialogue. A titre d'exemple, une DLL simple fait environ 30 ko, alors qu'une DLL avec une boite de dialogue fait 250 ko.
Par exemple pour Mesugraf pour Windows, il a été fait une DLL pour ADES et une sonde à oxygène. Pour que la valeur renvoyée soit effectivement une concentration en oxygène, il faut calibrer cette sonde, en indiquant les valeurs correspondant au zéro en oxygène, et à la teneur atmosphérique en oxygène. Cette fenêtre de calibration s'obtient par l'appel à la fonction «calibration».
 

Fonctions permettant d'utiliser des logiciels plus variés

Les fonctions précédentes ont été définies pour faire de la programmation avec Delphi, aussi bien pour la programmation des DLL que pour la programmation des logiciels d'application. Elles sont suffisantes pour ce but.
Malheureusement, tous les logiciels (tous les langages de programmation) n'acceptent pas d'utiliser ces DLL telles quelles.

Utilisation avec les tableurs Excel, QuattroPro et Lotus
Les tableurs sont des logiciels spécialisés dans la représentation graphique et les calculs sur des séries de données. Il est tentant de faire arriver directement les mesures dans les cases des tableurs.
Avec Windows 3.1, c'était réalisable moyennant quelques aménagements.
 

Vers 1992, Excel 5 pouvait faire les mesures en utilisant la fonction «fonction.appelante». Tout se passe bien tant qu'on n'utilise que les fonctions entières, mais pour les fonctions devant renvoyer une valeur réelle (de type «double»), les fonctions ne conviennent pas. Il fallait à Excel 5 des fonctions qui renvoient un «pointeur de double».

type pdouble = ^double;

function PEAD(n:integer):pdouble ;
pointeur sur la valeur renvoyée par la nième entrée analogique.

function PSAD(n:integer; valeur:pdouble):pdouble
Pointeur ayant comme paramètre un pointeur sur la valeur à fixer.

Est-ce encore possible avec les versions récentes de Excel ?

Toujours vers 1992, QuattroPro pour Windows 5 pouvait faire des mesures, à condition de mettre un fonction particulière dans la DLL... La version 7 de QuattroPro indique que ce logiciel peut lire des DLL, mais je n'ai pas réussi à le faire.
Lotus 123-97 et le langage LotusScript devraient aussi pouvoir lire des DLL, mais là encore, les explications ne permettent pas de le faire effectivement...
 

fonctions de type "Pascal"

Initialement, j'avais développé mes bibliothèques dynamiques avec le langage Pascal (TurboPascal, Delphi...), qui employait par défaut la convention d'appel "pascal". Les fonctions développées portent le même nom que les fonctions stdea, stdead, etc, sauf qu'elles ne commencent pas par std : il s'agit donc des fonctions ea, ead, etc.
Je pense qu'elles sont supprimables, si on convient d'utiliser systématiquement la convention stdcall.

Utilisation avec la suite bureautique Star Office 5.2

Le langage StarBasic permet d'appeler les DLL de façon relativement simple, mais semble exiger des DLL un peu particulières :
- Il n'accepte pas les paramètres entiers : il faut lui passer des paramètres de type «double», y compris pour indiquer les numéros de voie...
Il faut donc mettre dans la DLL des fonctions supplémentaires ayant des paramètres de type «double» ; on choisira de leur donner le même nom que les fonctions normales, mais avec le suffixe «double» :
function eadouble(x:double):double;
function neadouble(x:double):pchar;
function sadouble(x:double;xval:double):double;
function nsadouble(x:double):pchar;
function rsadouble(x:double):double;
function ebdouble(x:double):double;
function nebdouble(x:double):pchar;
function sbdouble(n:double;etat:double):double;
function nsbdouble(n:double):pchar;
function rsbdouble(n:double):double;
 

Autres langages de programmation, autres problèmes

Il n'est pas possible de tester tous les langages. Le langage Borland C++Builder accepte aussi d'utiliser les DLL réalisées en Delphi, mais...
- il veut que la déclaration de chaque fonction ayant des paramètres soit  avec l'option stdcall ; malheureusement, ces fonctions déclarées avec l'option stdcall sont illisibles par les logiciels programmés en Delphi lorsqu'on ne les a pas déclarées en stdcall, puisque Delphi suppose par défaut des fonctions déclarées avec la convention "pascal"...

Visual Basic aussi semble exiger la déclaration des fonctions avec l'option stdcall, ainsi que MSWLogo.