mardi 22 mai 2012

Services Web et Supervision Industrielle


Les services web sont un des moyens d’interfaçage entre systèmes informatiques. Ils servent à connaître la météo du lendemain, la valeur des actions en bourse ou d’un voyage en TGV…bref, tout un panel de services disponible publiquement ou non.
Mais dans le domaine de la supervision industrielle et du MES, les services web peuvent servir de middleware entre les ERP et la supervision.

Depuis un certain temps, nous avons réfléchi à l’intégration des services web dans Ignition™ mais nous avons buté sur 3 problèmes :

  1. Il existe plusieurs standards de services web. Trop.
  2. Le format des données est très variable et parfois complexe avec des imbrications de structures
  3. Les réponses peuvent comporter un nombre variable de données à chaque requête

Du point de vue Ignition™, comment traiter ces données complexes en quantité variable et les rendre aussi simple à utiliser et compatibles avec les SQLTags®, les SQLtag® History ou toute autre base de données ? Si vous y réfléchissez, vous verrez que le problème peut rapidement vous donner des cheveux blancs.

Nous avons récemment (Ignition™ version 7.4.2) trouvé une solution simple en intégrant la librairie

Python pour les web services : SUDS

En deux lignes de code Python, vous pouvez interagir avec tout service web reposant sur SOAP et qui fournit des fichiers WSDL. Mais en pratique, qu’est-ce que cela veut dire ?

Les services web démystifiés

Les services web ne sont rien d’autre que des pages web pour les machines. Imaginez un serveur web (comme celui qui héberge ce site), un client web (votre navigateur) et à votre place (vous qui contrôlez le navigateur web et interprétez le contenu), il y a un programme qui fait ce travail.

Le contenu d’une page web est décrit avec du code HTML (du texte), dans un service web il s’agit de XML (eXtensible Markup Language) qui est aussi du texte. HTML permet de décrire comment un contenu doit être affiché dans un navigateur (on parle de rendu), XML permet lui de décrire de manière structurée des données à échanger.

SOAP (Simple Object Access Protocol) est le protocole d’échange entre le serveur web et un client, le contrat entre le serveur et le client qui repose sur XML.

WSDL (Web Services Description Language) est la page web d’accueil (XML) que le serveur envoie en guise de réponse au client à la question « Comment puis-je te parler ? » et « qu’elles peuvent être tes réponses ? »

La libraire Python SUDS

La libraire Python SUDS peut interroger un serveur et analyser le fichier WSDL et afficher en clair comment poser les questions pour invoquer les méthodes. Par exemple, on pourra utiliser un service web pour retrouver un ordre de fabrication, renseigner l’OF avec l’état actuel de la production et le renvoyer à l’ERP.

Ce qui est incroyable avec la librairie SUDS, c’est que cela fonctionne ! Les autres librairies que nous avons essayées n’ont jamais été aussi simples et performantes.

Ce qu’il faut savoir, c’est que le format XML peut être structuré de manière arbitraire. Il existe donc plusieurs formats, chacun essayant de régner en maître, par exemple WSI-BP (Web Services Interoperability – Basic Profile). C’est probablement l’une des raisons des échecs de la plupart des librairies que nous avons testées. Excepté SUDS.


Si on regarde l’exemple ci-dessus, on voit SUDS en action dans le « script playground » d’Ignition™ :

  1. On importe d’abord la librairie
  2. On créer une instance cliente sur un serveur et on demande le contrat « calculator »
  3. On affiche la « traduction » de SUDS qui indique qu’il y a 4 méthodes (add, divide, multiply, subtract) qui chacune prennent 2 arguments de type float
  4. On utilise ces informations pour effectuer notre calcul à l’aide de l’instruction print client.service.divide(33.33, 11.11)
Le code (nécessite Ignition™ 7.4.2 minimum) :
from suds.client import Client
client = Client("http://soaptest.parasoft.com/calculator.wsdl")
print client
print client.service.divide(33.33,11.11)

4 lignes. C’est toute la beauté de SUDS.

Avec les fonctions de script Python d’Ignition™ - et si besoin l’appel de classes Java ;) - on peut utiliser très simplement les services web quel que soit le format des données.

SUDS est une librairie très riche, mais vous n’avez pas besoin de  beaucoup plus que ce que vous avez ici pour faire des choses magiques. Au cas où, la documentation SUDS ici et les PyDocs ici.

SUDS et Ignition™ en action

Mieux qu'un long discours, regardez l'exemple en images animées.

Vous voulez essayer, téléchargez Ignition™, installez-le en 2 minutes et voilà !