🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.lang.ada
Article #74

Re: Ada for Automation

#74
From: slos
Date: Tue, 29 Jan 2013 19:29
121 lines
5436 bytes
Le jeudi 24 janvier 2013 23:28:59 UTC+1, slos a écrit :
...

Bonjour,

Je suppose que personne ne va se fatiguer à ouvrir cette archive pour y chercher ce que j'évoque... Je ne l'aurais sans doute pas fait et ne blâme donc personne.

Je vais tâcher d'être plus concis.

Il s'agit donc de cette fonction :
http://libmodbus.org/site_media/html/modbus_mapping_new.html

La spécification est définie ainsi :

   function Mapping_New
     (Nb_Coil_Status       : in Interfaces.C.int;
      Nb_Input_Status      : in Interfaces.C.int;
      Nb_Holding_Registers : in Interfaces.C.int;
      Nb_Input_Registers   : in Interfaces.C.int)
      return System.Address;
   -- May raise an Error
   --modbus_mapping_t* modbus_mapping_new(int nb_coil_status, int nb_input_status,
   --                                  int nb_holding_registers, int nb_input_registers);

Le corps ainsi :

   function Mapping_New
     (Nb_Coil_Status       : in Interfaces.C.int;
      Nb_Input_Status      : in Interfaces.C.int;
      Nb_Holding_Registers : in Interfaces.C.int;
      Nb_Input_Registers   : in Interfaces.C.int)
      return System.Address is
      function Modbus_Mapping_New
        (Nb_Coil_Status       : in Interfaces.C.int;
         Nb_Input_Status      : in Interfaces.C.int;
         Nb_Holding_Registers : in Interfaces.C.int;
         Nb_Input_Registers   : in Interfaces.C.int)
         return System.Address;
      --modbus_mapping_t* modbus_mapping_new(int nb_coil_status, int nb_input_status,
      --                                  int nb_holding_registers, int nb_input_registers);
      pragma Import (C, Modbus_Mapping_New, "modbus_mapping_new");
      Result         : System.Address;
   begin
      Result := Modbus_Mapping_New(Nb_Coil_Status,
                                   Nb_Input_Status,
                                   Nb_Holding_Registers,
                                   Nb_Input_Registers);
      if Result = System.Null_Address then
         raise Other_Error with Modbus_Strerror;
      end if;

      return Result;
   end Mapping_New;

Quant au System.Address retourné il pointe sur un :

   type Modbus_Mapping_Type is
      record
         nb_bits             : Interfaces.C.int;
         nb_input_bits       : Interfaces.C.int;
         nb_input_registers  : Interfaces.C.int;
         nb_registers        : Interfaces.C.int;
         tab_bits            : System.Address;
         tab_input_bits      : System.Address;
         tab_input_registers : System.Address;
         tab_registers       : System.Address;
      end record;
   --     typedef struct {
   --       int nb_bits;
   --       int nb_input_bits;
   --       int nb_input_registers;
   --       int nb_registers;
   --       uint8_t *tab_bits;
   --       uint8_t *tab_input_bits;
   --       uint16_t *tab_input_registers;
   --       uint16_t *tab_registers;
   --     } modbus_mapping_t;
   type Modbus_Mapping_Type_Access is access all Modbus_Mapping_Type;

A l'utilisation, ça donne ceci :

...
   MyMapping_Access  : System.Address;
...

   MyMapping_Access := LibModbus.Mapping_New (Nb_Coil_Status       => 80,
                                              Nb_Input_Status      => 80,
                                              Nb_Holding_Registers => 10,
                                              Nb_Input_Registers   => 10);
...
   declare
      MyMapping : LibModbus.Modbus_Mapping_Type;
      for MyMapping'Address use MyMapping_Access;
      My_tab_registers : Word_Array(0..9);
      for My_tab_registers'Address use MyMapping.tab_registers;
   begin
      My_tab_registers(0) := 16#0102#;
      My_tab_registers(1) := 16#0304#;
...

Que pensez vous de cette plomberie ?

Pour ma part, j'en reste perplexe.

J'aurais bien vu une fonction qui me retourne une structure avec un tableau de chaque, avec la dimension qui va bien, et qui partage l'adresse avec le mapping en C, mais je n'y parviens pas pour l'instant.

Merci pour vos lumières.

Cordialement,
Stéphane
 
Technical Details
Message-ID: <ce90c01c-2d8c-4a0c-83d7-1a8d8bab8e7f@googlegroups.com>
Path: arc1-ca.pugleaf.net!k2ni3907qap.0!nntp.google.com!p13no6106546qai.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <4e7e5467-fe89-4d55-8b46-80e3cd8af9f8@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Google-Thread: 43d0c745c,3ec9ea2623601032
X-Google-Attributes: gid43d0c745c,public,usenet
X-Google-NewGroupId: yes
X-Google-Language: FRENCH,ASCII
X-Received: by 10.224.17.140 with SMTP id s12mr1110048qaa.3.1359487784146;
        Tue, 29 Jan 2013 11:29:44 -0800 (PST)
X-Received: by 10.49.116.135 with SMTP id jw7mr245168qeb.10.1359487783909;
 Tue, 29 Jan 2013 11:29:43 -0800 (PST)
Path: arc1-ca.pugleaf.net!k2ni3907qap.0!nntp.google.com!p13no6106546qai.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: fr.comp.lang.ada
Date: Tue, 29 Jan 2013 11:29:43 -0800 (PST)
In-Reply-To: <4e7e5467-fe89-4d55-8b46-80e3cd8af9f8@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=80.119.168.166;
 posting-account=O3LyFwoAAACc1uh60ZcOUmAGdDmGsEcV
NNTP-Posting-Host: 80.119.168.166
References: <4e7e5467-fe89-4d55-8b46-80e3cd8af9f8@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <ce90c01c-2d8c-4a0c-83d7-1a8d8bab8e7f@googlegroups.com>
Subject: Re: Ada for Automation
From: slos <new.stephane.los@gmail.com>
Injection-Date: Tue, 29 Jan 2013 19:29:44 +0000
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable