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 17/01/2017, à 10:40

BenjiBoy

Mini programme C gateway

Bonjour à tous,

alors dans la série des choses bizarres que j'essaie de développer, celle-là est pas mal.
Contexte :

J'ai un modem 3G industriel sur lequel est branché un convertisseur USB - DB9 (série), lui-même étant branché sur une petite carte modbus, laquelle communique et récupère les informations d'un régulateur solaire.

Le but est de communiquer avec le régulateur solaire en modbus en passant par tout ça.

Sur le modem, j'ai la possibilité de faire tourner des scripts en SDK, language industriel dérivé du C, si j'ai bien compris.
Je ne parle pas du tout ce language et j'ai repris un script présent sur le wiki du fabricant du modem, le volà :

   
/* DESC: This script can be used to read messages from the serial port.
     * Copyright (C) 2015 NetModule AG, Switzerland
     */
     
    DEV         = "SERIAL2 (USB)";
    TCP_IP      = "192.168.1.1";
    TCP_PORT    = 1502;
     
    /* check serial port config */
    st = nb_config_get("serial.1.status");
    if (st != "2") {
        printf("Serial port is not enabled for us");
        exit(1);
    }
     
    /* set attributes */
    ret = nb_serial_setattr(DEV, 9600, 8, 1, 0, 0);
     
    if (ret != 0) {
        printf("Could not set serial attributes: %i \n",ret);
        exit(1);
    }
     
    /* open serial port */
    serial_fd = nb_serial_open(DEV);
    if (serial_fd < 0) {
        printf("Unable to open %s\n", DEV);
        exit(1);
    }
     
    /* register serial_fd as modbus RTU */
    nb_modbus_register(serial_fd, MODBUS_TYPE_RTU);
     
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock < 0) {
        printf("Unable to open socket\n");
        exit(1);
    }
     
    ret = bind(sock, TCP_PORT, "");
    if (ret == -1) {
        printf("Unable to bind port %d\n", port);
        close(sock);
        exit(1);
    }
     
    ret = listen(sock, 1);
    if (ret == -1) {
        printf("Unable to listen\n");
        close(sock);
        exit(1);
    }
     
    printf("Listening for connections on port %d\n", port);
     
    while (1) {
        tcp_client = accept(sock);
        if (tcp_client < 0) {
            printf("accept failed\n");
            sleep(1);
            continue;
        }
     
        /* register serial_fd as modbus TCP */ 
        if (nb_modbus_register(tcp_client, MODBUS_TYPE_TCP)) {
            printf("Unable to register client (%s)\n", nb_modbus_last_error());
            close(tcp_client);
            continue;
        }
     
        /* wait for modbus tcp request */
        request = nb_modbus_receive(tcp_client); 
		
     
        if (!is_void(request)) {
            /* extract payload and forward it to modbus rtu serial_fd */
            response = nb_modbus_send_raw(serial_fd, 
                                          nb_modbus_extract_payload(tcp_client, 
                                          request));
            if (response != NULL) {
                /* extract payload and send response to modbus tcp */
                 nb_modbus_reply_raw_response(tcp_client, request, nb_modbus_extract_payload(serial_fd, response));
            } else {
                printf("Unable to send response (%s)\n",  nb_modbus_last_error());
            }
        } else {
            printf("Unable to receive request (%s)\n",  nb_modbus_last_error());
        }
     
    }
     
    nb_modbus_unregister(serial_fd);
    nb_modbus_unregister(tcp_client);
    close(serial_fd);
    close(tcp_client);
    exit(0);

Ca marche presque parce que sur l'interface du modem j'ai un affichage console qui détecte quand j'essaie de me connecter au modem, mais j'ai comme réponse : "Unable to receive (connexion rest by peer)" puis "Unable to send response (connexion timed out)". Ce qui laisse penser que les redirections sont les bonnes mais il doit manquer un délai de temps de réponse ou je sais pas quoi qui m'empêche d'aboutir.

Avez-vous des idées, ou bien des questions pour aider à avoir des idées ?

Merci beaucoup, toute aide est la bienvenue...

Hors ligne

#2 Le 17/01/2017, à 19:36

Brunod

Re : Mini programme C gateway

La configuration de la connexion série est bien correcte ? vitesse, nb bits, stopbit... ?


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#3 Le 18/01/2017, à 07:53

BenjiBoy

Re : Mini programme C gateway

Oui tout à fait, 9600b, 8bit, pas de parité, pas de contrôle des flux, 1 bit d'arrêt.

Hors ligne

#4 Le 18/01/2017, à 11:59

Brunod

Re : Mini programme C gateway

Sans certitude, j'essaierai tout de même de descendre à 2400... puis monter progressivement. J'ai eu un problème similaire avec un routeur dont la vitesse n'était pas celle annoncée.


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#5 Le 19/01/2017, à 08:51

BenjiBoy

Re : Mini programme C gateway

Salut,

merci de ta réponse.
Je suis pas très convaincu (comme toi en fait wink, l'appareil fonctionnant déjà avec d'autres périphériques en 9600 bauds, ceci dit le fabricant ne me réponds toujours pas donc j'essaie quand même !
Et vu la réponse que j'obtiens sur la console c'est pas non plus complètement idiot !

a+

Hors ligne

#6 Le 19/01/2017, à 15:34

BenjiBoy

Re : Mini programme C gateway

Ben non ... Comme je le craignais, pas une histoire de vitesse de bauds ....
Le fabricant m'a répondu et a corrigé mon programme (correction minime) genre sur un printf il appel une variable "port" qui n'existait pas du coup ça affiche la bonne valeur de port, mais ça marche pas mieux ...

Hors ligne

#7 Le 19/01/2017, à 19:23

Brunod

Re : Mini programme C gateway

hmm Je passe ...


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne