Archives par mot-clé : Modbus

A4A : Ada for Automation hébergé chez Gitorious

Bonjour,

Je me suis finalement décidé pour l’hébergement de « Ada for Automation », ce sera :
https://gitorious.org/ada-for-automation

Vous pouvez donc désormais vous procurer « Ada for Automation » avec les outils git usuels ou télécharger une archive :
https://gitorious.org/ada-for-automation/ada-for-automation/archive-tarball/master

Ne vous risquez pas à piloter une centrale atomique avec, c’est pour l’instant éminemment instable… 😉

Que cela ne vous empêche pas d’expérimenter, cela me ferait même plaisir de le savoir !

Cordialement,
Stéphane

A4A : Lâché dans la nature, malingre

Bonjour,

Voici la première version de mon projet Ada for Automation présenté ici :
http://slo-ist.fr/ada4autom

Soyez indulgent, je balbutie en Ada et c’est le résultat de mes balbutiements que j’expose à votre sagacité.

Côté code, j’étudierai vos remarques avec attention et tâcherai de me conformer de mon mieux aux règles que j’ai trouvées ici :
http://en.wikibooks.org/wiki/Ada_Style_Guide

Ce wikibook m’est d’une grande aide aussi :
http://en.wikibooks.org/wiki/Ada_Programming

Ce n’est certes pas aussi fouillé que le Barnes, le Burns and Wellings ou le Mc Cormick qui trônent sur mon bureau mais c’est quelque fois plus rapide d’y trouver un exemple et les explications qui vont avec, avec le copier-coller en plus…

Je bute sur le binding de :
http://libmodbus.org/

Cela fonctionne en Client et en Serveur, voyez dans le dossier « test » mais je ne suis pas satisfait de ma solution pour la fonction :
http://libmodbus.org/site_media/html/modbus_mapping_new.html

Quant au reste, c’est exploratoire… Ada, c’est trop fort ! 😉

Je n’ai pas trop d’avis sur la « forge » susceptible d’accueillir ce projet, aussi en voilà une archive :
http://slo-ist.fr/Download/A4A/A4A_V06_20130124.7z

Je suis preneur de vos avis sur la question de la « forge » comme sur cette production en général et je vous en remercie d’avance.

Normalement ça doit compiler sans problème. Après tout, c’est du Ada.

Si c’est compilé avec succès, on trouve dans le dossier « exe » l’ensemble des binaires.

Les plus « drôles » sont :

  • « test_libmodbus_server_many » qui implémente un serveur Modbus TCP répondant à de multiples clients, il est dérivé de celui que l’on trouve dans les sources de libmodbus, « bandwidth-server-many-up.c »,
  • et « test_libmodbus_client2 « , inspiré de « unit-test-client.c », que vous pouvez exécuter en plusieurs instances, et qui discutera volontiers avec le précédent.

Comme la documentation est encore dans ma tête, voici quelques informations sur Ada for Automation :

  • c’est un framework, c’est à dire du code pour vous permettre d’écrire vos propres applications. Il est nécessaire d’y ajouter le code de votre application pour qu’il en sorte quelque chose d’utile.
  • il vous faudra apprendre Ada, doucement mais sûrement, pour l’utiliser. Cependant la disponibilité du code source vous y aidera et si vous connaissez le langage ST pour « Structured Text » vous serez surpris par une certaine familiarité.
  • c’est un langage compilé et il faudra apprendre à utiliser les outils et les techniques de debug.
  • en principe, votre code devrait se trouver dans le paquetage « A4A.Application ». Mais vous pouvez faire ce que vous voulez du moment que vous respectez la licence.
  • le framework organise les tâches comme celles que l’on trouve dans un automate, cycliques, périodiques ou événementielles, dans le paquetage « A4A.Kernel », et les tâches appellent les fonctions que vous définissez dans le paquetage « A4A.Application ». Dans ce paquetage, on trouve également les données et les objets de votre application.
  • le paquetage « A4A.Library » fournit une librairie de fonctions comme « Conversion » et de composants comme « Timers » et « Devices ». Cette librairie n’est pas très étoffée pour le moment…
  • le paquetage « A4A.Protocols » ne fournit pour le moment qu’un binding vers la librairie « libmodbus », ce qui permet déjà d’implémenter un serveur Modbus TCP pour la connexion d’un superviseur ou un client pour piloter un module d’entrées / sorties serveur Modbus TCP. Je n’ai pas encore eu le temps de réaliser le binding des fonctions Modbus RTU mais ça ne me semble pas hors de portée. Si cela intéresse quelqu’un, je peux réaliser un binding de la librairie du pilote pour les cartes Hilscher cifX… 😉
  • enfin, votre application pourra être soit en mode console, soit avec une interface graphique avec GtkAda.
  • et, cerise sur le gâteau, elle pourra s’exécuter tant sous Linux que sous Windows® par simple recompilation sur la plate-forme de votre choix.

Si la licence choisie, GMGPL, n’évoque rien pour vous et que vous vous demandez ce qu’il est légal de faire avec une telle licence, voyez avec votre juriste favori ou avec les gens de chez AdaCore, qui fournissent les outils Ada que j’utilise et qui ont conçu cette licence.
J’avoue ma grande incompétence dans ce domaine. N’hésitez pas à m’éclairer.

Je consulte régulièrement les forums Ada et notamment :
https://groups.google.com/forum/?fromgroups=#!forum/fr.comp.lang.ada

Si vos questions portent sur Ada, de très compétentes et sympathiques personnes pourront y répondre.
J’espère pour ma part pouvoir répondre à celles que vous poserez sur Ada for Automation.

Bien sûr, c’est un projet libre et je ne manquerai pas d’intégrer vos contributions si elles servent le projet.

Cordialement,
Stéphane

cifX : Siemens WinAC RTX – Application de test – Configuration OMB / PNS

Bonjour,

J’espère que vous avez passé de joyeuses fêtes et je vous adresse mes meilleurs vœux pour cette nouvelle année.

Comme le calme de cette période de fêtes était propice, j’ai augmenté l’application de test pour le pilote cifX pour WinAC RTX®, abondamment 😉 décrite ici déjà.

Les modifications et adjonctions portent sur l’aspect messagerie de l’API et sur la configuration des cartes cifX par programme.

Concernant ce dernier point, j’en ai fourni un exemple en C pour la configuration d’une carte en PROFIBUS DP Esclave .

La version de l’application de test libérée ce jour, et que vous pouvez vous procurer dès maintenant, montre la configuration d’une carte Hilscher cifX 50E-RE avec le firmware Open Modbus TCP en IO Server ou avec le firmware PROFINET IO IRT Device.

A cet effet, le FB36 « CIFX_CHANNEL_MSG » a été remanié afin de fournir la fonctionnalité suivante :

  • lecture des informations systèmes,
  • configuration du firmware Open Modbus TCP en IO Server ou avec le firmware PROFINET IO IRT Device selon le firmware sélectionné,
  • initialisation du canal

La gestion de la messagerie est opérée par une collaboration entre les blocs fonctions suivants :

FB36 CIFX_CHANNEL_MSG0_0 Hilscher cifX Channel Messaging
FB40 CIFX_CHANNEL_GET_PACKET Hilscher cifX Driver : Messaging / Getting Packets
FB41 CIFX_CHANNEL_PUT_PACKET Hilscher cifX Driver : Messaging / Putting Packets
FB42 CIFX_CNL_GSYSINFO0_0 Hilscher cifX Driver : Messaging / Get System Information
FB43 CIFX_CNL_SCNFOMB0_0 Hilscher cifX Driver : Messaging / Set Configuration Modbus TCP Slave
FB44 CIFX_CNL_INIT0_0 Hilscher cifX Driver : Messaging / Channel Init
FB45 CIFX_CNL_SCNFPNS0_0 Hilscher cifX Driver : Messaging / Set Configuration PROFINET Slave

C’est tombé en marche sans trop de souci, par exemple en PROFINET avec une CPU PN/DP IM151-8 :


Ainsi, vous pouvez aisément faire communiquer votre NanoBox Siemens avec un automate Schneider Electric par exemple, configuré en client Modbus TCP / IO Scanning, ou un autre automate Siemens configuré en contrôleur PROFINET.

Je tâcherai d’implémenter d’autres blocs fonctions pour la configuration des différentes piles de protocoles supportés par les cartes Hilscher cifX dans la mesure du possible.

Vous pouvez toujours nous solliciter pour obtenir un exemple de code convenant à votre besoin.

Cordialement,
Stéphane

A4A : compilation de libmodbus avec GNAT GPS sous Windows

Bonjour,

Pour mon premier article concernant « Ada for Automation » j’ai choisi de mettre en exergue d’une part GNAT GPL, l’atelier de développement édité par AdaCore, et d’autre part la bibliothèque libmodbus que j’utilise pour développer des outils de test ou de démonstration par exemple et aussi dans « Ada for Automation ».

Je me propose donc de montrer une facette de GNAT GPL, que j’utilise bien évidemment pour développer en Ada, mais qui est également très capable pour développer dans d’autres langages dont le C, ce que je vais mettre à profit pour compiler libmodbus sous Windows® XP.

