Commit c7334d90 authored by Pavel Vainerman's avatar Pavel Vainerman

исправление ошибки: добавил проверку на максимальное число запрашиваемых реистров

в одном запросе.
parent c3a3e735
...@@ -180,6 +180,9 @@ mbErrCode MBTCPServer::readInputRegisters( ReadInputMessage& query, ...@@ -180,6 +180,9 @@ mbErrCode MBTCPServer::readInputRegisters( ReadInputMessage& query,
for( ; num<query.count; num++, reg++ ) for( ; num<query.count; num++, reg++ )
reply.addData(reg); reply.addData(reg);
// cerr << "************ reply: cnt=" << reply.count << endl;
// cerr << "reply: " << reply << endl;
// Если мы в начале проверили, что запрос входит в разрешёный диапазон // Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может... // то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count ) if( reply.count < query.count )
......
...@@ -206,6 +206,10 @@ int main( int argc, char **argv ) ...@@ -206,6 +206,10 @@ int main( int argc, char **argv )
if( verb ) if( verb )
cout << "connection: " << (mb.isConnection() ? "YES" : "NO") << endl; cout << "connection: " << (mb.isConnection() ? "YES" : "NO") << endl;
if( count > ModbusRTU::MAXDATALEN && verb )
cout << "Too long packet! Max count=" << ModbusRTU::MAXDATALEN << " (ignore...)" << endl;
while(1) while(1)
{ {
try try
......
...@@ -353,8 +353,17 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -353,8 +353,17 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<< " q_count=" << p->q_count << " q_count=" << p->q_count
<< " mb_init=" << p->mb_init << " mb_init=" << p->mb_init
<< endl; << endl;
if( p->q_count > ModbusRTU::MAXDATALEN )
{
dlog[Debug::LEVEL3] << myname << "(pollRTU): count(" << p->q_count
<< ") > MAXDATALEN(" << ModbusRTU::MAXDATALEN
<< " ..ignore..."
<< endl;
}
} }
if( p->q_count == 0 ) if( p->q_count == 0 )
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
...@@ -1615,10 +1624,6 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -1615,10 +1624,6 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
dlog[Debug::INFO] << myname << "(rtuQueryOptimization): optimization..." << endl; dlog[Debug::INFO] << myname << "(rtuQueryOptimization): optimization..." << endl;
// MAXLEN/2 - я█я┌п╬ п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ я│п╩п╬п╡ п╢п╟п╫п╫я▀я┘ п╡ п╬я┌п╡п╣я┌п╣
// 10 - п╫п╟ п╡я│я▐п╨п╦п╣ я│п╩я┐п╤п╣п╠п╫я▀п╣ п╥п╟пЁп╬п╩п╬п╡п╨п╦
int maxcount = ModbusRTU::MAXLENPACKET/2 - 10;
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);
...@@ -1640,7 +1645,7 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -1640,7 +1645,7 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
beg->second->q_count++; beg->second->q_count++;
if( beg->second->q_count > maxcount ) if( beg->second->q_count >= ModbusRTU::MAXDATALEN )
break; break;
reg = it->second->mbreg + it->second->offset; reg = it->second->mbreg + it->second->offset;
......
...@@ -53,7 +53,11 @@ namespace ModbusRTU ...@@ -53,7 +53,11 @@ namespace ModbusRTU
{ {
/*! максимальное количество данных в пакете (c учётом контрольной суммы) */ /*! максимальное количество данных в пакете (c учётом контрольной суммы) */
MAXLENPACKET = 508, /*!< максимальная длина пакета 512 - header(2) - CRC(2) */ MAXLENPACKET = 508, /*!< максимальная длина пакета 512 - header(2) - CRC(2) */
BroadcastAddr = 255 /*!< адрес для широковещательных сообщений */ BroadcastAddr = 255, /*!< адрес для широковещательных сообщений */
MAXDATALEN = 127 /*!< максимальное число слов, которое можно запросить.
Связано с тем, что в ответе есть поле bcnt - количество байт
Соответственно максимум туда можно записать только 255
*/
}; };
const unsigned char MBErrMask = 0x80; const unsigned char MBErrMask = 0x80;
......
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