Utiliser Automation depuis Scilab sur Windows

Automation (anciennement OLE Automation) permet la communication entre différents logiciels (processus) sur Windows. Cela permet par exemple de faire communiquer MATLAB avec Excel (voir Contrôle d’Excel par MATLAB via Automation).

Avec MATLAB, il suffit d’utiliser la fonction actxserver. Il n’y a pas de fonction équivalente fournie avec la version de base de Scilab. Il faut installer un module complémentaire « ole » qui se trouve sur la forge Scilab (What is the Forge ?).

Téléchargement du module « ole »

Le code source du module « ole » est disponible à cette adresse : http://forge.scilab.org/index.php/p/ole/

Les fichiers sources sont disponibles soit en format zip : ole-master.zip, soit via un dépôt Git avec la commande git clone git://git.forge.scilab.org/ole.git

Une fois le code source téléchargé, il faut maintenant le compiler.

Compilation du module « ole »

Vous devez tout d’abord vérifier qu’un compilateur Microsoft de la suite Visual Studio est installé. Ouvrez Scilab et exécutez la commande suivante :

-->compiler = findmsvccompiler()

Si aucun nom de compilateur n’est renvoyé, vous devez en installer un.
Par exemple : Microsoft Visual Studio 2012 Express

Une fois que vous avez un compilateur opérationnel, placez-vous dans le dossier où se trouvent les fichiers sources du module « ole » et exécutez la commande suivante :

-->exec builder.sce;

Scilab doit renvoyer :

Création des macros...
-- Création de [automationlib] (Macros) --
genlib : Traitement du fichier : %VARIANT_e.sci
genlib : Traitement du fichier : %VARIANT_p.sci
genlib : Traitement du fichier : %VARIANT_size.sci
genlib : Traitement du fichier : %ptr_p.sci
genlib : Traitement du fichier : ole_getOlePath.sci
genlib : Régénère les noms et les bibliothèques

Il est maintenant possible de charger le module dans Scilab :

-->exec loader.sce;
Start Automation for Scilab
    Load gateways
    Load macros

Vous pouvez maintenant utiliser la fonction ole_actxserver (comme la fonction MATLAB actxserver). Par exemple pour interfacer Scilab avec Excel :

Excel = ole_actxserver("Excel.Application")

Vous trouverez différents tests dans le fichier « examples.sce ». Tous ne fonctionneront peut être pas en fonction des éléments de Windows installés ou non sur votre machine. N’exécutez donc pas le script en entier, mais faîtes plutôt des copier/coller des blocs de code susceptibles de fonctionner.

Erreur « ‘VCExpress.exe’ n’est pas reconnu… » avec Visual Studio 2012 Express

A la compilation avec Visual Studio 2012 Express, Scilab renvoi le message suivant :

!'VCExpress.exe' n'est pas reconnu en tant que commande interne   !
!                                                                 !
!ou externe, un programme exécutable ou un fichier de commandes.  !

Depuis la version 2012, l’exécutable ne se nomme plus « VCExpress » mais « WDExpress ». Ouvrez le fichier « builder.sce » et modifiez le bloc suivant :

    compiler = findmsvccompiler();
    if strstr(compiler, "express")  "" then
        compilerbin = "VCExpress.exe ";
    else
        compilerbin = "devenv.exe ";
    end

en

    compiler = findmsvccompiler();
    if strstr(compiler, "express")  "" then
        compilerbin = "WDExpress.exe ";
    else
        compilerbin = "devenv.exe ";
    end

Exécutez à nouveau « builder.sce »

Conclusion

Voila, vous pouvez maintenant faire appel à automation depuis Scilab pour communiquer entre différents processus Windows.

Et vous ?

  • Avez-vous déjà utilisé Automation avec Scilab ?
  • Dans quel but ?
  • Avez-vous rencontré des problèmes ?

Gérez la compatibilité descendante de vos codes MATLAB

MathWorks publie deux versions de MATLAB par an avec à chaque fois son lot de nouvelles fonctions. La version R2014b est attendue prochainement.

Si vous souhaitez diffuser vos programmes à un maximum d’utilisateurs, vous devez veillez à la compatibilité descendante (ou rétrocompatibilité) de vos codes. C’est à dire que vous devez prendre en compte le fait que certains utilisateurs ont une version moins récente de MATLAB que la vôtre.

Deux questions se posent alors :

  • jusqu’à quelle version de MATLAB assurer la compatibilité ?
  • comment déterminer ce qui casse la compatibilité descendante ?

Quelle version de MATLAB ?

Vous vous en douterez, il n’y a pas de réponse précise à cette question… Nous avons ouvert plusieurs sondages sur le forum MATLAB :

Au passage, vous pouvez toujours participer au sondage de 2014 !

En voici les résultats :

Versions utilisateurs MATLAB 2013

Sondage 2013

Versions utilisateurs MATLAB 2014

Sondage 2014

Malgré le peu de votes, on peut juger que la compatibilité devrait être gérée jusqu’aux versions R2011.

Comment déterminer ce qui casse la compatibilité descendante ?

La solution la plus efficace est d’installer la version la plus ancienne de MATLAB pour laquelle vous souhaitez assurer la compatibilité sur votre machine de développement. Votre licence MATLAB vous permet d’installer les versions plus anciennes.

A l’exécution du code, en cas de problème de compatibilité, vous rencontrez surement l’erreur Undefined function or variable ‘***’. Dans ce cas, vous devrez alors écrire un code alternatif pour gérer l’absence de cette fonctionnalité. Vous pourrez alors utiliser la fonction verLessThan présentée ci-dessous.

Si vous ne pouvez pas installer une ancienne version, il faudrait alors faire la liste de tous les changements répertoriés dans les Release Note des versions de MATLAB (voir la FAQ Où trouver la documentation des différentes versions de MATLAB en ligne ?). Tout ça risque d’être assez laborieux. Vous pouvez consulter une liste partielle de ces changements sur ce site : MatlabVersionsCompatibility.

La fonction verLessThan

La fonction verLessThan permet de tester si la version de MATLAB en cours d’utilisation est antérieure à une version donnée. Pour les numéros de version, voir la deuxième colonne du tableau donné dans la FAQ : Quelles sont les différentes versions de MATLAB ?

Prenons le cas de la fonction strjoin ajoutée avec la version R2013a (8.1) de MATLAB. Une version antérieure de MATLAB ne pourra pas l’exécuter. Vous devrez donc pas exemple écrire votre propre fonction mystrjoin et faire le teste suivant dans le code :

if verLessThan('matlab', '8.1')
    B = mystrjoin(A, ',');
else
    B = strjoin(A, ',');
end

Conclusion

Comme vous l’aurez compris, il est difficile d’assurer une compatibilité parfaite d’un code MATLAB récent avec des versions plus anciennes. J’espère au moins vous avoir sensibilisé à ce problème.

Deux conseils pour finir :

  • spécifiez la version de MATLAB que vous avez utilisée dans l’entête de votre code
  • laissez également un email pour permettre aux utilisateurs de vous contacter

Toujours pas de certification MATLAB dans les pays francophones

MathWorks propose depuis 2 ans maintenant deux certifications : Associate et Professionnal.

Aurélien avait écrit un billet à ce sujet sur son blog : MathWorks Certification Program.

Par curiosité, je viens de consulter le calendrier des futures sessions de certification et… toujours pas de session en France. Pour l’Europe, c’est soit Cambridge en Angleterre, soit Munich en Allemagne. Aucune date en Afrique, ni au Moyen-Orient.

Les utilisateurs des pays francophones devront donc encore patienter, ou alors ajouter le prix du voyage au prix de la certification. :shock:

Pour ma part, j’hésite encore entre Natick et Sydney :mrgreen: