Archives par mot-clé : Modbus

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
<code>

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 »);

<code>

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

<code>

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";
<code>

project C01 is

<code>

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 »;

<code>

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

<code>

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