Archives de catégorie : Ada4Automation

« Ada for Automation » aux JDLL 2017

Bonjour,

Comme l’année dernière, je serai présent aux Journées du Logiciel Libre 2017 pour présenter « Ada for Automation » et répondre aux éventuelles questions.

J’y tiendrai un stand dans l’espace « Do It Yourself » Samedi 01 et Dimanche 02/04/2017 de 10h00 à 18h00 et animerai une démonstration Samedi de 14h30 à 15h30 (salle danse au sous-sol, ça tombe bien ! – « Ada for Automation » est ma danseuse…).

J’espère bien sûr vous y voir pour échanger avec vous. Venez avec vos projets, vos idées, votre matériel… et votre curiosité !

Cordialement,
Stéphane

A4A : CAN Newsletter magazine March 2017: 25th anniversary

Bonjour,

Je n’ai pas beaucoup travaillé sur « Ada for Automation », et encore moins communiqué, ces derniers temps. Ce n’est pas pour autant que je suis resté les bras ballants et lorsque CAN in Automation (CiA) a offert gentiment la possibilité de participer à leur revue pour leur 25ème anniversaire j’ai proposé un article et celui-ci a eu l’honneur d’être sélectionné !

Cette revue vient de paraître début Mars et vous pouvez la trouver en ligne ici :
CAN Newsletter magazine March 2017: 25th anniversary

L’article lui-même est disponible au format PDF et en Anglais ici :
Ada for Automation : Ada language for automation

Je vous en souhaite une bonne lecture.

Je reviens rapidement vers vous pour plus de nouvelles, car il y en a !

Cordialement,
Stéphane

A4A : Toujours dans les nuages

Bonjour,

L’article précédent était consacré à la mise en orbite basse de « Ada for Automation ».

Il me tenait à cœur d’obtenir rapidement une fonctionnalité identique à celle de cette même application de démonstration « App1 » munie de son interface en GtkAda.

J’ai donc rajouté, tant pour l’application « App1 » que pour l’application de simulation de la partie opérante « App1simu » les pages présentant l’état général de l’application, l’état du serveur Modbus TCP et, pour « App1 », l’état des clients Modbus TCP.

On a donc pour l’application « App1 » elle-même :

Et pour la simulation de la partie opérante :

Cela m’a permis de vérifier la pertinence de la solution Gnoga, que ce soit pour attacher des éléments déjà disponibles dans une page HTML + SVG à des objets de l’application écrite en Ada comme pour la vue synoptique principale ou les pages « état général » et « état du serveur Modbus TCP », ou pour créer des pages dynamiques comme pour la page d’état des clients Modbus TCP.

En effet, cette page s’adapte automatiquement en fonction de la configuration de la scrutation des serveurs Modbus TCP ou « IO Scanning » définie dans le code suivant :

------------------------------------------------------------------------------
--                            Ada for Automation                            --
--                                                                          --
--                   Copyright (C) 2012-2016, Stephane LOS                  --
--                                                                          --
-- This library is free software;  you can redistribute it and/or modify it --
-- under terms of the  GNU General Public License  as published by the Free --
-- Software  Foundation;  either version 3,  or (at your  option) any later --
-- version. This library is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE.                            --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
------------------------------------------------------------------------------

with A4A.MBTCP_Client; use A4A.MBTCP_Client;
with A4A.Protocols; use A4A.Protocols.IP_Address_Strings;
with A4A.Protocols.LibModbus; use A4A.Protocols.LibModbus;

package A4A.Application.MBTCP_Clients_Config is

   --------------------------------------------------------------------
   --  Modbus TCP Clients configuration
   --------------------------------------------------------------------

   --  For each Modbus TCP Server define one client configuration task

   Config1 : aliased Client_Configuration :=
     (Command_Number    => 11,
      Enabled           => True,
      Debug_On          => False,
      Task_Period_MS    => 10,
      Retries           => 3,
      Timeout           => 0.2,

      Server_IP_Address => To_Bounded_String ("127.0.0.1"),
      --  127.0.0.1 / 192.168.0.100

      Server_TCP_Port   => 1504,
      --  502 Standard / 1502 PLC Simu / 1504 App1Simu

      Commands =>
        (
         --                                Period              Offset Offset
         --               Action Enabled Multiple Shift Number Remote  Local
         1 =>
           (Read_Input_Registers,   True,      10,    0,    10,     0,     0),
         2 =>
           (Read_Registers,         True,      20,    0,    10,     0,    10),
         3 =>
           (Write_Registers,        True,      30,    0,    20,    20,     0),
         4 =>
           (Read_Bits,              True,      30,    1,    16,     0,     0),
         5 =>
           (Read_Input_Bits,        True,      30,    2,    16,     0,    32),
         6 =>
           (Write_Register,         True,      30,    3,     1,    50,    30),
         7 =>
           (Write_Bit,              True,      30,    4,     1,     0,     0),
         8 =>
           (Write_Bits,             True,      30,    5,    15,     1,     1),

         9 => (Action              => Write_Read_Registers,
               Enabled             => True,
               Period_Multiple     => 10,
               Shift               =>  5,
               Write_Number        => 10,
               Write_Offset_Remote => 40,
               Write_Offset_Local  => 20,
               Read_Number         => 10,
               Read_Offset_Remote  => 10,
               Read_Offset_Local   => 20),
         10 =>
           (Read_Registers,         True,      50,    0,    10,   100,   100),
         11 =>
           (Read_Registers,         True,      50,    1,    10,   110,   110)
        )
     );

   Config2 : aliased Client_Configuration :=
     (Command_Number    => 2,
      Enabled           => False,
      Debug_On          => False,
      Task_Period_MS    => 100,
      Retries           => 3,
      Timeout           => 0.2,

      Server_IP_Address => To_Bounded_String ("127.0.0.1"),
      Server_TCP_Port   => 1503, -- My own MBTCP server

      Commands =>
        (
         --                                Period              Offset Offset
         --               Action Enabled Multiple Shift Number Remote  Local
         1 =>
           (Read_Registers,         True,      10,    0,    10,     0,     0),
         2 =>
           (Write_Registers,        True,      30,    1,    10,     0,     0)
        )
     );

   --  Declare all clients configuration in the array
   --  The kernel will create those clients accordingly

   MBTCP_Clients_Configuration : Client_Configuration_Access_Array :=
     (1 => Config1'Access,
      2 => Config2'Access);

end A4A.Application.MBTCP_Clients_Config;

Ainsi, pour chaque serveur scruté, une tâche cliente est créée qui va exécuter cycliquement les commandes renseignées dans le tableau de configuration.

La page sera donc automatiquement ajustée en créant dynamiquement les sections relatives aux tâches clientes avec une table d’état des commandes tout aussi adaptée.

Et comme l’on utilise que du HTML5, du SVG et des feuilles de style CSS3, l’application peut changer de « look » sans avoir besoin de recompiler celle-ci.

D’ailleurs, comme je n’ai aucune prétention concernant mes talents en design, j’accepte bien volontiers toute suggestion dans ce domaine.

En éternel débutant, tous vos commentaires et / ou suggestions sont bien sûr les bienvenus.

Cordialement,
Stéphane

« Ada for Automation » in the cloud !

Bonjour,

J’évoque ça et là le projet « Ada for Automation » mais seuls le code source et les articles sur ce blog, dans lesquels figurent quelques copies d’écran et photos, ainsi qu’une documentation incomplète, étaient disponibles jusqu’alors.

J’étais bien présent au JDLL mais pas vous (ou nous nous sommes ratés…) et / ou vous n’avez pu assister aux démonstrations et conférence…

Pour ceux intéressés, qui souhaiteraient y voir fonctionner mais sans passer trop de temps en téléchargement, installation d’outils, compilation et mise en œuvre, ainsi que pour les tests et démonstrations, j’ai installé dans le nuage une machine virtuelle, qui exécute une Debian Jessie 64 bits, et une paire d’applications très simples avec une interface web fondée sur Gnoga dont il a déjà été question notamment ici.

"Ada for Automation" in the cloud !
« Ada for Automation » in the cloud !

Merci à ceux qui rendent cette chose possible, je pense notamment aux auteurs et contributeurs du logiciel libre.

Voici donc l’application 1 :
http://ada4automation.slo-ist.fr:8080

Et vu qu’on est dans le virtuel une simulation de la partie opérante :
http://ada4automation.slo-ist.fr:8081

Ces deux applications échangent leurs données via le protocole Modbus TCP grâce à libmodbus.

Chacune intègre son propre serveur web auquel on a affecté un port différent du port standard (le port 80).
On accède donc aux pages en spécifiant l’adresse et le port comme dans les liens fournis.

Normalement, si l’application de simulation est correctement pilotée, tout est en Auto et l’eau arrive toute seule de la vanne.
En fonction des seuils sur le niveau, la vanne s’ouvre et se ferme et la pompe tourne ou s’arrête.

En mode Manu, il est possible de piloter les actionneurs directement depuis l’interface.

En survolant les éléments, ceux qui peuvent être manœuvrés disposent d’une infobulle, sont mis en évidence et le curseur change également.
La documentation n’est plus trop à jour malheureusement, j’y travaille.
Au cas où vous souhaiteriez quelques explications, une aide en ligne est disponible.

C’est juste une démonstration. Cela devrait s’étoffer. On est à Lyon tout de même…
J’apprends encore Ada, les technologies web, linux…, bref, tout, donc ne soyez pas méchants.

Commentaires et suggestions bienvenus !

Cordialement,
Stéphane

A4A : MQTT et le Cloud

Bonjour,

Avec Gnoga votre application avait déjà la tête dans les nuages, embarquant un serveur web pour fournir une interface homme-machine web comme évoqué précédemment.

Parmi les sujets chauds du moment on trouve donc le nuage, le fameux Cloud, et ce que le marketing nous annonce comme la prochaine déferlante, le non moins fameux aujourd’hui Internet des Objets ou IoT, Industrial IoT, Industry 4.0 et autres petits noms qu’on lui donne.

Le nuage met à notre disposition, moyennant finances, une architecture permettant de bénéficier de machines virtuelles à géométrie et capacité variables, ce qu’on a coutume d’appeler l’infrastructure en tant que service ou IaaS, sur lesquelles on peut faire tourner différents systèmes d’exploitation, avec un lot de serveurs divers tels que serveurs web ou base de données, la plate-forme en tant que service ou PaaS, et par dessus des applications tout aussi diverses, soit le Software en tant que service, SaaS.

On peut par exemple imaginer que nous investissions dans une machine virtuelle d’un cloud public, que nous y installions une Debian du jour et que l’on y installe également une application « Ada for Automation » avec une interface web et une communication en Modbus TCP avec notre partie opérative pour le contrôle-commande de celle-ci.

Bon, ça risque de fonctionner mais il y a un point faible, la communication entre l’application de contrôle-commande et la partie opérative, avec cette dernière qui passera en repli en cas de problème de communication, si c’est bien réalisé.
On préférera bien sûr que notre application de contrôle-commande reste pas trop loin de notre partie opérative, sur une machine bien physique en local, surtout si on utilise une carte de communication Hilscher au lieu de Modbus TCP.

Par contre, pour une application permettant par exemple de surveiller les consommations d’une ou plusieurs installations, ou d’afficher différents indicateurs de production, de qualité ou de performance, une telle architecture pourrait faire sens.

L’un des protocoles concourant dans le domaine de l’IoT est MQTT et on en trouve toute l’information sur le web, comme dans l’excellent article de Framboise 314 avec un exemple de mise en œuvre sur Raspberry Pi.

Il se trouve que le non moins excellent Monsieur Per Sandberg a eu le bon goût d’en réaliser un binding pour Ada, mosquitto-ada qui fournira donc un client permettant de publier et souscrire auprès d’un serveur Mosquitto implémentant le protocole MQTT et connectant de ce fait votre application au nuage tant vanté, cf. IoT, Industry 4.0, etc…

Ainsi notre application tournant sur notre machine physique locale pourra transmettre ou recevoir des données du broker tandis que nos applications cloud consommerons ces données ou enverrons des informations diverses :
Cloud

Inkscape, c’est bon ! Mangez en !

Pour mémoire, je rappelle que j’espère bien vous voir à ces 17èmes Journées du Logiciel Libre
Les Gentils Organisateurs ayant bien voulu m’accorder la faveur insigne d’un stand pour la présentation du projet « Ada for Automation », n’hésitez pas à venir nous rendre visite pour échanger.

A priori, le stand se tiendra dans l’espace DIY.
Il est également prévu un atelier en Salle Musique le Dimanche 3 Mars de 10h00 à 11h00.

JDLL2016

Cordialement,
Stéphane