Commit 732fb855 authored by Pavel Vainerman's avatar Pavel Vainerman

Добавил режим игнорирования адреса (только для MmodbusTCPServer-а).

Позволяет при помощи uniset-mbtcpserver-echo имитировать "шлюзы" (один ip и много rtu-адресов)
parent a4db3837
......@@ -20,6 +20,12 @@ class MBTCPServer
verbose = state;
}
inline void setIgnoreAddrMode( bool state )
{
if( sslot )
sslot->setIgnoreAddrMode(state);
}
void execute(); /*!< основной цикл работы */
void setLog( DebugStream& dlog );
......
......@@ -14,6 +14,7 @@ static struct option longopts[] = {
{ "verbose", no_argument, 0, 'v' },
{ "myaddr", required_argument, 0, 'a' },
{ "port", required_argument, 0, 'p' },
{ "ignore-addr", required_argument, 0, 'x' },
{ NULL, 0, 0, 0 }
};
// --------------------------------------------------------------------------
......@@ -24,6 +25,7 @@ static void print_help()
printf("[-v|--verbose] - Print all messages to stdout\n");
printf("[-i|--iaddr] ip - Server listen ip. Default 127.0.0.1\n");
printf("[-a|--myaddr] addr - Modbus address for master. Default: 0x01.\n");
printf("[-x|--ignore-addr] - Ignore modbus RTU-address.\n");
printf("[-p|--port] port - Server port. Default: 502.\n");
printf("[-v|--verbose] - Print all messages to stdout\n");
}
......@@ -38,12 +40,13 @@ int main( int argc, char **argv )
ModbusRTU::ModbusAddr myaddr = 0x01;
int tout = 2000;
DebugStream dlog;
bool ignoreAddr = false;
ost::Thread::setException(ost::Thread::throwException);
try
{
while( (opt = getopt_long(argc, argv, "ht:va:p:i:b",longopts,&optindex)) != -1 )
while( (opt = getopt_long(argc, argv, "ht:va:p:i:bx",longopts,&optindex)) != -1 )
{
switch (opt)
{
......@@ -71,6 +74,10 @@ int main( int argc, char **argv )
verb = 1;
break;
case 'x':
ignoreAddr = true;
break;
case '?':
default:
printf("? argumnet\n");
......@@ -91,6 +98,7 @@ int main( int argc, char **argv )
MBTCPServer mbs(myaddr,iaddr,port,verb);
mbs.setLog(dlog);
mbs.setVerbose(verb);
mbs.setIgnoreAddrMode(ignoreAddr);
mbs.execute();
}
catch( ModbusRTU::mbException& ex )
......
......@@ -25,6 +25,9 @@ class ModbusTCPServer:
virtual ModbusRTU::mbErrCode receive( ModbusRTU::ModbusAddr addr, timeout_t msecTimeout );
inline void setIgnoreAddrMode( bool st ){ ignoreAddr = st; }
inline bool getIgnoreAddrMode(){ return ignoreAddr; }
protected:
virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request );
......@@ -37,13 +40,14 @@ class ModbusTCPServer:
virtual ModbusRTU::mbErrCode tcp_processing( ost::TCPStream& tcp, ModbusTCP::MBAPHeader& mhead );
ost::tpport_t port;
ost::TCPStream tcp;
ost::InetAddress iaddr;
std::queue<unsigned char> qrecv;
ModbusTCP::MBAPHeader curQueryHeader;
bool ignoreAddr;
private:
};
......
......@@ -1242,7 +1242,6 @@ mbErrCode ModbusServer::send( ModbusMessage& msg )
return erHardwareError;
}
// Пауза, чтобы не ловить свою посылку
if( aftersend_msec >= 0 )
msleep(aftersend_msec);
......
......@@ -10,7 +10,8 @@ using namespace UniSetTypes;
// -------------------------------------------------------------------------
ModbusTCPServer::ModbusTCPServer( ost::InetAddress &ia, int port ):
TCPSocket(ia,port),
iaddr(ia)
iaddr(ia),
ignoreAddr(false)
{
setCRCNoCheckit(true);
}
......@@ -73,14 +74,19 @@ mbErrCode ModbusTCPServer::receive( ModbusRTU::ModbusAddr addr, timeout_t timeou
{
// check addr
unsigned char _addr = qrecv.front();
if( _addr != addr )
// для режима игнорирования RTU-адреса
// просто подменяем его на то который пришёл
// чтобы проверка всегда была успешной...
if( ignoreAddr )
addr = _addr;
else if( _addr != addr )
{
tmProcessing.setTiming(replyTimeout_ms);
ErrorRetMessage em( buf.addr, buf.func, erBadReplyNodeAddress );
buf = em.transport_msg();
send(buf);
printProcessingTime();
usleep(1000);
tcp.disconnect();
return res;
}
......@@ -97,8 +103,9 @@ mbErrCode ModbusTCPServer::receive( ModbusRTU::ModbusAddr addr, timeout_t timeou
send(buf);
printProcessingTime();
}
else if( aftersend_msec >= 0 )
msleep(aftersend_msec);
usleep(1000);
tcp.disconnect();
return res;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment