Compare commits

...

4 Commits

8 changed files with 72 additions and 53 deletions

View File

@ -54,19 +54,19 @@ Usage:
mbusd [-h] [-d] [-L logfile] [-v level] [-c cfgfile]
[-p device] [-s speed] [-m mode] [-S]
[-t] [-y sysfsfile] [-Y sysfsfile]
[-t] [-r] [-y sysfsfile] [-Y sysfsfile]
[-A address] [-P port] [-C maxconn] [-N retries]
[-R pause] [-W wait] [-T timeout]
[-R pause] [-W wait] [-T timeout] [-b]
-h Usage help.
-d Instruct mbusd not to fork itself (non-daemonize).
-L logfile
Specifies log file name ('-' for logging to STDOUT only, default is /var/log/mbusd.log).
Specifies log file name ('-' for logging to STDOUT only, relative path or bare filename
will be stored at /var/log, default is /var/log/mbusd.log).
-v level
Specifies log verbosity level (0 for errors only, 1 for warnings
and 2 for also information messages.) If mbusd was compiled in debug mode,
valid log levels are up to 9, where log levels above 2 forces
logging of information about additional internal events.
Specifies log verbosity level (0 for errors only, 1 for warnings and 2 for informational
messages also). If mbusd was compiled in debug mode, valid log levels are up to 9,
where log levels above 2 adds logging of information about additional internal events.
-c cfgfile
Read configuration from cfgfile.
-p device
@ -76,27 +76,28 @@ Usage:
-m mode
Specifies serial port mode (like 8N1).
-S Enable RS-485 support for given serial port device (Linux only)
-t Enable RTS RS-485 data direction control (if not disabled while compile).
-t Enable RTS RS-485 data direction control using RTS, active transmit.
-r Enable RTS RS-485 data direction control using RTS, active receive.
-y file
Enable RS-485 direction data direction control by writing '1' to file
for transmitter enable and '0' to file for transmitter disable
for transmitter enable and '0' to file for transmitter disable.
-Y file
Enable RS-485 direction data direction control by writing '0' to file
for transmitter enable and '1' to file for transmitter disable
for transmitter enable and '1' to file for transmitter disable.
-A address
Specifies TCP address to bind (default 0.0.0.0).
Specifies TCP server address to bind (default is 0.0.0.0).
-P port
Specifies TCP port number (default 502).
Specifies TCP server port number (default is 502).
-C maxconn
Specifies maximum number of simultaneous TCP connections.
Specifies maximum number of simultaneous TCP connections (default is 32).
-N retries
Specifies maximum number of request retries (0 disables retries).
Specifies maximum number of request retries (0 disables retries, default is 3).
-R pause
Specifies pause between requests in milliseconds.
Specifies pause between requests in milliseconds (default is 100ms).
-W wait
Specifies response wait time in milliseconds.
Specifies response wait time in milliseconds (default is 500ms).
-T timeout
Specifies connection timeout value in seconds (0 disables timeout).
Specifies connection timeout value in seconds (0 disables timeout, default is 60).
-b
Instructs mbusd to reply on a broadcast.

View File

@ -18,7 +18,7 @@ mode = 8n1
# Enable RS-485 support for given serial port device (Linux only)
# enable_rs485 = no
# RS-485 data direction control type (addc, rts, sysfs_0, sysfs_1)
# RS-485 data direction control type (addc, rts_0, rts/rts_1, sysfs_0, sysfs_1)
trx_control = addc
# Sysfs file to use to control data direction

View File

