Commit c7334d90 authored by Pavel Vainerman's avatar Pavel Vainerman

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

в одном запросе.
parent c3a3e735
......@@ -180,6 +180,9 @@ mbErrCode MBTCPServer::readInputRegisters( ReadInputMessage& query,
for( ; num<query.count; num++, reg++ )
reply.addData(reg);
// cerr << "************ reply: cnt=" << reply.count << endl;
// cerr << "reply: " << reply << endl;
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count )
......
......@@ -206,6 +206,10 @@ int main( int argc, char **argv )
if( verb )
cout << "connection: " << (mb.isConnection() ? "YES" : "NO") << endl;
if( count > ModbusRTU::MAXDATALEN && verb )
cout << "Too long packet! Max count=" << ModbusRTU::MAXDATALEN << " (ignore...)" << endl;
while(1)
{
try
......
......@@ -353,6 +353,15 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<< " q_count=" << p->q_count
<< " mb_init=" << p->mb_init
<< 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 )
......@@ -1615,10 +1624,6 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
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 )
{
RTUDevice* d(it1->second);
......@@ -1640,7 +1645,7 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
beg->second->q_count++;
if( beg->second->q_count > maxcount )
if( beg->second->q_count >= ModbusRTU::MAXDATALEN )
break;
reg = it->second->mbreg + it->second->offset;
......
......@@ -53,7 +53,11 @@ namespace ModbusRTU
{
/*! максимальное количество данных в пакете (c учётом контрольной суммы) */
MAXLENPACKET = 508, /*!< максимальная длина пакета 512 - header(2) - CRC(2) */
BroadcastAddr = 255 /*!< адрес для широковещательных сообщений */
BroadcastAddr = 255, /*!< адрес для широковещательных сообщений */
MAXDATALEN = 127 /*!< максимальное число слов, которое можно запросить.
Связано с тем, что в ответе есть поле bcnt - количество байт
Соответственно максимум туда можно записать только 255
*/
};
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