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