MASTER ASE SMaRT LIAISON DDE Pierre BONNET 2011-2012 1
PRINCIPE DE LA LIAISON DDE ENTRE TACHES Processus d échange natif sous Windows - existe depuis les premières versions de Windows - en concurrence avec d'autres technologies comme les named pipes, mailslots, NetBIOS, Windows Sockets, Remote Procedure, Calls RPC. intégré à de nombreux logiciels usuels (Word, Excel, Matlab, OpenOffice...) mode d'échange parmi les plus utilisés dans le monde industriel. évolutions FastDDE, AdvanceDDE... Les fonctions DDE ne plus supportées par Microsoft, en particulier dans VB.. Des bibliothèques libres sont disponibles sur le Web exemple : http://files.codes-sources.com ou http://ndde.codeplex.com/ 2
PRINCIPE DE LA LIAISON DDE ENTRE TACHES Chaque application possède une interface de gestion de la liaison DDE Un lien DDE ne peut être lancé sur une application serveur que si cette dernière a été conçue pour répondre à ce type d'événement (interface serveur). Pour faciliter l écriture des interfaces, Microsoft propose la bibliothèque C de développement Dynamic Data Exchange Management Library (DDEML). Le langage Delphi offre par exemple une très grande facilité pour créer l interface d une application serveur. 3
FONCTIONNEMENT DE LA LIAISON DDE ENTRE TACHES Fonctionnement général du service: Demande d'ouverture du canal de communication faite par le client. DDEInitiate - Le client reçoit un «handle» identifiant sa connexion au serveur. - Si l'application serveur n'est pas lancée, le système peut la lancer automatiquement (option). - En cas d'échec d'accès à l'application serveur, le client est informé. - Le serveur peut rejeter la demande de connexion Fermeture du canal en fin d échange DDETerminate 4
FONCTIONNEMENT DE LA LIAISON DDE ENTRE TACHES Fonctionnement général du service: Echange de données à la demande du client demande de lecture d une donnée sur le serveur: DDERequest demande d écriture d une donnée sur le serveur: DDEPoke demande d'éxécution d'un script (chaîne) sur le serveur: DDEExecute Type de données échangées: toute donnée en format «clipboard» (presse-papier) en ASCII TEXT DDE FORMAT en BINARY TABLE DDE FORMAT("Fast-Table") 5
FONCTIONNEMENT DE LA LIAISON DDE ENTRE TACHES Eléments de définition du lien Un lien vers une application serveur est défini par 3 champs: le champ Application désigne le nom DDE de l'application serveur. [Le nom du service DDE peut être différent du nom du programme] le champ Topic interprété par le serveur. ce champ désigne généralement une fonctionnalité de base du serveur, comme par exemple le fichier sur lequel le serveur doit travailler. le champ Item interprété par le serveur désigne généralement le nom de la variable à échanger. Ce champ est optionnel; certaines applications "serveur" n'y font pas référence 6
FONCTIONNEMENT DE LA LIAISON DDE ENTRE TACHES Structure de données d un serveur multi-applications Certains serveurs peuvent présenter plusieurs services DDE (le superviseur Panorama en est un exemple; chaque service est spécifié par un nom d'application différent (ou un nom de topic différent selon la conception du serveur). 7
FONCTIONNEMENT DE LA LIAISON DDE ENTRE TACHES Exemple de lien DDE sur Tableur Excel (formule) Excel est à la fois serveur et client DDE L'écriture d'une liaison DDE est directe dans le sens Serveur -->Excel (client) le lien DDERequest fait partie du vocabulaire des formules de calcul Excel (champ calculé) la syntaxe de la formule Excel est : = Application Topic! Item L'affectation d'une valeur à une cellule par un lien DDE est équivalent à un DDERequest automatique sous OpenOffice, la formule est : = DDE(Application ; Topic ; Item) 8
FONCTIONNEMENT DE LA LIAISON DDE ENTRE TACHES Exemple: Lien DDE sur tableur Excel (formule) Exemple: échange entre deux applications Excel ouvertes simultanément serveur «Compta.xls» client «Recap.xls» lecture de la cellule A1 du classeur «Compta» par l application «Recap» ; la valeur sera affichée dans la cellule B1 du classeur "Recap» formule de B1 : = Excel Compta.xls! L1C1 Remarques: la syntaxe de désignation des cellules du type Ligne/Colonne (vocabulaire transposé en Row/Column en anglais mais refusé sur un Excel français!). le lien DDE écrit sous forme de fonction dans une cellule est exécuté automatiquement lors de la réécriture de la valeur source sur le serveur. La suppression du recalcul automatique côté client entraîne l'arrêt de l'échange DDE. 9
PROGRAMMATION VBA DE LA LIAISON DDE Activation de la liaison DDE sous programmation VBA Les commandes de base d'échange DDE sous VBA sont: NumLien = DDEInitiate(DdeApplName, TopicName) DDEPoke NumLien, ItemName, Valeur Valeur = DdeRequest(NumLien, ItemName) DDETerminate(NumLien) Les paramètres DDEApplName, TopicName et ItemName sont de type chaîne de caractères. Les commandes sont "bloquantes" pour l'application cliente en cas de lenteur ou de non réponse du serveur. La liaison est dite synchrone : le client attend la réponse du serveur Un mécanisme de TimeOut existe pour sortir de ces fonctions en cas de blocage prolongé 10
PROGRAMMATION DE LA LIAISON DDE Il est possible de demander au serveur d'avertir le client de tout changement dans la donnée demandée (liaison asynchrone). DDEAdvise DDEUnadvise Le client est prévenu par un évènement - il reçoit automatiquement la donnée («hot link») - il demande la donnée («warm link») sur réception de l'évènement Fonctions non-implantées en VBA Existent dans de nombreux autres langages plus d'information sur les aspects synchrone/asynchrone : http://www.angelfire.com/biz/rhaminisys/ddeinfo.html 11
PROGRAMMATION DE LA LIAISON DDE Exemple de liaison asynchrone Matlab<-->Excel (DDEAdvise) % Initialize conversation with Excel. chan = ddeinit('excel', 'Classeur1'); % Set range of cells in Excel for poking. range = 'l1c1:l20c20'; % Create a surface of peaks plot. h = surf(peaks(20)); % Get the z data of the surface. z = get(h, 'zdata'); % Poke the z data to the Excel spread sheet. rc = ddepoke(chan, range, z); % Set up a hot link ADVISE loop with Excel % The callback (event) sets the zdata and cdata for the surface h to be the new data sent from Excel. rc = ddeadv(chan, range,'set(h,''zdata'',z);set(h,''cdata'',z);','z'); % Create a push button that will end the ADVISE terminate the DDE conversation, c = uicontrol('string','&close','position',[5 5 80 30],'Callback',... 'rc = ddeunadv(chan,range);ddeterm(chan);close;'); 12
PROGRAMMATION DE LA LIAISON DDE La fonction DDEExecute permet de transmettre des instructions à l application serveur (elle-même pouvant les retransmettre au périphérique éventuellement) La fonction "execute" suppose que le serveur peut interpréter des commandes sous forme de chaîne de caractère (par exemple: Matlab, Excel...) Exemples d application: - mise en service de l appareil, arrêt, programmation de l appareil - exécution d'une "macro" dans Excel DDEExecute("[RUN("MyMacro")]") 13
PROGRAMMATION DE LA LIAISON DDE Exemple de fonction DDEExecute Excel-->Matlab 'Exemple de lien DDE avec une variable Matlab du type vecteur Sub Lien_Matlab() Dim MyArray Dim MyChannel 'Demarrage Matlab Shell "C:\Matlab6\bin\win32\Matlab.exe" MyChannel = DDEInitiate("Matlab", "Engine") DDEExecute MyChannel, "h=peaks(10);colormap(pink);mesh(h);drawnow" MyArray = DDERequest(MyChannel, "h") Sheets("feuil1").Select Range("A1:J10").Value = MyArray 'Fermeture de Matlab DDEExecute MyChannel, "exit" 'Fermeture du lien DDE DDETerminate MyChannel End Sub 14
PROGRAMMATION DE LA LIAISON DDE Recherche des liens modifiés dans un classeur L'événement Worksheet_Change() ne répond pas à un changement de valeur d'un lien DDE. La méthode SetLinkOnData permet de lancer une procédure en cas d'activation d'un lien DDE ou OLE. 'Liste des liens DDE ou OLE du classeur et définition de la procédure à exécuter Sub LinkList() Dim ListeLiens As Variant ListeLiens = ActiveWorkbook.LinkSources(xlOLELinks) If Not IsEmpty(ListeLiens) Then For i = 1 To UBound(ListeLiens) ActiveWorkbook.SetLinkOnData ListeLiens(i), "LinkChange" & Mid$(Str$(i), 2, 1) 'Définit la procédure à appeler si le lien i change Next i Else MsgBox "Ce classeur ne contient pas de liaison DDE ou OLE" End If End Sub 'Procédures à exécuter sur changement de valeur DDE ou OLE Sub LinkChange1() MsgBox "Lien 1 modifié" End Sub Sub LinkChange2() MsgBox "Lien 2 modifié" End Sub 15
LIAISON DDE ENTRE DEUX TACHES RESEAU Lien NetDDE Le lien NetDDE permet d établir l échange DDE entre deux applications supportées par deux machines distantes reliées en réseau (ethernet) Le lien NetDDE est fait par le module NetDDE.exe fourni par divers constructeurs (Wonderware, Microsoft...) 16
LIAISON DDE ENTRE DEUX TACHES RESEAU Lien NetDDE Le module NetDDE est un service sous WindowsXP droits d administration réservés aux utilisateurs autorisés démarrage manuel ou automatique Le service NetDDE gère les droits d accès du client auprès du serveur sécurité des transactions Les informations d administration du lien DDE sont sauvegardées dans la base de registre (HKEY_LOCAL_MACHINE\Software\Microsoft\NetDDE\DDE Shares\ ) Le service NetDDE présente un interface de type DDE côté application pas de modification de l applicatif pour un travail en réseau 17
LIAISON DDE ENTRE DEUX TACHES RESEAU Lien NetDDE (WinXP): Propriétés 18
LIAISON DDE ENTRE DEUX TACHES RESEAU Lien NetDDE: Fonctionnement 19
LIAISON DDE Complément Lien DDE sous VB6 Il est possible de lier un contrôle VB6 (boîte Texte, curseur...) à un serveur DDE externe. Les fonctions sont différentes de la syntaxe VBA; de plus, la fonction hotlink/warm link est possible. Lecture synchrone Label1.LinkTopic = "Excel Classeur1.xls" DDE Service Name and Topic Label1.LinkItem = "Tension" DDE Item Name Label1.LinkMode = 2 0=no link 1=warm link 2=cold link Label1.LinkRequest... Label1.LinkMode = 0 Close the link Ecriture Request Data from Excel Label1.LinkTopic = "Excel Classeur1.xls" Label1.LinkItem = "Courant" DDE Item Name Label1.LinkMode = 2 Label1.Caption = "1.23" Set up data string Label1.LinkPoke... Send data Label1.LinkMode = 0 Close the link 20