Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
sdk:scripts:modbus-tcp-rtu-gateway [2015/05/05 15:04] – external edit 127.0.0.1sdk:scripts:modbus-tcp-rtu-gateway [2022/11/08 07:48] (current) klueppel
Line 1: Line 1:
 ====== SDK Script modbus-tcp-rtu-gateway.are ====== ====== SDK Script modbus-tcp-rtu-gateway.are ======
 <code c modbus-tcp-rtu-gateway.are> <code c modbus-tcp-rtu-gateway.are>
-/* DESC: This script can be used to read messages from the serial port. +/* DESC: This script implements a Modbus TCP RTU gateway 
- * Copyright (C) 2015 NetModule AG, Switzerland+ * Copyright (C) 2015-2016 NetModule AG, Switzerland
  */  */
- +DEVIDX      = 0; 
-DEV         = "SERIAL1"+DEV         sprintf("SERIAL%d", (DEVIDX + 1));
-TCP_IP      = "192.168.1.1";+
 TCP_PORT    = 1502; TCP_PORT    = 1502;
 +DEBUG       = 0;
 +
 +
  
 /* check serial port config */ /* check serial port config */
-st = nb_config_get("serial.0.status");+st = nb_config_get(sprintf("serial.%d.status", DEVIDX));
 if (st != "2") { if (st != "2") {
-    nb_syslog("Serial port is not enabled for us");+    nb_syslog("%s is not enabled for us", DEV);
     exit(1);     exit(1);
 } }
Line 18: Line 20:
 /* set attributes */ /* set attributes */
 ret = nb_serial_setattr(DEV, 115200, 8, 1, 0, 0); ret = nb_serial_setattr(DEV, 115200, 8, 1, 0, 0);
- 
 if (ret != 0) { if (ret != 0) {
-    printf("Could not set serial attributes: %i \n",ret);+    nb_syslog("Could not set serial attributes: %d", ret);
     exit(1);     exit(1);
 } }
Line 27: Line 28:
 serial_fd = nb_serial_open(DEV); serial_fd = nb_serial_open(DEV);
 if (serial_fd < 0) { if (serial_fd < 0) {
-    printf("Unable to open %s\n", DEV);+    nb_syslog("Unable to open %s", DEV);
     exit(1);     exit(1);
 } }
  
 /* register serial_fd as modbus RTU */ /* register serial_fd as modbus RTU */
-nb_modbus_register(serial_fd, MODBUS_TYPE_RTU);+if (nb_modbus_register(serial_fd, MODBUS_TYPE_RTU) != 0) { 
 +    close(serial_fd); 
 +    nb_syslog("Unable to register as modbus RTU (%s)", nb_modbus_last_error()); 
 +    exit(1); 
 +}
  
 sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if (sock < 0) { if (sock < 0) {
-    printf("Unable to open socket\n");+    close(serial_fd); 
 +    nb_syslog("Unable to open TCP socket");
     exit(1);     exit(1);
 } }
Line 42: Line 48:
 ret = bind(sock, TCP_PORT, ""); ret = bind(sock, TCP_PORT, "");
 if (ret == -1) { if (ret == -1) {
-    printf("Unable to bind port %d\n", port);+    printf("Unable to bind TCP socket to port %d", TCP_PORT); 
 +    close(serial_fd);
     close(sock);     close(sock);
     exit(1);     exit(1);
Line 49: Line 56:
 ret = listen(sock, 1); ret = listen(sock, 1);
 if (ret == -1) { if (ret == -1) {
-    printf("Unable to listen\n");+    nb_syslog("Unable to listen on TCP socket: %d", ret); 
 +    close(serial_fd);
     close(sock);     close(sock);
     exit(1);     exit(1);
 } }
 +if (DEBUG == 1) {
 +    nb_modbus_set_debug(serial_fd, true); 
 +}    
 +printf("Listening for connections on port %d\n", TCP_PORT);
 +
 +
 +tcp_client = -1;
 +registered = 0;
  
-printf("Listening for connections on port %d\n", port); 
  
 while (1) { while (1) {
-    tcp_client = accept(sock); +    if (tcp_client == -1) { 
-    if (tcp_client < 0) { +        tcp_client = accept(sock); 
-        printf("accept failed\n"); +        if (tcp_client < 0) { 
-        sleep(1); +            nb_syslog("Unable to accept new connection"); 
-        continue;+            sleep(1); 
 +            continue; 
 +        } else { 
 +            if (DEBUG == 1) { 
 +                nb_modbus_set_debug(tcp_client, true); 
 +            } 
 +        }
     }     }
  
-    /* register serial_fd as modbus TCP */  +    /* register client as modbus TCP */  
-    if (nb_modbus_register(tcp_client, MODBUS_TYPE_TCP)) { +    if (registered == 0) { 
-        printf("Unable to register client (%s)\n", nb_modbus_last_error()); +       if (nb_modbus_register(tcp_client, MODBUS_TYPE_TCP)) { 
-        close(tcp_client); +            nb_syslog("Unable to register client (%s)", nb_modbus_last_error()); 
-        continue;+            close(tcp_client); 
 +            continue
 +       } 
 +       registered = 1;
     }     }
          
-    /* wait for modbus tcp request */+    /* wait for modbus TCP request */
     request = nb_modbus_receive(tcp_client);         request = nb_modbus_receive(tcp_client);    
    
-    if (!is_void(request)) { +    if (is_void(request)) 
-        /* extract payload and forward it to modbus rtu serial_fd */ +        nb_syslog("Unable to receive modbus request (%s)", nb_modbus_last_error()); 
-        response nb_modbus_send_raw(serial_fd,  +        nb_modbus_unregister(tcp_client); 
-                                      nb_modbus_extract_payload(tcp_client,  +        close(tcp_client); 
-                                      request)); +        tcp_client = -1; 
-        if (response != NULL) { +        registered = 0; 
-            /* extract payload and send response to modbus tcp */ +        nb_syslog("Disconnected client"); 
-             nb_modbus_reply_raw_response(tcp_clientrequest, nb_modbus_extract_payload(serial_fd, response));+    } else 
 +        /* extract payload and forward it to RTU */ 
 +        payload = nb_modbus_extract_payload(tcp_client, request); 
 +        if (is_void(payload)) { 
 +            nb_syslog("Unable to extract payload (%s)"nb_modbus_last_error());
         } else {         } else {
-            printf("Unable to send response (%s)\n",  nb_modbus_last_error());+            /* Modbus TCP - RTU must set the slave id */     
 +            ret = nb_modbus_set_slave (serial_fd, payload[0]); 
 +            if (ret > 0) { 
 +                nb_syslog("Unable to set modbus slave id"); 
 +                break; 
 +            } 
 + 
 +            response = nb_modbus_send_raw(serial_fd, payload); 
 +            if (is_void(response)) { 
 +                nb_syslog("Unable to send modbus response (%s)", nb_modbus_last_error()); 
 +            } else { 
 +                /* extract payload and send response to modbus tcp */ 
 +                payload = nb_modbus_extract_payload(serial_fd, response); 
 +                if (is_void(payload)) { 
 +                    nb_syslog("Unable to extract payload (%s)", nb_modbus_last_error()); 
 +                } else { 
 +                    nb_modbus_reply_raw_response(tcp_client, request, payload); 
 +                } 
 +            }
         }         }
-    } else { 
-        printf("Unable to receive request (%s)\n",  nb_modbus_last_error()); 
     }     }
 +}
  
 +if (tcp_client > -1) {
 +    if (registered) {
 +        nb_modbus_unregister(tcp_client);
 +    }
 +    close(tcp_client);
 } }
  
 nb_modbus_unregister(serial_fd); nb_modbus_unregister(serial_fd);
-nb_modbus_unregister(tcp_client); 
 close(serial_fd); close(serial_fd);
-close(tcp_client); 
 exit(0); exit(0);
 +
 </code> </code>