Commit f7913a5f authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusTCP): Исправил ошибку обработки несуществующего адреса в ModbusTCPSlave

(в соответствии со стандартом ответ посылаться не должен). Так же исправил "сильную загрузку процессора" при длительном ожидании заголовка.
parent 1ebee8f9
......@@ -3,7 +3,7 @@
Name: libuniset
Version: 1.0
Release: alt26
Release: alt27
Summary: UniSet - library for building distributed industrial control systems
License: GPL
Group: Development/C++
......@@ -191,6 +191,9 @@ rm -f %buildroot%_libdir/*.la
%exclude %_pkgconfigdir/libUniSet.pc
%changelog
* Wed May 04 2011 Pavel Vainerman <pv@altlinux.ru> 1.0-alt27
- fixed bug in ModbusTCPMaster and ModbusTCPServer
* Wed May 04 2011 Pavel Vainerman <pv@altlinux.ru> 1.0-alt26
- minor fixes
......
......@@ -3,7 +3,7 @@
# See doc: http://www.gnu.org/software/hello/manual/autoconf/Generic-Programs.html
# AC_PREREQ(2.59)
AC_INIT([uniset], [1.1.0], pv@etersoft.ru)
AC_INIT([uniset], [1.2.0], pv@etersoft.ru)
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME,AC_PACKAGE_VERSION)
# AC_CONFIG_MACRO_DIR([m4])
......@@ -30,7 +30,7 @@ AC_ENABLE_SHARED(yes)
AC_ENABLE_STATIC(no)
AM_PROG_LIBTOOL
LIBVER=1:1:0
LIBVER=1:2:0
AC_SUBST(LIBVER)
# Checks for libraries.
......
......@@ -288,11 +288,13 @@ mbErrCode ModbusClient::recv( ModbusAddr addr, ModbusByte qfunc,
while( !tmAbort.checkTime() )
{
bcnt = getNextData((unsigned char*)(&rbuf),sizeof(ModbusAddr));
if( bcnt!=0 && ( rbuf.addr==addr ) ) // || (onBroadcast && rbuf.addr==BroadcastAddr) ) )
if( bcnt>0 && ( rbuf.addr==addr ) ) // || (onBroadcast && rbuf.addr==BroadcastAddr) ) )
{
begin = true;
break;
}
usleep(100);
}
if( !begin )
......
......@@ -472,6 +472,8 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t
begin = true;
break;
}
usleep(100);
}
if( !begin )
......
......@@ -17,6 +17,11 @@ iaddr(""),
force_disconnect(true)
{
setCRCNoCheckit(true);
/*
dlog.addLevel(Debug::INFO);
dlog.addLevel(Debug::WARN);
dlog.addLevel(Debug::CRIT);
*/
}
// -------------------------------------------------------------------------
......@@ -172,7 +177,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
disconnect();
return erTimeOut; // return erHardwareError;
}
rmh.swapdata();
if( rmh.tID != mh.tID )
......@@ -187,8 +192,9 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
}
//
// return recv(addr,msg.func,reply,timeout);
mbErrCode res = recv(addr,msg.func,reply,timeout);
// timeout = ptTimeout.getLeft(timeout);
// в tcp ответе задержек уже не должно быть..
mbErrCode res = recv(addr,msg.func,reply,1); //timeout);
if( force_disconnect )
{
......@@ -235,6 +241,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
catch( std::exception& e )
{
dlog[Debug::CRIT] << "(query): " << e.what() << std::endl;
return erTimeOut;
}
catch(...)
{
......@@ -268,7 +275,7 @@ void ModbusTCPMaster::reconnect()
tcp = 0;
}
ost::Thread::setException(ost::Thread::throwException);
// ost::Thread::setException(ost::Thread::throwException);
try
{
......
......@@ -83,23 +83,30 @@ mbErrCode ModbusTCPServer::receive( ModbusRTU::ModbusAddr addr, timeout_t timeou
addr = _addr;
else if( _addr != addr )
{
res = erTimeOut;
// На такие запросы просто не отвечаем...
/*
res = erBadReplyNodeAddress;
tmProcessing.setTiming(replyTimeout_ms);
ErrorRetMessage em( buf.addr, buf.func, erBadReplyNodeAddress );
ErrorRetMessage em( _addr, buf.func, res );
buf = em.transport_msg();
send(buf);
printProcessingTime();
if( aftersend_msec >= 0 )
msleep(aftersend_msec);
*/
tcp.disconnect();
return res;
}
}
res = recv( addr, buf, timeout );
if( res!=erNoError ) // && res!=erBadReplyNodeAddress )
{
if( res < erInternalErrorCode )
{
ErrorRetMessage em( buf.addr, buf.func, res );
ErrorRetMessage em( addr, buf.func, res );
buf = em.transport_msg();
send(buf);
printProcessingTime();
......
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