Archives de catégorie : Ada4Automation

A4A : Mise en place d’un forum de discussion

Bonjour,

Je viens de mettre en place un forum de discussion dédié à « Ada for Automation ».

Répondre à vos interrogations, collecter vos retours, vos projets et réalisations, partager les expériences, tels sont les objectifs de ce forum.

N’hésitez pas à vous inscrire et à poster, c’est fait pour, en Français de préférence, mais pourquoi pas en Anglais, voire en Espagnol.

Le forum est donc accessible ici :
http://forum.slo-ist.fr

J’attends donc vos questions, remarques, suggestions, propositions, etc… et je vous en remercie par avance.

Cordialement,
Stéphane

A4A : Projet pilote pour Ada for Automation

Bonjour,

Je suis toujours en quête d’un projet pilote pour « Ada for Automation ».

Dans mon précédent billet sur le sujet j’évoquais une solution Debian Linux car j’avais essentiellement fait des tests sur cette solution.

Comme vous le savez, il est possible de compiler un même programme Ada pour l’exécuter sous Windows®. J’ai donc procédé à quelques tests sur cette plate-forme et cela fonctionne comme un charme.

Je peux donc vous proposer pour votre projet pilote « Ada for Automation », par exemple, une solution d’automatisme sur la base du PC de votre choix sous Windows®, « Ada for Automation » pour l’application automate, une carte Hilscher pour le ou les bus de terrain éventuellement nécessaires, et PcVue pour l’IHM (ou la solution qui vous convient).

Si votre application nécessite un environnement Temps Réel dur, IntervalZero propose l’extension qui va bien, RTX®, Hilscher propose le pilote cifX pour RTX®, et AdaCore vous propose, sous la forme d’une souscription annuelle, l’environnement d’exécution Ada pour RTX®.

Je profite de ce billet pour vous indiquer qu’une version plus récente de la documentation est disponible, au format HTML, pas encore PDF parce que ma Debian Sid est un peu chamboulée depuis la sortie de Debian 7.0 « Wheezy ».

Edit : C’est réparé !

Au niveau code, quelques fonctions et blocs fonctions, SCALE, RAMP, LIMIT, PID, etc…, sont là depuis un petit moment.

Pour l’instant je joue avec Ada Web Server (AWS) et GtkAda et j’espère bien en faire quelque chose bientôt…

Bien sûr, un projet pilote me permettrait de consacrer davantage de temps au développement de « Ada for Automation ».
Aussi, n’hésitez pas à me solliciter si besoin.

Cordialement,
Stéphane

A4A : Projet pilote pour Ada for Automation

Bonjour,

« Ada for Automation » est donc un framework pour concevoir des applications d’automatisme en Ada.

Aujourd’hui, il dispose :

  • d’un Client Modbus TCP pour gérer des entrées et sorties déportées, façon IO Scanning,
  • d’un Serveur Modbus TCP pour l’interface avec la supervision de votre choix ou d’autres automates,
  • et avec la possibilité d’utiliser les cartes Hilscher cifX, la connectivité est tout bonnement impressionnante. 😉

Avec les librairies Ada disponibles il est possible de faire beaucoup de choses mais la librairie de composants de « Ada for Automation » est encore rachitique.

Bien sûr, cela va s’étoffer, avec le temps, et vos contributions. 🙂

Mais il manque un ou des projets pilotes afin de pouvoir travailler sur des cas concrets, parce que bon, sur ma paillasse, hormis quelques LED et boutons, ça manque un peu de capteurs et d’actionneurs, d’utilisateurs, d’opérateurs et de gestionnaires à mettre en pétard…

Aussi, si votre projet d’automatisme qui ne débouche pas depuis que la crise a siphonné tous les budgets peut s’accommoder de quelques aléas dus à la jeunesse de la chose et que vous souhaitez vous investir dans l’apprentissage de Ada, je vous propose de travailler de concert à l’élaboration de votre solution basée sur « Ada for Automation ».

Au niveau matériel, une petite machine tournant sous Debian de préférence et comportant si nécessaire un emplacement PCI ou PCI Express pour embarquer une carte Hilscher cifX serait suffisante.

Je suis à votre écoute pour discuter de votre besoin et valider la faisabilité de votre projet.

Cordialement,
Stéphane

A4A : Binding Ada pour le pilote des cartes Hilscher cifX

Bonjour,

Je travaille actuellement sur un binding Ada pour le pilote (cifX Device Driver) des cartes Hilscher cifX.

A ce jour, ce binding permet d’utiliser les cartes cifX depuis un programme en Ada pour les échanges cycliques, c’est à dire les échanges d’entrées et sorties avec la périphérie déportée sur les bus de terrain, ce qui est suffisant dans beaucoup d’applications d’automatisme.

Voilà un bout de code jeté à la va-vite pour vous donner une idée de la chose.

En Ada, lorsque l’on appelle une fonction comportant des paramètres, il est possible de les nommer, ce qui facilite la lecture et la compréhension ultérieure, et je trouve que ça les fait ressembler à des appels de fonctions en « Structured Text ».

Si l’on ôte toutes les traces, ce programme est très limité : il recopie quatre octets d’entrée dans quatre octets de sortie durant 60 secondes.

-----------------------------------------------------------------------
--                       Ada for Automation                          --
--                                                                   --
--                 Copyright (C) 2012, Stephane LOS                  --
--                                                                   --
-- This library is free software; you can redistribute it and/or     --
-- modify it under the terms of the GNU General Public               --
-- License as published by the Free Software Foundation; either      --
-- version 2 of the License, 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    --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU --
-- General Public License for more details.                          --
--                                                                   --
-- You should have received a copy of the GNU General Public         --
-- License along with this library; if not, write to the             --
-- Free Software Foundation, Inc., 59 Temple Place - Suite 330,      --
-- Boston, MA 02111-1307, USA.                                       --
--                                                                   --
-- As a special exception, if other files instantiate generics from  --
-- this unit, or you link this unit with other files to produce an   --
-- executable, this  unit  does not  by itself cause  the resulting  --
-- executable to be covered by the GNU General Public License. This  --
-- exception does not however invalidate any other reasons why the   --
-- executable file  might be covered by the  GNU Public License.     --
-----------------------------------------------------------------------


with Ada.Text_IO;

with A4A; use A4A;
with A4A.Protocols.HilscherX;

procedure Test_CifX is

   package cifX renames A4A.Protocols.HilscherX;

   Driver_Handle  : aliased cifX.Driver_Handle_Type;
   Channel_Handle : aliased cifX.Channel_Handle_Type;
   Result : DInt;

   Input_Data  : Byte_Array (0..9) := (others => 0);
   Output_Data : Byte_Array (0..9) := (others => 0);

   My_Timer : Integer := 10;

begin

   Ada.Text_IO.Put_Line (Item => "Test_CifX...");

   Ada.Text_IO.Put_Line (Item => "Initializing Linux Driver");
   Result := cifX.Linux_Driver_Init;
   if Result /= cifX.CIFX_NO_ERROR then
      cifX.Show_Error(Result);
   else

      Ada.Text_IO.Put_Line (Item => "Opening Driver");
      Result := cifX.Driver_Open (Driver_Handle'Access);
      if Result /= cifX.CIFX_NO_ERROR then
         cifX.Show_Error(Result);
      else

         Ada.Text_IO.Put_Line (Item => "Opening Channel");
         Result := cifX.Channel_Open
           (Driver_Handle          => Driver_Handle,
            Board_Name             => "cifX0",
            Channel_Number         => 0,
            Channel_Handle_Access  => Channel_Handle'Access);

         if Result /= cifX.CIFX_NO_ERROR then
            cifX.Show_Error(Result);
         else

            Ada.Text_IO.Put_Line (Item => "IO Exchange");
            loop
               Result := cifX.Channel_IO_Read
                 (Channel_Handle => Channel_Handle,
                  Area_Number    => 0,
                  Offset         => 0,
                  Data_Length    => 4, --Input_Data'Length,
                  Data_In        => Input_Data,
                  Time_Out       => 10);
               Ada.Text_IO.Put_Line (Item => "Channel_IO_Read");
               if Result /= cifX.CIFX_NO_ERROR then
                  cifX.Show_Error(Result);
               else
                  for Index in Input_Data'First .. 3 loop

                     Ada.Text_IO.Put ("Input_Data(" & Index'Img & ") : ");
                     Byte_Text_IO.Put (Input_Data(Index), Base => 16);
                     Ada.Text_IO.New_Line;

                     Output_Data(Index) := Input_Data(Index);
                  end loop;

                  Result := cifX.Channel_IO_Write
                    (Channel_Handle => Channel_Handle,
                     Area_Number    => 0,
                     Offset         => 0,
                     Data_Length    => 4, --Output_Data'Length,
                     Data_Out       => Output_Data,
                     Time_Out       => 10);
                  Ada.Text_IO.Put_Line (Item => "Channel_IO_Write");

                  if Result /= cifX.CIFX_NO_ERROR then
                     cifX.Show_Error(Result);
                  end if;
               end if;

               My_Timer := My_Timer - 1;
               exit when My_Timer <= 0;

               delay 1.0;
            end loop;

            Ada.Text_IO.Put_Line (Item => "Closing Channel");
            Result := cifX.Channel_Close (Channel_Handle);
            if Result /= cifX.CIFX_NO_ERROR then
               cifX.Show_Error(Result);
            end if;

         end if;

         Ada.Text_IO.Put_Line (Item => "Closing Driver");
         Result := cifX.Driver_Close (Driver_Handle);
         if Result /= cifX.CIFX_NO_ERROR then
            cifX.Show_Error(Result);
         end if;

      end if;

   end if;

   Ada.Text_IO.Put_Line (Item => "Deinitializing Linux Driver");
   cifX.Linux_Driver_Deinit;

end Test_CifX;

Cordialement,
Stéphane

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