Commit b410c1e4 authored by Pavel Vaynerman's avatar Pavel Vaynerman

MBSlave optimization

parent 15fb591c
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
Name: libuniset Name: libuniset
Version: 0.99 Version: 0.99
Release: eter5 Release: eter6
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++
...@@ -184,6 +184,9 @@ rm -f %buildroot%_libdir/*.la ...@@ -184,6 +184,9 @@ rm -f %buildroot%_libdir/*.la
%exclude %_pkgconfigdir/libUniSet.pc %exclude %_pkgconfigdir/libUniSet.pc
%changelog %changelog
* Tue Sep 28 2010 Pavel Vainerman <pv@etersoft.ru> 0.99-eter5
- MBSlave (RTU|TCP) optimization
* Mon Sep 20 2010 Ilya Shpigor <elly@altlinux.org> 0.99-eter4 * Mon Sep 20 2010 Ilya Shpigor <elly@altlinux.org> 0.99-eter4
- new build 0.99-eter4 - new build 0.99-eter4
......
...@@ -850,8 +850,6 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage& ...@@ -850,8 +850,6 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage&
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(readOutputRegisters): " << query << endl; dlog[Debug::INFO] << myname << "(readOutputRegisters): " << query << endl;
try
{
if( query.count <= 1 ) if( query.count <= 1 )
{ {
ModbusRTU::ModbusData d = 0; ModbusRTU::ModbusData d = 0;
...@@ -860,60 +858,18 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage& ...@@ -860,60 +858,18 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage&
reply.addData(d); reply.addData(d);
else else
reply.addData(0); reply.addData(0);
pingOK = true;
return ret; return ret;
} }
// Фомирование ответа: // Фомирование ответа:
int num=0; // добавленное количество данных ModbusRTU::mbErrCode ret = much_real_read(query.start,buf,query.count);
ModbusRTU::ModbusData d = 0;
ModbusRTU::ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
{
ModbusRTU::mbErrCode ret = real_read(reg,d);
if( ret == ModbusRTU::erNoError ) if( ret == ModbusRTU::erNoError )
reply.addData(d);
else
reply.addData(0);
}
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count )
{ {
dlog[Debug::WARN] << myname for( int i=0; i<query.count; i++ )
<< "(readInputRegisters): query.count=" << (int)query.count reply.addData( buf[i] );
<< " > reply.count=" << reply.count << endl;
}
pingOK = true;
return ModbusRTU::erNoError;
}
catch( UniSetTypes::NameNotFound& ex )
{
dlog[Debug::WARN] << myname << "(readOutputRegisters): " << ex << endl;
return ModbusRTU::erBadDataAddress;
}
catch( Exception& ex )
{
if( pingOK )
dlog[Debug::CRIT] << myname << "(readOutputRegisters): " << ex << endl;
}
catch( CORBA::SystemException& ex )
{
if( pingOK )
dlog[Debug::CRIT] << myname << "(readOutputRegisters): СORBA::SystemException: "
<< ex.NP_minorString() << endl;
}
catch(...)
{
if( pingOK )
dlog[Debug::CRIT] << myname << "(readOutputRegisters): catch ..." << endl;
} }
pingOK = false; return ret;
return ModbusRTU::erTimeOut;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
...@@ -923,26 +879,12 @@ ModbusRTU::mbErrCode MBSlave::writeOutputRegisters( ModbusRTU::WriteOutputMessag ...@@ -923,26 +879,12 @@ ModbusRTU::mbErrCode MBSlave::writeOutputRegisters( ModbusRTU::WriteOutputMessag
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(writeOutputRegisters): " << query << endl; dlog[Debug::INFO] << myname << "(writeOutputRegisters): " << query << endl;
ModbusRTU::mbErrCode ret = ModbusRTU::erNoError;
// Формирование ответа: // Формирование ответа:
int write_ok = 0; ModbusRTU::mbErrCode ret = much_real_write(query.start,query.data,query.quant);
ModbusRTU::ModbusData reg = query.start;
for( int num=0; num<query.quant; num++,reg++ )
{
ret = real_write( reg, query.data[num]);
if( ret == ModbusRTU::erNoError ) if( ret == ModbusRTU::erNoError )
write_ok++;
}
// формируем ответ
if( write_ok > 0 )
reply.set(query.start,query.quant); reply.set(query.start,query.quant);
return ret; return ret;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
ModbusRTU::WriteSingleOutputRetMessage& reply ) ModbusRTU::WriteSingleOutputRetMessage& reply )
...@@ -957,11 +899,38 @@ ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleO ...@@ -957,11 +899,38 @@ ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleO
return ret; return ret;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg, ModbusRTU::mbErrCode MBSlave::much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat,
ModbusRTU::ModbusData mbval ) int count )
{ {
try int i=0;
IOMap::iterator it = iomap.end();
for( ; i<count; i++ )
{
it = iomap.find(reg+i);
if( it != iomap.end() )
{ {
reg += i;
break;
}
}
if( it == iomap.end() )
return ModbusRTU::erBadDataAddress;
for( ; (it!=iomap.end()) && (i<count); i++,reg++ )
{
if( it->first == reg )
{
real_write_it(it,dat[i]);
it++;
}
}
return ModbusRTU::erNoError;
}
// -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData mbval )
{
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
{ {
dlog[Debug::INFO] << myname << "(write): save mbID=" dlog[Debug::INFO] << myname << "(write): save mbID="
...@@ -971,9 +940,16 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg, ...@@ -971,9 +940,16 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg,
} }
IOMap::iterator it = iomap.find(reg); IOMap::iterator it = iomap.find(reg);
return real_write_it(it,mbval);
}
// -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData& mbval )
{
if( it == iomap.end() ) if( it == iomap.end() )
return ModbusRTU::erBadDataAddress; return ModbusRTU::erBadDataAddress;
try
{
IOProperty* p(&it->second); IOProperty* p(&it->second);
if( p->amode == MBSlave::amRO ) if( p->amode == MBSlave::amRO )
...@@ -1084,7 +1060,8 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg, ...@@ -1084,7 +1060,8 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg,
return ModbusRTU::erTimeOut; return ModbusRTU::erTimeOut;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count ) ModbusRTU::mbErrCode MBSlave::much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat,
int count )
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
{ {
...@@ -1092,21 +1069,44 @@ ModbusRTU::mbErrCode MBSlave::much_real_read( ModbusRTU::ModbusData reg, ModbusR ...@@ -1092,21 +1069,44 @@ ModbusRTU::mbErrCode MBSlave::much_real_read( ModbusRTU::ModbusData reg, ModbusR
<< ModbusRTU::dat2str(reg) << " count=" << count << endl; << ModbusRTU::dat2str(reg) << " count=" << count << endl;
} }
IOMap::iterator it = iomap.find(reg); IOMap::iterator it = iomap.end();
int i=0;
for( ; i<count; i++ )
{
it = iomap.find(reg+i);
if( it != iomap.end() )
{
reg += i;
break;
}
dat[i] = 0;
}
if( it == iomap.end() ) if( it == iomap.end() )
return ModbusRTU::erBadDataAddress; return ModbusRTU::erBadDataAddress;
int i=0;
ModbusRTU::ModbusData val=0; ModbusRTU::ModbusData val=0;
for( ; (it!=iomap.end()) && (i<count); it++,i++,reg++ ) for( ; (it!=iomap.end()) && (i<count); i++,reg++ )
{ {
val=0; val=0;
// если регистры идут не подряд, то просто вернём ноль // если регистры идут не подряд, то просто вернём ноль
if( it->first == reg ) if( it->first == reg )
real_read_it(it,reg,val); {
real_read_it(it,val);
it++;
}
dat[i] = val; dat[i] = val;
} }
// добиваем нулями "ответ"
// чтобы он был такой длинны, которую запрашивали
if( i<count )
{
for( ; i<count; i++ )
dat[i] = 0;
}
return ModbusRTU::erNoError; return ModbusRTU::erNoError;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
...@@ -1119,26 +1119,22 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg, ModbusRTU::M ...@@ -1119,26 +1119,22 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg, ModbusRTU::M
} }
IOMap::iterator it = iomap.find(reg); IOMap::iterator it = iomap.find(reg);
if( it == iomap.end() ) return real_read_it(it,val);
return ModbusRTU::erBadDataAddress;
return real_read_it(it,reg,val);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val ) ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData& val )
{ {
if( it == iomap.end() )
return ModbusRTU::erBadDataAddress;
try try
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
{ {
dlog[Debug::INFO] << myname << "(real_read_it): read mbID=" dlog[Debug::INFO] << myname << "(real_read_it): read mbID="
<< ModbusRTU::dat2str(reg) << endl; << ModbusRTU::dat2str(it->first) << endl;
} }
IOMap::iterator it = iomap.find(reg);
if( it == iomap.end() )
return ModbusRTU::erBadDataAddress;
IOProperty* p(&it->second); IOProperty* p(&it->second);
val = 0; val = 0;
...@@ -1238,14 +1234,11 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb ...@@ -1238,14 +1234,11 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query, mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query, ReadInputRetMessage& reply )
ReadInputRetMessage& reply )
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(readInputRegisters): " << query << endl; dlog[Debug::INFO] << myname << "(readInputRegisters): " << query << endl;
try
{
if( query.count <= 1 ) if( query.count <= 1 )
{ {
ModbusRTU::ModbusData d = 0; ModbusRTU::ModbusData d = 0;
...@@ -1255,75 +1248,20 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query, ...@@ -1255,75 +1248,20 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
else else
reply.addData(0); reply.addData(0);
pingOK = true;
return ret; return ret;
} }
// Фомирование ответа: // Фомирование ответа:
much_real_read(query.start,buf,query.count); ModbusRTU::mbErrCode ret = much_real_read(query.start,buf,query.count);
for( int i=0; i<query.count; i++ )
reply.addData( buf[i] );
/*
ModbusRTU::ModbusData* dat = new ModbusRTU::ModbusData[query.count];
ModbusRTU::ModbusData reg = query.start;
try
{
much_real_read(reg,dat,query.count);
}
catch(...){}
delete[] dat;
*/
/*
for( ; num<query.count; num++, reg++ )
{
ModbusRTU::mbErrCode ret = real_read(reg,d);
if( ret == ModbusRTU::erNoError ) if( ret == ModbusRTU::erNoError )
reply.addData(d);
else
reply.addData(0);
}
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count )
{
dlog[Debug::WARN] << myname
<< "(readInputRegisters): query.count=" << (int)query.count
<< " > reply.count=" << (int)reply.count << endl;
}
*/
pingOK = true;
return ModbusRTU::erNoError;
}
catch( UniSetTypes::NameNotFound& ex )
{
dlog[Debug::WARN] << myname << "(readInputRegisters): " << ex << endl;
return ModbusRTU::erBadDataAddress;
}
catch( Exception& ex )
{
if( pingOK )
dlog[Debug::CRIT] << myname << "(readInputRegisters): " << ex << endl;
}
catch( CORBA::SystemException& ex )
{ {
if( pingOK ) for( int i=0; i<query.count; i++ )
dlog[Debug::CRIT] << myname << "(readInputRegisters): СORBA::SystemException: " reply.addData( buf[i] );
<< ex.NP_minorString() << endl;
}
catch(...)
{
if( pingOK )
dlog[Debug::CRIT] << myname << "(readInputRegisters): catch ..." << endl;
} }
pingOK = false; return ret;
return ModbusRTU::erTimeOut;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::setDateTime( ModbusRTU::SetDateTimeMessage& query, ModbusRTU::mbErrCode MBSlave::setDateTime( ModbusRTU::SetDateTimeMessage& query,
ModbusRTU::SetDateTimeRetMessage& reply ) ModbusRTU::SetDateTimeRetMessage& reply )
{ {
......
...@@ -158,7 +158,10 @@ class MBSlave: ...@@ -158,7 +158,10 @@ class MBSlave:
ModbusRTU::mbErrCode real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData val ); ModbusRTU::mbErrCode real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData val );
ModbusRTU::mbErrCode real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val ); ModbusRTU::mbErrCode real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val );
ModbusRTU::mbErrCode much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count ); ModbusRTU::mbErrCode much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
ModbusRTU::mbErrCode real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val ); ModbusRTU::mbErrCode much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
ModbusRTU::mbErrCode real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
private: private:
MBSlave(); MBSlave();
bool initPause; bool initPause;
......
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