J’apprécie beaucoup libmodbus, une bibliothèque qui permet de réaliser très simplement une application Modbus, RTU Maitre ou Esclave / TCP Client ou Serveur, qui présente de nombreux avantages comme la disponibilité du code source, une licence LGPL, disponibilité pour plusieurs plateformes dont Linux et Windows®.

Comme je suis souvent sous Windows®, ainsi que bon nombre d’entre nous, et que cette bibliothèque n’est pas fournie sous forme binaire, il est nécessaire de disposer d’une chaine d’outils pour obtenir la DLL qui va bien pour nos projets.

En cherchant un peu sur la page de Monsieur Stéphane Raimbault on trouve que, pour compiler sa bibliothèque sous Windows®, on peut utiliser MinGW et MSYS. Il est également possible d’utiliser Microsoft Visual Studio®.

C’est très bien pour ceux qui ont une certaines expérience de ces outils mais c’est un peu complexe pour beaucoup, dont le public espéré pour « Ada for Automation ».

Or il se trouve que GNAT GPL est disponible sous Windows®, intègre MinGW et les outils nécessaires à cette compilation, et s’installe le plus simplement.

Moyennant un petit fichier définissant les chemins, les fichiers et quelques options de compilation, l’outil GPRbuild va gérer compilateur, linker…

Voici donc le contenu de ce fichier « lib_modbus32x86.gpr », que je trouve assez auto-explicatif :

library project Lib_Modbus32X86 is

   for Languages use ("C");
   for Library_Dir use "..\libmodbus-3.0.3\libs\x86";
   for Library_Kind use "dynamic";
   for Library_Name use "modbus";
   for Source_Dirs use ("..\libmodbus-3.0.3\src");
   for Source_Files use ("modbus.c", "modbus.h", "modbus-data.c", "modbus-private.h", "modbus-rtu.c", "modbus-rtu.h", "modbus-rtu-private.h", "modbus-tcp.c", "modbus-tcp.h", "modbus-tcp-private.h", "modbus-version.h");
   for Object_Dir use "..\libmodbus-3.0.3\obj";
   for Library_Options use ("-lws2_32");

   package Linker is
      for Linker_Options use ();
   end Linker;

end Lib_Modbus32X86;

J’ai donc téléchargé le code source de libmodbus et je l’ai désarchivé dans mon arborescence avec 7-Zip. J’ai créé les répertoires « libs » et « obj » parce que j’aime bien que tout ne soit pas mélangé.

Pour un projet en C utilisant cette bibliothèque, il suffit d’inclure le fichier projet de celle-ci dans le fichier de notre projet « c01.gpr » :

with "lib_modbus32x86.gpr";

project C01 is

   for Languages use ("C");
   for Source_Dirs use ("src");
   for Source_Files use ("unit-test-server.c", "unit-test.h");
   for Main use ("unit-test-server.c");
   for Object_Dir use ".\obj";
   for Exec_Dir use ".\exe";

   package Naming is
      for Spec_Suffix ("c") use ".h";
      for Body_Suffix ("c") use ".c";
   end Naming;

end C01;

Bien sûr, j’ai créé l’arborescence correspondante :

Pour ce projet de test je ne me suis pas embêté ; j’ai récupéré les fichiers sources dans le dossier « tests » de libmodbus.

En ouvrant le projet « lib_modbus32x86.gpr » avec GNAT GPL et en tentant de le compiler j’ai obtenu une erreur comme quoi le fichier « config.h » inclus dans les fichiers « modbus.c » et « modbus-private.h » n’existait pas. C’est normal car ce fichier est généré par les autotools que l’on n’utilise pas dans ce cas. J’ai donc commenté les lignes et « Build All » a réussi à générer la DLL.

Ta ! Tan ! Yeah !

So far, so good…

Voyons avec le projet de test.

Ça compile d’un coup de « Build All » et je trouve mon exécutable là où il est censé se trouver. J’y colle avec la DLL car le chemin de celle-ci n’est pas dans mon %PATH%.

Je peux lancer mon programme de test obtenu et il attend la connexion d’un client :

Comme client, je vais utiliser l’utilitaire « Modbus Poll« .
Je définis une connexion vers le PC exécutant mon programme de test. Le port est le « 1502 », celui qui est défini par défaut dans le programme de test car sous Linux le port « 502 » nécessite des droits administrateur.

Et le compteur qui s’incrémente est de bon augure.

Tandis que côté programme de test Modbus TCP Server, qui a été compilé avec l’option « Debug » sur « On », on observe les traces de nos échanges.

N’est-ce pas merveilleux ? 😉

Cordialement,
Stéphane

cifX : Mise en œuvre – Modbus TCP Serveur

Bonjour,

Mon précédent article présentait la mise en œuvre des cartes Hilscher cifX de manière générale.

Dans celui-ci nous allons détailler la configuration d’une carte cifX au format PCI, disposant de deux ports Ethernet, la cifX 50-RE, avec un firmware Modbus TCP, ce firmware pouvant être configuré en Client ou en Serveur, (voire les deux simultanément mais c’est plus sportif ;-)).

J’ai déjà évoqué l’application cifXSetup qui est installée en même temps que le pilote cifX et qui est accessible depuis le panneau de configuration de Windows®. Lorsque l’on exécute cette application sans avoir procédé à une quelconque configuration, on trouve une carte non configurée évidemment :

On y voit notamment le numéro de produit et le numéro de série. Comme ma carte est un peu ancienne, elle ne dispose pas de la roue codeuse pour régler le numéro d’emplacement (ou slot). Comme il n’y en a qu’une dans cette machine de test elle est identifiée « cifX0 ».

L’on voit également qu’elle dispose de deux ports Ethernet et qu’aucun fichier de firmware ni de configuration n’est affecté à cette carte pour l’instant.

Comme on souhaite configurer la carte en tant que serveur Modbus TCP, il est possible de le faire avec « netX Configuration Tool », l’outil dédié à la configuration des versions esclaves.

L’outil détecte la carte cifX qui a le numéro de série 20951, qui ne dispose pas de firmware et encore moins de configuration. Comme la carte est équipée de ports Ethernet, l’outil ne propose que les protocoles Ethernet / Ethernet Temps Réel que sont PROFINET, EtherCAT, Ethernet/IP, Modbus TCP, Sercos III, POWERLINK et VARAN.

En cliquant sur le bouton Modbus TCP, on obtient la vue de configuration Modbus TCP comme de bien entendu, avec une configuration par défaut :

On y apporte les modifications que l’on souhaite, ici j’ai remplacé l’affectation des paramètres par serveur DHCP par une affectation statique et j’ai coché l’option « Map FC1 and FC3 ».

Voilà, voilà, ma configuration est terminée et je télécharge et le firmware et la configuration en cliquant sur « Apply ».

Le chargement s’est bien passé, c’est le cas en général, et le message dans la barre de status l’indique.

J’ai branché le câble Ethernet et la communication a démarré toute seule (l’option « Bus Startup » est sur « Automatic ») et l’on attend la connexion du Client Modbus TCP.

Comme client, je vais utiliser l’utilitaire « Modbus Poll » qui ne va pas mal :

Bien sûr, cela fonctionne aussi avec n’importe quel autre client Modbus TCP.
S’il y a de la demande, je veux bien vous établir un exemple avec un automate M340 de Schneider Electric.

Je définis donc une connexion avec ma carte cifX.

Et la communication démarre avec la FC3 qui est la fonction de lecture de registres définie par défaut.
On voit le compteur s’incrémenter, c’est plutôt bon signe…

ModbusPoll04

Côté « netX Configuration Tool », ça s’anime :

On peut jouer avec nos entrées et sorties depuis la vue « IO Monitor » :

Cette vue nous permet d’affecter des valeurs à nos sorties – qui sont donc les entrées pour Modbus Poll – et de visualiser l’état de nos entrées – les sorties de Modbus Poll.

Un, deux et trois :

Ça marche dans ce sens !

Je lis donc avec la fonction FC3 les entrées, ce qui est vrai car j’ai coché l’option « Map FC1 and FC3 » lors de la configuration. Sinon, je relirais les sorties, ce qui peut présenter un avantage s’il y a plusieurs clients Modbus TCP qui pilotent les sorties.

Je peux modifier mes définitions de fonctions pour les lectures / écritures :

Fonction FC3 ou Lecture de multiples registres internes :

Ou fonction FC4, Lecture de multiples registres d’entrées :

Fonction FC16 ou Écriture de multiples registres internes :

Testons l’écriture…

Onze, douze, treize… Envoi !

Et pendant ce temps sur « netX Configuration Tool » :

Donc cela fonctionne, mais personne n’en doutait.

Si l’on exécute à nouveau cifXSetup, on voit que maintenant les espaces firmware et configuration sont renseignés.

On trouve dans l’arborescence les dossiers et fichiers destinés au pilote cifX :

Et dans la base de registres les clés sont bien présentes :

Cordialement,
Stéphane