Commit e48f66e0bab114efdcaaeec3c0e6a0f45e9f4ee0

Authored by Stéphane Raimbault
1 parent 512e857d

Patch from Dirk Reusch to change the port number at init in TCP.

include/modbus/modbus.h
@@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
23 #include <termios.h> 23 #include <termios.h>
24 #include <arpa/inet.h> 24 #include <arpa/inet.h>
25 25
26 -#define MODBUS_TCP_PORT 502 26 +#define MODBUS_TCP_DEFAULT_PORT 502
27 27
28 #define HEADER_LENGTH_RTU 0 28 #define HEADER_LENGTH_RTU 0
29 #define PRESET_QUERY_SIZE_RTU 6 29 #define PRESET_QUERY_SIZE_RTU 6
@@ -130,6 +130,8 @@ typedef struct { @@ -130,6 +130,8 @@ typedef struct {
130 int debug; 130 int debug;
131 /* IP address */ 131 /* IP address */
132 char ip[16]; 132 char ip[16];
  133 + /* TCP port */
  134 + uint16_t port;
133 /* Header length used for offset */ 135 /* Header length used for offset */
134 int header_length; 136 int header_length;
135 /* Checksum size RTU = 2 and TCP = 0 */ 137 /* Checksum size RTU = 2 and TCP = 0 */
@@ -203,10 +205,17 @@ int report_slave_id(modbus_param_t *mb_param, int slave, @@ -203,10 +205,17 @@ int report_slave_id(modbus_param_t *mb_param, int slave,
203 void modbus_init_rtu(modbus_param_t *mb_param, char *device, 205 void modbus_init_rtu(modbus_param_t *mb_param, char *device,
204 int baud, char *parity, int data_bit, 206 int baud, char *parity, int data_bit,
205 int stop_bit); 207 int stop_bit);
  208 +
206 /* Initialises a parameters structure for TCP 209 /* Initialises a parameters structure for TCP
207 - - ip : "192.168.0.5" */  
208 -void modbus_init_tcp(modbus_param_t *mb_param, char *ip_address); 210 + - ip : "192.168.0.5"
  211 + - port : 1099
209 212
  213 + Set the port to MODBUS_TCP_DEFAULT_PORT to use the default one
  214 + (502). It's convenient to use a port number greater than or equal
  215 + to 1024 because it's not necessary to be root to use this port
  216 + number.
  217 +*/
  218 +void modbus_init_tcp(modbus_param_t *mb_param, char *ip_address, uint16_t port);
210 219
211 /* Sets up a serial port for RTU communications to modbus or a TCP 220 /* Sets up a serial port for RTU communications to modbus or a TCP
212 connexion */ 221 connexion */
src/modbus.c
@@ -1151,11 +1151,18 @@ void modbus_init_rtu(modbus_param_t *mb_param, char *device, @@ -1151,11 +1151,18 @@ void modbus_init_rtu(modbus_param_t *mb_param, char *device,
1151 mb_param->checksum_size = CHECKSUM_SIZE_RTU; 1151 mb_param->checksum_size = CHECKSUM_SIZE_RTU;
1152 } 1152 }
1153 1153
1154 -/* Initialises the modbus_param_t structure for TCP */  
1155 -void modbus_init_tcp(modbus_param_t *mb_param, char *ip) 1154 +/* Initialises the modbus_param_t structure for TCP.
  1155 +
  1156 + Set the port to MODBUS_TCP_DEFAULT_PORT to use the default one
  1157 + (502). It's convenient to use a port number greater than or equal
  1158 + to 1024 because it's not necessary to be root to use this port
  1159 + number.
  1160 +*/
  1161 +void modbus_init_tcp(modbus_param_t *mb_param, char *ip, uint16_t port)
1156 { 1162 {
1157 memset(mb_param, 0, sizeof(modbus_param_t)); 1163 memset(mb_param, 0, sizeof(modbus_param_t));
1158 strncpy(mb_param->ip, ip, sizeof(char)*16); 1164 strncpy(mb_param->ip, ip, sizeof(char)*16);
  1165 + mb_param->port = port;
1159 mb_param->type_com = TCP; 1166 mb_param->type_com = TCP;
1160 mb_param->header_length = HEADER_LENGTH_TCP; 1167 mb_param->header_length = HEADER_LENGTH_TCP;
1161 mb_param->checksum_size = CHECKSUM_SIZE_TCP; 1168 mb_param->checksum_size = CHECKSUM_SIZE_TCP;
@@ -1423,7 +1430,7 @@ static int modbus_connect_tcp(modbus_param_t *mb_param) @@ -1423,7 +1430,7 @@ static int modbus_connect_tcp(modbus_param_t *mb_param)
1423 struct sockaddr_in addr; 1430 struct sockaddr_in addr;
1424 1431
1425 addr.sin_family = AF_INET; 1432 addr.sin_family = AF_INET;
1426 - addr.sin_port = htons(MODBUS_TCP_PORT); 1433 + addr.sin_port = htons(mb_param->port);
1427 addr.sin_addr.s_addr = inet_addr(mb_param->ip); 1434 addr.sin_addr.s_addr = inet_addr(mb_param->ip);
1428 1435
1429 mb_param->fd = socket(AF_INET, SOCK_STREAM, 0); 1436 mb_param->fd = socket(AF_INET, SOCK_STREAM, 0);
@@ -1544,9 +1551,8 @@ int modbus_init_listen_tcp(modbus_param_t *mb_param) @@ -1544,9 +1551,8 @@ int modbus_init_listen_tcp(modbus_param_t *mb_param)
1544 socklen_t addrlen; 1551 socklen_t addrlen;
1545 1552
1546 addr.sin_family = AF_INET; 1553 addr.sin_family = AF_INET;
1547 - /* The modbus port is < 1024  
1548 - This program must be made setuid root. */  
1549 - addr.sin_port = htons(MODBUS_TCP_PORT); 1554 + /* If the modbus port is < to 1024, we need the setuid root. */
  1555 + addr.sin_port = htons(mb_param->port);
1550 addr.sin_addr.s_addr = INADDR_ANY; 1556 addr.sin_addr.s_addr = INADDR_ANY;
1551 memset(&(addr.sin_zero), '\0', 8); 1557 memset(&(addr.sin_zero), '\0', 8);
1552 1558
src/test-modbus-master.c
@@ -45,7 +45,7 @@ int main(void) @@ -45,7 +45,7 @@ int main(void)
45 /* modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, "none", 8, 1); */ 45 /* modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, "none", 8, 1); */
46 46
47 /* TCP */ 47 /* TCP */
48 - modbus_init_tcp(&mb_param, "169.254.7.104"); 48 + modbus_init_tcp(&mb_param, "127.0.0.1", 1502);
49 modbus_set_debug(&mb_param, TRUE); 49 modbus_set_debug(&mb_param, TRUE);
50 50
51 modbus_connect(&mb_param); 51 modbus_connect(&mb_param);
src/test-modbus-slave.c
@@ -36,11 +36,12 @@ int main(void) @@ -36,11 +36,12 @@ int main(void)
36 int ret; 36 int ret;
37 int i; 37 int i;
38 38
39 - modbus_init_tcp(&mb_param, "127.0.0.1"); 39 + modbus_init_tcp(&mb_param, "127.0.0.1", 1502);
40 modbus_set_debug(&mb_param, TRUE); 40 modbus_set_debug(&mb_param, TRUE);
41 41
42 modbus_mapping_new(&mb_mapping, 42 modbus_mapping_new(&mb_mapping,
43 - nb_coil_status, nb_input_status, nb_input_registers, nb_holding_registers); 43 + nb_coil_status, nb_input_status,
  44 + nb_input_registers, nb_holding_registers);
44 45
45 /* Examples from PI_MODBUS_300.pdf */ 46 /* Examples from PI_MODBUS_300.pdf */
46 47