Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/01/2008, à 15:15

Guiss

Modbus\linux\supervision

Salut a tous.

J'aimerais réaliser une supervision d'un système automatisé sur une plate forme Linux ubuntu.

Je dispose d'un automate tsx47 qui possede un port com qui utilise le protocole modbus.
Ce port com db9 est relier a un xbt qui est actuellement hs est introuvable car trop vieux sur le marché, d'o๠l'utilisation d'un pc avec linux pour réaliser une supervison.

Comme puis je faire pour interfacer mon modbus et mon linux.

Il faut que je crée une base de données?? Je ne sais pas par quel bout commencer? Pouvez vous m'aider?

Merci
jc

Hors ligne

#2 Le 20/01/2008, à 15:37

ADcomp

Re : Modbus\linux\supervision

Salut,

http://download.telemecanique.com/Plane … tm#slide=1

Pour commencer ..

http://pes.free.fr/

http://www.modbus.org/

si l'argent ne compte pas beaucoup pour toi : http://www.modbusdriver.com/shop/index.php?cPath=38  wink

Bonne chance ..

PS : suis automaticien aussi , je bosse encore avec la série 7 ( 17,47,67,87 ) et premium .. si je peux aider ..


David [aka] ADcomp

Hors ligne

#3 Le 20/01/2008, à 16:04

Guiss

Re : Modbus\linux\supervision

salut

Merci de ton aide!!

Mais par quel bout je doit commencer?
Le logiciel libmodbus a quoi va t il me servir?

Dans un premier temps je pense que je dois récupérer tout les états de mes variable de mon automate. c'est ca?

Un peu comme un table d'animation dans Pl7 pro.
Ensuite je dois les stocker dans une base de données, oui mais laquelle?

En fait le plus dur ca doit être de faire communiquer mes différent logiciel!

guiss

Hors ligne

#4 Le 20/01/2008, à 16:16

Guiss

Re : Modbus\linux\supervision

A ton avis
C'est plus simple de faire une application de supervision sous linux ou sous windows?
Sachant qu'il faut que cela me coute le moins cher possible?

Merci
guiss

Hors ligne

#5 Le 21/01/2008, à 22:22

jmplinux

Re : Modbus\linux\supervision

Bonsoir,

J'ai déjà développé (pfiou, y a un bail de ça...) un outil sous Linux pour gérer du modbus série (maitre ou esclave) avec administration en http, stockage mysql, etc., un petit cahier des charges serait utile afin de mettre les soultions potentielles en face du problème ;-)

Hors ligne

#6 Le 22/01/2008, à 16:42

Guiss

Re : Modbus\linux\supervision

Salut

En fait il faudrait que je puisse stocké tout les états des variable de mon automate voir de plusieurs automate:
Les entrees
Les sorties
Les tempo
les bit
les mots.....

Tout ca dans une base de données; n'importe laquelle qui me servira de serveur, ces donnes pourront etre utiliser par différent pc client qui eux auront une supervision pour utiliser ou modifier ces donnes. Les client ce connectreont en tcp/ip via ethernet au serveur.

Récupération des donnes via le port de l'automate (TSX 47)  vers le port série de mon pc.


