Commit f7913a5f authored by Pavel Vainerman's avatar Pavel Vainerman

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

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