This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
sdk:scripts:modbus-tcp-rtu-gateway [2015/05/05 15:04] – external edit 127.0.0.1 | sdk: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 | + | /* DESC: This script |
- | * Copyright (C) 2015 NetModule AG, Switzerland | + | * Copyright (C) 2015-2016 NetModule AG, Switzerland |
*/ | */ | ||
- | + | DEVIDX | |
- | DEV = "SERIAL1"; | + | DEV |
- | TCP_IP | + | |
TCP_PORT | TCP_PORT | ||
+ | DEBUG = 0; | ||
+ | |||
+ | |||
/* check serial port config */ | /* check serial port config */ | ||
- | st = nb_config_get(" | + | st = nb_config_get(sprintf(" |
if (st != " | if (st != " | ||
- | nb_syslog(" | + | nb_syslog(" |
exit(1); | exit(1); | ||
} | } | ||
Line 18: | Line 20: | ||
/* set attributes */ | /* set attributes */ | ||
ret = nb_serial_setattr(DEV, | ret = nb_serial_setattr(DEV, | ||
- | |||
if (ret != 0) { | if (ret != 0) { | ||
- | | + | |
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) { | ||
- | | + | |
exit(1); | exit(1); | ||
} | } | ||
/* register serial_fd as modbus RTU */ | /* register serial_fd as modbus RTU */ | ||
- | nb_modbus_register(serial_fd, | + | if (nb_modbus_register(serial_fd, |
+ | close(serial_fd); | ||
+ | nb_syslog(" | ||
+ | exit(1); | ||
+ | } | ||
sock = socket(AF_INET, | sock = socket(AF_INET, | ||
if (sock < 0) { | if (sock < 0) { | ||
- | | + | |
+ | nb_syslog(" | ||
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(" | + | printf(" |
+ | close(serial_fd); | ||
close(sock); | close(sock); | ||
exit(1); | exit(1); | ||
Line 49: | Line 56: | ||
ret = listen(sock, | ret = listen(sock, | ||
if (ret == -1) { | if (ret == -1) { | ||
- | | + | |
+ | close(serial_fd); | ||
close(sock); | close(sock); | ||
exit(1); | exit(1); | ||
} | } | ||
+ | if (DEBUG == 1) { | ||
+ | nb_modbus_set_debug(serial_fd, | ||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | |||
+ | tcp_client = -1; | ||
+ | registered = 0; | ||
- | printf(" | ||
while (1) { | while (1) { | ||
- | tcp_client = accept(sock); | + | |
- | if (tcp_client < 0) { | + | |
- | | + | if (tcp_client < 0) { |
- | sleep(1); | + | |
- | continue; | + | sleep(1); |
+ | continue; | ||
+ | } else { | ||
+ | if (DEBUG == 1) { | ||
+ | nb_modbus_set_debug(tcp_client, | ||
+ | } | ||
+ | } | ||
} | } | ||
- | /* register | + | /* register |
- | if (nb_modbus_register(tcp_client, | + | |
- | | + | if (nb_modbus_register(tcp_client, |
- | close(tcp_client); | + | |
- | continue; | + | close(tcp_client); |
+ | continue; | ||
+ | } | ||
+ | | ||
} | } | ||
| | ||
- | /* wait for modbus | + | /* wait for a modbus |
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(" |
- | | + | nb_modbus_unregister(tcp_client); |
- | | + | close(tcp_client); |
- | | + | tcp_client = -1; |
- | if (response != NULL) { | + | registered = 0; |
- | | + | nb_syslog(" |
- | | + | } else { |
+ | /* extract payload and forward it to RTU */ | ||
+ | | ||
+ | if (is_void(payload)) { | ||
+ | | ||
} else { | } else { | ||
- | | + | |
+ | | ||
+ | if (ret > 0) { | ||
+ | nb_syslog(" | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | response = nb_modbus_send_raw(serial_fd, | ||
+ | if (is_void(response)) { | ||
+ | nb_syslog(" | ||
+ | } else { | ||
+ | /* extract payload and send response to modbus tcp */ | ||
+ | payload = nb_modbus_extract_payload(serial_fd, | ||
+ | if (is_void(payload)) { | ||
+ | nb_syslog(" | ||
+ | } else { | ||
+ | nb_modbus_reply_raw_response(tcp_client, | ||
+ | } | ||
+ | } | ||
} | } | ||
- | } else { | ||
- | printf(" | ||
} | } | ||
+ | } | ||
+ | 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); | ||
+ | |||
</ | </ | ||