Optionnel:
[Sur mon serveur j'aimerais avoir acces a ces donnes  en temps réel voir leur états en temps réel grace a un tableur ou je rentrerai la variable qui m'intéresse ce tableur me donnerai l'état de ma variable]


Tout ca sous linux ubuntu.

Voila si tu peut m'aider.

As tu encore ton programme que tu as développé?

Merci
guiss

Hors ligne

#7 Le 24/01/2008, à 00:36

human enemy

Re : Modbus\linux\supervision

tu connais un peu la programmation en C/GTK+ ?


Si oui je peux t'aider un peu ...


<linux user>463160</linux user>
str = g_strdup_printf ("ubuntu user : %d",20328);

Hors ligne

#8 Le 24/01/2008, à 14:54

jmplinux

Re : Modbus\linux\supervision

Guiss a écrit :

Tout ca sous linux ubuntu.

Voila si tu peut m'aider.

As tu encore ton programme que tu as développé?

Merci
guiss

Oui bien sûr wink

Je fouille dans mes archives et je recompile tout ça juste pour voir s'il n'y aura pas de problème, je te tiens informé ici smile

En ce qui concerne la visualisation des datas en temps réel, c'est fait par une liste des données reçues mais non mises en forme, c'est bien sûr modifiable.

Hors ligne

#9 Le 24/01/2008, à 16:49

Guiss

Re : Modbus\linux\supervision

Salut

Merci de votre aide.

Je m'y connais tres peu en programmation mais je veux bien apprendre.

Je programme un peu sous Vb.net j'ai réaliser 2 ou  3 appli avec l'utilisation du port serie.

Je programme un peu les microcontroleur en électronique mais ca s'arrette la.

voila.

SI je veux programmer ma supervision, en faite schématiser les donnes que les automate envoi a mon serveur, par quoi dois je commencer?

Quel logiciel faut il?

Merci
jc

Hors ligne

#10 Le 26/01/2008, à 18:38

jmplinux

Re : Modbus\linux\supervision

Bonjour,

J'ai mis la main sur les sources, le binaire présent dans le dossier se lance sous Bubuntu 7.04 smile

Un petit MP pour voir ça ensemble cool

Jean Marc

Hors ligne

#11 Le 26/01/2008, à 18:53

Guiss

Re : Modbus\linux\supervision

Salut
email envoyer

merci
guiss

Hors ligne

#12 Le 29/01/2008, à 16:49

Guiss

Re : Modbus\linux\supervision

Salut
Il n'y a plus personne??

up????

Merci
guiss

Hors ligne

#13 Le 31/01/2008, à 18:22

Guiss

Re : Modbus\linux\supervision

up up

Hors ligne

#14 Le 31/01/2008, à 18:49

human enemy

Re : Modbus\linux\supervision

Guiss a écrit :

up up

je pensais que jmplinux t'avait envoyé un MP avec une solution complète ?

De mon coté je ne connais pas de solution toute faite, la seule chose que je puisse faire pour toi, c'est te donner mon unité modbus.c  écrite en C et qui utilise la GLib (bibliothèque à  la base de gtk+)

Je l'ai mise au point après des heures de recherches sur le net à  droite et à  gauche.

il faut adapter :

i/ la fonction callback de réception de la réponse de l'esclave "modbus_callback"

ii/ le port de COM "/dev/ttyS0" dans modbus_open

iii/ la vitesse de COM à  la ligne  newtio.c_cflag |= (B9600 | CLOCAL | CREAD); + la parité et le bit de stop
    les lignes qui suivent.
iv/ l'adresse de l'esclave en ligne  query[0] = 0x05;         5 dans mon cas

v/ le code fonction modbus que tu souhaites utilisé query[1] = 0x03;       code fonction 3 dans mon cas

etc ...     

modbus.c

#include <gtk/gtk.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <glib.h>
#include <stdlib.h>
#include <termios.h>
#include <strings.h>
#include <string.h>
#include "modbus.h"


unsigned int crc(guchar buf[], int start, int cnt);

/* beurk des globales !! */
struct termios oldtio;
int	iowatch = -1;


/* callback à  la réception de données */
gboolean modbus_callback(GIOChannel *ioch, GIOCondition cond, gpointer data)
{
  gsize bytes_read;
  guchar* buffer;
  atrium_data *donnees = data;

  buffer = g_malloc (4096);

  do
    {
      g_io_channel_read_chars(ioch,(gchar*) buffer,4096, &bytes_read, NULL);
      if (bytes_read)
        {
          donnees->electricite_courant=(buffer[5]*256+buffer[6]);
          donnees->electricite_courant/=1000;
          donnees->electricite_tension=(buffer[33]*256+buffer[34]);
          donnees->electricite_tension/=100;
          donnees->electricite_frequence=(buffer[45]*256+buffer[46]);
          donnees->electricite_frequence/=100;
          donnees->electricite_compteur=(buffer[181]*256+buffer[182]);
        }
    } while (bytes_read);

  g_free(buffer);

  return TRUE;
}



/* création d'un GIOChannel sur le port série */
gboolean modbus_open(gpointer data)
{
  atrium_data *donnees = data;
  struct termios newtio;

  /* On ouvre le périphérique du modem en lecture/écriture, et pas comme
     terminal de contrà´le, puisque nous ne voulons pas être terminé si l'on
     reçoit un caractère CTRL-C. */

  donnees->modbus_fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);  //
  if (donnees->modbus_fd == -1) return FALSE;

  fcntl(donnees->modbus_fd, F_SETFL, 0);

  tcgetattr(donnees->modbus_fd , &oldtio);  /* sauvagarde des parètres actuels du port */
  bzero(&newtio, sizeof(newtio));  /* on initialise la structure à  zéro */

  /* BAUDRATE: Affecte la vitesse. vous pouvez également utiliser cfsetispeed et cfsetospeed.
     CRTSCTS : contrà´le de flux matériel (uniquement utilisé si le cà¢ble a les lignes nécessaires. Voir la section 7 du Serial-HOWTO).
     CS8 : 8n1 (8 bits,sans parité, 1 bit d'arrêt)
     CLOCAL : connexion locale, pas de contrà´le par le modem
     CREAD : permet la réception des caractères
     IGNPAR : ignore les octets ayant une erreur de parité.
     ICRNL : transforme CR en NL (sinon un CR de l'autre cà´té de la ligne ne terminera pas l'entrée).
             sinon, utiliser l'entrée sans traitement (device en mode raw). */

  newtio.c_cflag |= (B9600 | CLOCAL | CREAD);
  newtio.c_cflag &= ~PARENB;
  newtio.c_cflag &= ~CSTOPB;
  newtio.c_cflag &= ~CSIZE;
  newtio.c_cflag |= CS8;


  /* initialise les caractères de contrà´le. les valeurs par défaut peuvent être trouvées dans /usr/include/termios.h,
     et sont données dans les commentaires. Elles sont inutiles ici. */
  newtio.c_cc[VTIME] = 1;
  newtio.c_cc[VMIN] = 0;


  /* à  présent, on vide la ligne du modem, et on active la configuration pour le port */
  tcflush(donnees->modbus_fd , TCIFLUSH);
  tcsetattr(donnees->modbus_fd , TCSANOW, &newtio);

  donnees->modbus_gioc = g_io_channel_unix_new(donnees->modbus_fd );

  if (g_io_channel_set_encoding(donnees->modbus_gioc, NULL, NULL)==G_IO_STATUS_NORMAL)
    {
      /* création d'un suivie */
      iowatch = g_io_add_watch(donnees->modbus_gioc, G_IO_IN, modbus_callback, donnees);
      return TRUE;
    }
  else
    {
      donnees->modbus_gioc = NULL;
      return FALSE;
    }
}