@ -18,6 +18,7 @@ mbusd \- MODBUS/TCP to MODBUS/RTU gateway.
.RB [ -m
.IR mode ]
.RB [ -t ]
.RB [ -r ]
.RB [ -y
.IR sysfsfile ]
.RB [ -Y
@ -67,13 +68,15 @@ Specifies TCP address to bind.
.IP "\fB-P \fIport\fR"
Specifies TCP port number.
.IP \fB-t\fR
Enable RTS RS-485 data direction control (if not disabled while compile).
Enable RTS RS-485 data direction control using RTS, active transmit.
.IP \fB-r\fR
Enable RTS RS-485 data direction control using RTS, active receive.
.IP "\fB-y \fIfile\fR"
Enable RS-485 direction data direction control by writing '1' to file
for transmitter enable and '0' to file for transmitter disable
for transmitter enable and '0' to file for transmitter disable.
.IP "\fB-Y \fIfile\fR"
Enable RS-485 direction data direction control by writing '0' to file
for transmitter enable and '1' to file for transmitter disable
for transmitter enable and '1' to file for transmitter disable.
.IP "\fB-C \fImaxconn\fR"
Specifies maximum number of simultaneous TCP connections.
.IP "\fB-N \fIretries\fR"

View File

@ -200,9 +200,13 @@ cfg_handle_param(char *name, char *value)
{
cfg.trxcntl = TRX_ADDC;
}
else if (CFG_VALUE_MATCH("rts"))
else if (CFG_VALUE_MATCH("rts") || CFG_VALUE_MATCH("rts_1"))
{
cfg.trxcntl = TRX_RTS;
cfg.trxcntl = TRX_RTS_1;
}
else if (CFG_VALUE_MATCH("rts_0"))
{
cfg.trxcntl = TRX_RTS_0;
}
else if (CFG_VALUE_MATCH("sysfs_0"))
{

View File

@ -251,7 +251,7 @@ conn_write(int d, void *buf, size_t nbytes, int istty)
#ifdef TRXCTL
if (istty && cfg.trxcntl != TRX_ADDC)
{
tty_set_rts(d);
tty_set_tx(d);
tty_delay(35000000l/cfg.ttyspeed);
}
#endif
@ -267,7 +267,7 @@ conn_write(int d, void *buf, size_t nbytes, int istty)
if (istty && cfg.trxcntl != TRX_ADDC )
{
tty_delay(DV(nbytes, tty.bpc, cfg.ttyspeed));
tty_clr_rts(d);
tty_set_rx(d);
}
#endif

View File

@ -113,7 +113,7 @@ usage(char *exename)
#endif
"\n"
#ifdef TRXCTL
" [-t] [-y sysfsfile] [-Y sysfsfile]\n"
" [-t] [-r] [-y sysfsfile] [-Y sysfsfile]\n"
#endif
" [-A address] [-P port] [-C maxconn] [-N retries]\n"
" [-R pause] [-W wait] [-T timeout] [-b]\n\n"
@ -121,38 +121,39 @@ usage(char *exename)
" -h : this help\n"
" -d : don't daemonize\n"
#ifdef LOG
" -L logfile : set log file name (default %s%s, \n"
" -L logfile : set log file name (default is %s%s, \n"
" '-' for logging to STDOUT only)\n"
#ifdef DEBUG
" -v level : set log level (0-9, default %d, 0 - errors only)\n"
" -v level : set log level (0-9, default is %d, 0 - errors only)\n"
#else
" -v level : set log level (0-2, default %d, 0 - errors only)\n"
#endif
#endif
" -c cfgfile : read configuration from cfgfile\n"
" -p device : set serial port device name (default %s)\n"
" -s speed : set serial port speed (default %d)\n"
" -m mode : set serial port mode (default %s)\n"
" -p device : set serial port device name (default is %s)\n"
" -s speed : set serial port speed (default is %d)\n"
" -m mode : set serial port mode (default is %s)\n"
#ifdef HAVE_TIOCRS485
" -S : enable Linux RS-485 support for given serial port device\n"
#endif
" -A address : set TCP server address to bind (default %s)\n"
" -P port : set TCP server port number (default %d)\n"
" -A address : set TCP server address to bind (default is %s)\n"
" -P port : set TCP server port number (default is %d)\n"
#ifdef TRXCTL
" -t : enable RTS RS-485 data direction control using RTS\n"
" -t : enable RTS RS-485 data direction control using RTS, active transmit\n"
" -r : enable RTS RS-485 data direction control using RTS, active receive\n"
" -y : enable RTS RS-485 data direction control using sysfs file, active transmit\n"
" -Y : enable RTS RS-485 data direction control using sysfs file, active receive\n"
#endif
" -C maxconn : set maximum number of simultaneous TCP connections\n"
" (1-%d, default %d)\n"
" (1-%d, default is %d)\n"
" -N retries : set maximum number of request retries\n"
" (0-%d, default %d, 0 - without retries)\n"
" (0-%d, default is %d, 0 disables retrying)\n"
" -R pause : set pause between requests in milliseconds\n"
" (1-%d, default %lu)\n"
" (1-%d, default is %lu)\n"
" -W wait : set response wait time in milliseconds\n"
" (1-%d, default %lu)\n"
" (1-%d, default is %lu)\n"
" -T timeout : set connection timeout value in seconds\n"
" (0-%d, default %d, 0 - no timeout)\n"
" (0-%d, default is %d, 0 disables timeout)\n"
" -b : enable reply on broadcast"
"\n", PACKAGE, VERSION, exename,
#ifdef LOG
@ -218,7 +219,10 @@ main(int argc, char *argv[])
break;
#ifdef TRXCTL
case 't':
cfg.trxcntl = TRX_RTS;
cfg.trxcntl = TRX_RTS_1;
break;
case 'r':
cfg.trxcntl = TRX_RTS_0;
break;
case 'y':
cfg.trxcntl = TRX_SYSFS_1;

View File

@ -189,7 +189,7 @@ tty_set_attr(ttydata_t *mod)
return RC_ERR;
tcflush(mod->fd, TCIOFLUSH);
#ifdef TRXCTL
tty_clr_rts(mod->fd);
tty_set_rx(mod->fd);
#endif
#ifdef HAVE_TIOCRS485
if (mod->rs485)
@ -465,27 +465,33 @@ void sysfs_gpio_set(char *filename, char *value) {
}
/* Set RTS line to active state */
/* Set tty device into transmit mode */
void
tty_set_rts(int fd)
tty_set_tx(int fd)
{
if ( TRX_RTS == cfg.trxcntl ) {
if ( TRX_RTS_1 == cfg.trxcntl ) {
int mstat = TIOCM_RTS;
ioctl(fd, TIOCMBIS, &mstat);
} else if ( TRX_SYSFS_1 == cfg.trxcntl) {
} else if ( TRX_RTS_0 == cfg.trxcntl ) {
int mstat = TIOCM_RTS;
ioctl(fd, TIOCMBIC, &mstat);
} else if ( TRX_SYSFS_1 == cfg.trxcntl) {
sysfs_gpio_set(cfg.trxcntl_file,"1");
} else if ( TRX_SYSFS_0 == cfg.trxcntl) {
sysfs_gpio_set(cfg.trxcntl_file,"0");
}
}
/* Set RTS line to passive state */
/* Set tty device into receive mode */
void
tty_clr_rts(int fd)
tty_set_rx(int fd)
{
if ( TRX_RTS == cfg.trxcntl ) {
if ( TRX_RTS_1 == cfg.trxcntl ) {
int mstat = TIOCM_RTS;
ioctl(fd, TIOCMBIC, &mstat);
} else if ( TRX_RTS_0 == cfg.trxcntl ) {
int mstat = TIOCM_RTS;
ioctl(fd, TIOCMBIS, &mstat);
} else if ( TRX_SYSFS_1 == cfg.trxcntl) {
sysfs_gpio_set(cfg.trxcntl_file,"0");
} else if ( TRX_SYSFS_0 == cfg.trxcntl) {

View File

@ -77,9 +77,10 @@
*/
#ifdef TRXCTL
#define TRX_ADDC 0
#define TRX_RTS 1
#define TRX_SYSFS_1 2
#define TRX_SYSFS_0 3
#define TRX_RTS_1 1
#define TRX_RTS_0 2
#define TRX_SYSFS_1 3
#define TRX_SYSFS_0 4
#endif
/*
@ -127,8 +128,8 @@ int tty_set_attr(ttydata_t *mod);
speed_t tty_transpeed(int speed);
int tty_cooked(ttydata_t *mod);
int tty_close(ttydata_t *mod);
void tty_set_rts(int fd);
void tty_clr_rts(int fd);
void tty_set_tx(int fd);
void tty_set_rx(int fd);
void tty_delay(int usec);
#endif /* _TTY_H */