La méthode MATLAB

La méthode MATLAB ouvre un lien DDE avec le programme Matlab au temps initial et permet d’exécuter un script Matlab (d’extension .m) à chaque pas de temps de régulation DTU pour ce module (qui peut être un multiple du pas de temps de calcul numérique DT).

Le fichier Matlab .m choisi sera utilisé de la manière décrite ci-après. Le nom de ce fichier peut être indiqué dans les paramètres spécifiques de la méthode MATLAB (pidsic.m dans l’exemple fourni sous dat/exemple/matlab). On peut indiquer ce nom soit avec l’extension .m (ex. : pidsic.m), soit sans cette extension (ex. : pidsic). Dans le cas où cette extension n’est pas présente elle sera ajoutée automatiquement. Si ce fichier est trouvé dans le sous-répertoire courant où se trouve le fichier xml du projet en cours, alors il sera celui utilisé, sans proposer à l’utilisateur d’en choisir un autre, ce qui facilite la tâche de l’utilisateur. Mais si ce fichier n’existe pas dans ce sous-répertoire courant, alors un fichier pourra être sélectionné parmi les fichiers .m existants dans le sous répertoire des données. Si aucun nom n’est indiqué, alors un nom par défaut est généré et recherché : module2.m, module3.m, etc, ou de manière générique module"n".m, où "n" est le numéro du régulateur, débutant en général à 2 (car l’indice 1 est utilisé pour les lois fonction du temps, qui sont gérées en interne également comme un régulateur le cas échéant).

Dans les anciennes versions de Matlab, le nom de ce fichier .m ne devait pas être un nom réservé ou une fonction intrinsèque de Matlab (pi.m, bode.m n’étaient par exemple pas autorisés, car dans ce cas Matlab était perturbé et ne lançait pas le fichier .m). Dans les versions plus récentes de Matlab cela ne pose plus de problème. Mais en cas de problème de non exécution de votre script vous pouvez penser à cette précaution. De manière générale nous conseillons de veillez à ne pas utiliser un nom déjà utilisé par une fonction Matlab intrinsèque pour ce fichier. m (par exemple pid.m). Avec certaines versions de Matlab cela ne pose pas de problème (ex 7.1), mais avec d’autres versions cela va générer une erreur (ex Matlab 2010b), et le script .m ne sera pas exécuté (sans donner de message d’erreur, ce qui peut rendre le débuggage difficile).

Dans l’interface du calcul en régime permanent (Programme FLUVIA) ou transitoire (Programme SIRENE), les noms de ces fichiers .m provenant du projet (fichier xml), générés automatiquement ou sélectionnés par l’utilisateur, sont indiqués.

Au temps initial (t = dt) le programme de calcul en régime transitoire (programme SIRENE de SIC) envoie dans l’environnement Matlab (espace de travail) le pas de temps de calcul dt, le pas de temps de régulation dtu, le temps final tfin et un indice "interf" indiquant si l’on est en mode avec interface ou sans interface (Cf. menu option). Cet indice peut éventuellement être utilisé pour autoriser ou non des affichages à l’écran programmés dans le fichier .m. Il est également possible de faire la même chose avec une série de simulations en régime permanent (programme FLUVIA de SIC).

Puis, à ce pas de temps initial et à chaque pas de temps ultérieur t ≥ dt, multiple de dtu (cf. discussion sur DTU et DT), le programme SIRENE (ou FLUVIA) envoie dans l’environnement Matlab (workspace) les variables contrôlées y, les consignes correspondantes yt, les variables mesurées z, les anciennes commandes u et le temps courant t. Ces variables (ie leurs noms utilisés dans le script Matlab) sont celles décrites dans les paramètres du module de régulation, et on peut éventuellement changer ces noms. Les vecteurs sont gérés dans Matlab comme des vecteurs ligne (size(u) = [1 nu]), contrairement à Scilab où ils sont gérés comme des vecteurs colonne (size(u) = [nu 1]), puisque c’est l’option choisie par défaut dans ces différents environnements. Ces vecteurs y, yt et z sont ceux de l’instant courant t. Le vecteur u est celui calculé à l’instant courant t et qui sera donc appliqué et effectif dès l’instant de calcul suivant t+dt. Si vous voulez avoir l’historique de ces vecteurs c’est à vous de les stocker dans des variables dans l’espace mémoire de Matlab (les variables sont conservées entre 2 appels), ou éventuellement sur un fichier.

Le programme SIRENE (ou FLUVIA) exécute ensuite le fichier Matlab .m (ex. : pidsic.m) sélectionné comme indiqué ci-dessus (et ce à chaque pas de temps t=n.dtu, n=1 à nmax tel que t=nmax.dtu=tfin).

Enfin, le programme SIRENE (ou FLUVIA) récupère les variables de contrôle u dans l’espace de travail et les applique dans SIRENE (ou FLUVIA) aux ouvrages correspondants (définition classique des u dans l’interface Edisic pour le module de régulation correspondant, avec aussi les y, yt et z).

Cette méthode MATLAB permet d’écrire et de tester rapidement une méthode de régulation en profitant de tout l’environnement de développement de Matlab. Elle ne nécessite en outre aucune compilation ni édition de lien du programme SIRENE (ou FLUVIA). Par contre, l’exécution du module de régulation est plus lente (que pour un module de régulation interne (ex. : PID) ou écrit en Fortran via les modules USER1 à USER9) du fait des échanges de données entre SIRENE (ou FLUVIA) et Matlab et du fait qu’un fichier .m est interprété par Matlab et non pas compilé en code directement exécutable. Vous pouvez comparer ces temps d’exécution, et nous fournissons le même exemple avec le PID interne, le lien DDE Matlab, le lien DDE Scilab et le module wdlang.

Exemple de fichier .M (voir l’exemple fourni sous dat/ex4_matlab) :

  1. % fichier PIDSIC.M correspondant à un contrôleur PID
  2. % initialisation
  3. % Matlab et Scilab gèrent les vecteurs différemment
  4. % Dans Matlab, par défaut un vecteur est une ligne (size(u)=1 nu)
  5. % Dans Scilab, par défaut un vecteur est une colonne (size(u)=nu 1)
  6. % Pour éviter la double indexation inutile, on s'adapte à cette convention
  7. % Les scripts sous Matlab et sous Scilab sont donc légèrement différents
  8.  
  9. if t == dt
  10. eold=0;
  11. se=0;
  12. de=0;
  13. [n1 nu]=size(u);
  14. vu=zeros(n1,nu)+1;
  15. [n1 ny]=size(y);
  16. vy=zeros(n1,ny)+1;
  17. end;
  18.  
  19. % calcul des coefficients utiles
  20. ------
  21. Kp=zeros(n1,nu)+0.5;
  22. Ti=zeros(n1,nu)+5*dt;
  23. Td=zeros(n1,nu);
  24. N =zeros(n1,nu);
  25. %Kp=[16.2 1.69 0.59 1 1.7 1.06 1.38 0.76];
  26. %Ti=[10084 4482 16807 5976 5602 5005 4482 4482];
  27. for i=1:nu,
  28. if Ti(i)==0;
  29. Ki(i)=0;
  30. else
  31. Ki(i)=Kp(i)/Ti(i)*dt/2;
  32. end
  33. if Td(i)==0;
  34. Kd1(i)=0;
  35. Kd2(i)=0;
  36. else
  37. if N==0
  38. Kd1(i)=0;
  39. Kd2(i)=Kp(i)*Td(i)/dt;
  40. else
  41. Kd1(i)=1/(1+N(i)/Td(i)*dt);
  42. Kd2(i)=Kp(i)*N(i)*Kd1(i);
  43. end;
  44. end;
  45. end;
  46.  
  47. % calcul du pid vectoriel
  48. ------
  49. e=yt-y;
  50. se=se+Ki.*(eold+e);
  51. de=Kd1.*de+Kd2.*(e-eold);
  52. u=Kp.*e+se+de;
  53.  
  54. % sauvegarde ancien ecart
  55. ------
  56. eold=e;
  57.  
  58. if interf == 1
  59. % dessin de y et u
  60. ------
  61. if t == dt
  62. subplot(211),xlabel('temps (h)'),ylabel('y, yt')
  63. ,axis([0 25 -.5 .5]),title('Sorties, Consignes');
  64. subplot(212),xlabel('temps (h)'),ylabel('u')
  65. ,axis([0 25 -1.5 1.5]),title('Commandes');
  66. end;
  67. subplot(211),plot(t*vy/3600,y,'g+',t*vy/3600,yt,'b+');
  68. subplot(212),plot(t*vu/3600,u,'r+');
  69. end

Télécharger

Les paramètres pour la méthode MATLAB sont le nom du fichier .m par défaut et le nom des variables dans l’espace de travail Matlab. Ces indications sont facultatives car des noms par défauts sont proposés.

En mode débug = 0 aucune vérification de syntaxe du fichier .m n’est effectuée, en mode débug = 1 des vérifications sont effectuées et les messages éventuels sont écrits sur un fichier matlab.dbg (attention à l’effacer en fin de simulation car il est ouvert en mode "append" et les messages sont concaténés en fin de fichier s’il existe déjà, il peut donc devenir très gros), en mode débug = 2 les messages sont, en outre, affichés à l’écran. On conseille d’utiliser le mode 2 au cours de la mise au point du fichier .m, puis de basculer en mode 0 pour faire les simulations de routine (gain en temps).

On peut indiquer l’emplacement du programme matlab.exe, ce qui est utile si différentes versions de Matlab sont installées sur l’ordinateur. Mais la version de Matlab désirée doit aussi et surtout être définie dans l’option correspondante du menu "Options/Options" qui gère les exe de SIRENE et FLUVIA avec la bonne version de Matlab. Il faut aussi que le PATH système contienne bien la référence au sous répertoire de Matlab (de la bonne version qu’on souhaite utiliser), et qu’il n’y ait pas de référence avant à un autre sous-répertoire contenant également des librairies comme lapack.dll. Sinon il y aura un conflit (par exemple avec une autre version de MatLab, ou une version de Scilab, voir ci-dessous). Dans ce cas on peut avoir un message d’erreur disant que Fluvia ou Sirene ne trouve pas la librairie libmx.dll ("The program can’t start because libmx.dll is missing from your computer. Try reinstalling the program to fix this problem"). Les solutions peuvent alors être soit de modifier ce path, soit de renommer temporairement les sous-répertoires d’installation de ces autres programmes (il faut en général avoir les droits administrateur pour faire cela).

On peut aussi indiquer si l’on veut fermer Matlab en fin de simulation (Case cochée pour fermer Matlab ).

Le lien DDE Matlab a été compilé avec la version 6.5 (release 13) de Matlab pour les versions 4.07 à 4.21, avec la version 7.1 (release 14) pour la version 4.22, puis également avec les versions 7.4 (Release 2007a), 7.5 (Release 2007b), 2008 et 2009. Si vous avez une autre version, veuillez nous contacter. Avec les librairies de votre version nous pouvons normalement compiler une version spécifique adaptée à votre version de Matlab (pour l’instant uniquement en 32 bits). Certaines versions de Matlab assurent une compatibilité ascendante avec des versions antérieures du lien DDE Matlab, mais la politique de Matlab sur ce point n’est pas claire. Des versions récentes comme la version 2010b de Matlab (Release 7.11.0.584 pour être précis) est par exemple compatible avec nos versions de Fluvia et Sirene avec le lien DDE MatLab 7.1. Donc, même si votre version de Matlab n’est pas proposée explicitement dans notre liste, nous vous conseillons de tester les différentes versions que nous proposons avec votre version de Matlab, avant de conclure que cela n’est pas disponible.

En cas de problème au lancement du lien DDE (problème pour lancer Matlab, message indiquant que des dll ne sont pas trouvées, ou que des points d’entrée de procédure ne sont pas trouvés dans des dll, ou fonction non trouvée) c’est que vous avez probablement un conflit entre diverses dll liées à MatLab et à Scilab installées sur votre ordinateur. Le problème c’est que ces programmes utilisent un certain nombre de dll dont certaines ont le même nom, comme lapack.dll en particulier. Si vous choisissez l’option "Aucun lien DDE" (en mode "Hydraulique" aller dans le menu Options / Options, Bouton "Choisir" de la rubrique "Version du lien DDE Matlab ou Scilab"), alors les programmes FLUVIA et SIRENE actifs sont ceux ne comportant pas les liens DDE avec MatLab ni Scilab. Il n’y aura donc plus de conflit mais vous ne pourrez pas utiliser ce lien DDE. Vous aurez un message dans la fenêtre d’affichage lors du calcul. Il faudra donc choisir la version de FLUVIA et SIRENE qui correspond à la version de MatLab ou Scilab que vous utilisez (installée sur votre ordinateur) en choisissant l’option "MatLab 6", "MatLab 7.1", "MatLab 7.4", "MatLab 7.5", "MatLab 2008", "MatLab 2009", "Scilab 4" ou "Scilab 5". Dans ce cas, les exe correspondants de FLUVIA et de SIRENE, ainsi que les dlluser*.dll sont copiées dans le sous-répertoire SIC/EXE et deviennent les versions actives.

Si vous avez plusieurs versions de Matlab installées sur votre ordinateur, il faudra définir celle que vous voulez utiliser. Pour cela suivre les instructions indiquées sur le forum Matlab (Register MATLAB as Automation Server) :

https://fr.mathworks.com/help/matlab/matlab_external/register-matlab-as-automation-server.html?requestedDomain=nl.mathworks.com

Sinon vous risquez d’avoir un problème à l’exécution de Fluvia ou Sirene lors de leur tentative d’ouverture de Matlab avec le message "MATLAB ne peut être lancé".