Commit a42b1ed4 authored by Pavel Vainerman's avatar Pavel Vainerman

(MBTCPMaster): Исправил ошибку в функции "оптимизации" запросов

parent 5d8ac8e5
...@@ -189,7 +189,7 @@ void MBTCPMaster::initMB( bool reopen ) ...@@ -189,7 +189,7 @@ void MBTCPMaster::initMB( bool reopen )
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
{ {
cerr << "(init): " << ex << endl; dlog[Debug::WARN] << "(init): " << ex << endl;
} }
catch(...) catch(...)
{ {
...@@ -1231,7 +1231,7 @@ bool MBTCPMaster::activateObject() ...@@ -1231,7 +1231,7 @@ bool MBTCPMaster::activateObject()
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void MBTCPMaster::sigterm( int signo ) void MBTCPMaster::sigterm( int signo )
{ {
cerr << myname << ": ********* SIGTERM(" << signo <<") ********" << endl; dlog[Debug::WARN] << myname << ": ********* SIGTERM(" << signo <<") ********" << endl;
setProcActive(false); setProcActive(false);
/*! \todo Доделать выставление безопасного состояния на выходы. /*! \todo Доделать выставление безопасного состояния на выходы.
...@@ -1895,14 +1895,14 @@ MBTCPMaster* MBTCPMaster::init_mbmaster( int argc, const char* const* argv, UniS ...@@ -1895,14 +1895,14 @@ MBTCPMaster* MBTCPMaster::init_mbmaster( int argc, const char* const* argv, UniS
string name = conf->getArgParam("--" + prefix + "-name","MBTCPMaster1"); string name = conf->getArgParam("--" + prefix + "-name","MBTCPMaster1");
if( name.empty() ) if( name.empty() )
{ {
cerr << "(MBTCPMaster): Не задан name'" << endl; dlog[Debug::CRIT] << "(MBTCPMaster): Не задан name'" << endl;
return 0; return 0;
} }
ObjectId ID = conf->getObjectID(name); ObjectId ID = conf->getObjectID(name);
if( ID == UniSetTypes::DefaultObjectId ) if( ID == UniSetTypes::DefaultObjectId )
{ {
cerr << "(MBTCPMaster): идентификатор '" << name dlog[Debug::CRIT] << "(MBTCPMaster): идентификатор '" << name
<< "' не найден в конф. файле!" << "' не найден в конф. файле!"
<< " в секции " << conf->getObjectsSection() << endl; << " в секции " << conf->getObjectsSection() << endl;
return 0; return 0;
...@@ -2073,28 +2073,31 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -2073,28 +2073,31 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
for( MBTCPMaster::RTUDeviceMap::iterator it1=m.begin(); it1!=m.end(); ++it1 ) for( MBTCPMaster::RTUDeviceMap::iterator it1=m.begin(); it1!=m.end(); ++it1 )
{ {
RTUDevice* d(it1->second); RTUDevice* d(it1->second);
// Вообще в map они уже лежат в нужном порядке, т.е. функция genRegID() гарантирует
// что регистры идущие подряд с одниковой функцией чтения/записи получат подряд идущие ID.
// так что оптимтизация это просто нахождение мест где id идут не подряд...
for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it ) for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
{ {
MBTCPMaster::RegMap::iterator beg = it; MBTCPMaster::RegMap::iterator beg = it;
ModbusRTU::ModbusData reg = it->second->mbreg; RegID id = it->second->id; // или собственно it->first
beg->second->q_num = 1; beg->second->q_num = 1;
beg->second->q_count = 1; beg->second->q_count = 1;
it++; it++;
for( ;it!=d->regmap.end(); ++it ) for( ;it!=d->regmap.end(); ++it )
{ {
if( (it->second->mbreg - reg) > 1 ) if( (it->second->id - id) > 1 )
break; {
it--; // раз это регистр уже следующий, то надо вернуть на шаг обратно..
if( beg->second->mbfunc != it->second->mbfunc )
break; break;
}
beg->second->q_count++; beg->second->q_count++;
if( beg->second->q_count >= ModbusRTU::MAXDATALEN ) if( beg->second->q_count >= ModbusRTU::MAXDATALEN )
break; break;
reg = it->second->mbreg; id = it->second->id;
it->second->q_num = beg->second->q_count; it->second->q_num = beg->second->q_count;
it->second->q_count = 0; it->second->q_count = 0;
} }
...@@ -2123,8 +2126,6 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -2123,8 +2126,6 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
if( it==d->regmap.end() ) if( it==d->regmap.end() )
break; break;
it--;
} }
} }
} }
...@@ -2518,7 +2519,7 @@ void MBTCPMaster::updateMTR( RegMap::iterator& rit ) ...@@ -2518,7 +2519,7 @@ void MBTCPMaster::updateMTR( RegMap::iterator& rit )
if( r->mtrType == MTR::mtT4 ) if( r->mtrType == MTR::mtT4 )
{ {
if( save ) if( save )
cerr << myname << "(updateMTR): write (T4) reg(" << dat2str(r->mbreg) << ") to MTR NOT YET!!!" << endl; dlog[Debug::WARN] << myname << "(updateMTR): write (T4) reg(" << dat2str(r->mbreg) << ") to MTR NOT YET!!!" << endl;
else else
{ {
MTR::T4 t(r->mbval); MTR::T4 t(r->mbval);
......
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