/* fermeture du GIOChannel du port série */
void modbus_close(gpointer data)
{
  atrium_data *donnees = data;

  /* restaure les anciens paramètres du port */
  tcsetattr(donnees->modbus_fd,TCSANOW,&oldtio);
  donnees->modbus_gioc = NULL;
  donnees->modbus_fd = 0;
}

/* envoi d'un message de lecture */
void modbus_read(gpointer data)
{
  atrium_data *donnees = data;
  gsize written;
  GError *error = NULL;
  guchar query[8];
  int offset = 0x300; // 768;
  int num_regs = 0x64; // 100;
  int bytes_required;
  unsigned int temp;
  unsigned char offset_hi;
  unsigned char offset_lo;
  unsigned char crc_hi;
  unsigned char crc_lo;
  unsigned char numreg_hi;
  unsigned char numreg_lo;

  /*  Initialise Variables   */

  //offset = offset - 1;             /* split offset into hi & lo bytes */
  offset_hi = offset >> 8;
  offset_lo = offset & 0x00FF;

  numreg_hi = num_regs >> 8;        /*split numregs int hi & lo bytes */
  numreg_lo = num_regs & 0x00FF;

  bytes_required = 5 + (num_regs * 2);    /* 5 bytes header plus two bytes per register read */


  /* péparation du message */
  query[0] = 0x05;        /* address */
  query[1] = 0x03;        /* function code to read holding register */
  query[2] = offset_hi;   /* base address of register table Hi byte */
  query[3] = offset_lo;   /* base address of register table lo byte */
  query[4] = numreg_hi;   /* num of registers to read hi byte       */
  query[5] = numreg_lo;   /* num of registers to read lo byte       */

  /* Calculate 16 bit CRC on query message */
  temp = crc(query,0,6);
  crc_hi = temp >> 8;
  crc_lo = temp & 0x00FF;

  query[6] = crc_hi;
  query[7] = crc_lo;
  query[8] = 0;

  /* ecriture du message pour envoi */
  g_io_channel_write_chars(donnees->modbus_gioc,(gchar*) query,(guint) sizeof(query), &written, &error);
  g_io_channel_flush(donnees->modbus_gioc, NULL);
}



/* calcul du crc */
unsigned int crc(guchar buf[], int start, int cnt)
{
	int 	i,j;
   unsigned temp, temp2, flag;

   temp=0xFFFF;

   for (i=start; i<cnt; i++){
   	temp=temp ^ buf[i];

      for (j=1; j<=8; j++){
      	flag=temp & 0x0001;
         temp=temp >> 1;
         if (flag) temp=temp ^ 0xA001;
         }
      }
   /*** Reverse byte order. ***/
   temp2=temp >> 8;
   temp= (temp << 8) | temp2;
   return(temp);
}

modbus.h

#ifndef MODBUS
#define MODBUS

gboolean modbus_callback(GIOChannel *ioch, GIOCondition cond, gpointer data);
gboolean modbus_open(gpointer data);
void modbus_close(gpointer data);
void modbus_read(gpointer data);



#endif

Dernière modification par human enemy (Le 31/01/2008, à 18:53)


<linux user>463160</linux user>
str = g_strdup_printf ("ubuntu user : %d",20328);

Hors ligne

#15 Le 31/01/2008, à 20:16

Guiss

Re : Modbus\linux\supervision

Salut

jmplinux m'a bien repondu. J'ai recu son Mp et je suis en relation avec.

Mais je suis toujours preneur d'autre solution qui sont exploitable.

Je recherche un logiciel qui me permettrai d'exploiter les info modbus de mes automates.

Un logiciel de supervision en fait.


Merci
guiss

Hors ligne

#16 Le 31/01/2008, à 20:47

human enemy

Re : Modbus\linux\supervision

oui oui j'avais bien compris ce que tu cherches tongue

mais çà  je ne connais pas sous nux


<linux user>463160</linux user>
str = g_strdup_printf ("ubuntu user : %d",20328);

Hors ligne

#17 Le 31/01/2008, à 21:20

Guiss

Re : Modbus\linux\supervision

et sous Windaube?

Hors ligne

#18 Le 08/02/2008, à 22:55

the-quoan

Re : Modbus\linux\supervision

moi par contre je suis a la recherche d'une lib pour modbuc/tcp ip mais pas a 298.00 $
quelqu'un a déjà  vu cela
merci

#19 Le 08/04/2008, à 17:26

baltos

Re : Modbus\linux\supervision

@the-quoan->libmodbus
Bonjour, je dois moi aussi faire un prog en c qui doit pouvoir dialoguer avec des automates en modbus par tcp/ip, mais pour l'instant, je rame:(
Si quelqu'un de chevroné pouvait expliquer l'utilisation et l'ordre des fonctions de libmodbus ça serait pas mal... Merci
@+

Dernière modification par baltos (Le 08/04/2008, à 17:31)

Hors ligne

#20 Le 20/04/2008, à 21:57

invite

Re : Modbus\linux\supervision

faire une recherche a lintouch sur google

#21 Le 22/04/2008, à 14:04

Guiss

Re : Modbus\linux\supervision

salut
ca a l'air pas mal le rimake de Intouch en gnu sous linux.
Je vais tester.
Mais comment ca ce passe pour les licence et quel protocole peut on utiliser avec lintouch? unitelway, modbus,...????

Dernière modification par Guiss (Le 22/04/2008, à 14:06)

Hors ligne

#22 Le 22/04/2008, à 19:29

Guiss

Re : Modbus\linux\supervision

salut
par contre je n'arrive pas a l'installer. je suis en 64 bit et c'est du 386.

comment faire??

merci

Hors ligne

#23 Le 02/12/2008, à 15:24

Le Maudit con

Re : Modbus\linux\supervision

Bonjour,

Cela dit c'est étonnant que tu n'aies pas pu substituer ton XBT.
Car ils ont prévu une substitution XBTL1000 -> VijeoDesigner
Et il y a aussi une substitution XBTL1000 -> Vijeo Designer Lite

Ici tu trouveras un lien vers les produits de la gamme (il y a en autres des PC qui tournent avec Vijeo Designer) et pour faire une IHM c'est quand même bien pratique.
http://www.schneider-electric.fr/telemecanique-offre-prod-M1400-R1433.html

Enfin bon c'est toi qui voit !