Commit 56a7d293 authored by Pavel Vainerman's avatar Pavel Vainerman

(Modbus): Исправил ошибку (сдвиг не единицу) в обработке количества возвращаемых…

(Modbus): Исправил ошибку (сдвиг не единицу) в обработке количества возвращаемых байтов в функции 0x02
parent 6d54e50b
......@@ -134,16 +134,26 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
d.b[3] = 1;
d.b[7] = 1;
if( replyVal == -1 )
{
int bnum = 0;
int i=0;
while( i<query.count )
{
reply.addData(0);
for( int nbit=0; nbit<BitsPerByte && i<query.count; nbit++,i++ )
reply.setBit(bnum,nbit,d.b[nbit]);
bnum++;
}
}
else
{
int bcnt = query.count / ModbusRTU::BitsPerByte;
if( (query.count % ModbusRTU::BitsPerByte) > 0 )
bcnt++;
for( int i=0; i<bcnt; i++ )
{
if( replyVal!=-1 )
reply.addData(replyVal);
else
reply.addData(d);
}
return ModbusRTU::erNoError;
......
......@@ -148,33 +148,26 @@ ModbusRTU::mbErrCode MBTCPServer::readInputStatus( ReadInputStatusMessage& query
d.b[3] = 1;
d.b[7] = 1;
if( query.count <= 1 )
if( replyVal == -1 )
{
if( replyVal!=-1 )
reply.addData(replyVal);
else
reply.addData(d);
return ModbusRTU::erNoError;
}
// Фомирование ответа:
int num=0; // добавленное количество данных
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
int bnum = 0;
int i=0;
while( i<query.count )
{
if( replyVal!=-1 )
reply.addData(replyVal);
else
reply.addData(d);
reply.addData(0);
for( int nbit=0; nbit<BitsPerByte && i<query.count; nbit++,i++ )
reply.setBit(bnum,nbit,d.b[nbit]);
bnum++;
}
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.bcnt < query.count )
}
else
{
cerr << "(readInputStatus): Получили меньше чем ожидали. "
<< " Запросили " << query.count << " получили " << reply.bcnt << endl;
int bcnt = query.count / ModbusRTU::BitsPerByte;
if( (query.count % ModbusRTU::BitsPerByte) > 0 )
bcnt++;
for( int i=0; i<bcnt; i++ )
reply.addData(replyVal);
}
return ModbusRTU::erNoError;
......
......@@ -379,7 +379,7 @@ int main( int argc, char **argv )
{
ModbusRTU::DataBits b(ret.data[i]);
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = ("
cout << i <<": (" << ModbusRTU::dat2str( reg + 8*i ) << ") = ("
<< ModbusRTU::b2str(ret.data[i]) << ") " << b << endl;
}
}
......@@ -403,7 +403,7 @@ int main( int argc, char **argv )
{
ModbusRTU::DataBits b(ret.data[i]);
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = ("
cout << i <<": (" << ModbusRTU::dat2str( reg + 8*i ) << ") = ("
<< ModbusRTU::b2str(ret.data[i]) << ") " << b << endl;
}
}
......
......@@ -274,7 +274,7 @@ int main( int argc, char **argv )
{
ModbusRTU::DataBits b(ret.data[i]);
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = ("
cout << i <<": (" << ModbusRTU::dat2str( reg + 8*i ) << ") = ("
<< ModbusRTU::b2str(ret.data[i]) << ") " << b << endl;
}
}
......@@ -298,7 +298,7 @@ int main( int argc, char **argv )
{
ModbusRTU::DataBits b(ret.data[i]);
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = ("
cout << i <<": (" << ModbusRTU::dat2str( reg + 8*i ) << ") = ("
<< ModbusRTU::b2str(ret.data[i]) << ") " << b << endl;
}
}
......
......@@ -3,7 +3,7 @@
Name: libuniset
Version: 1.0
Release: alt55
Release: alt56
Summary: UniSet - library for building distributed industrial control systems
License: GPL
Group: Development/C++
......@@ -212,6 +212,9 @@ rm -f %buildroot%_libdir/*.la
%changelog
* Sat Nov 26 2011 Pavel Vainerman <pv@altlinux.ru> 1.0-alt56
- (modbus): fixed bug (again) in ModbusSlave::readInputStatus(0x02)
* Sat Nov 26 2011 Pavel Vainerman <pv@altlinux.ru> 1.0-alt55
- (modbus): fixed bug in ModbusSlave::readInputStatus(0x02)
......
......@@ -1339,11 +1339,13 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
// Фомирование ответа:
much_real_read(query.start,buf,query.count);
int bnum = 0;
for( int i=0; i<query.count; i++, bnum++ )
int i=0;
while( i<query.count )
{
reply.addData(0);
for( int nbit=0; nbit<BitsPerByte && i<query.count; nbit++,i++ )
reply.setBit(bnum,nbit,buf[i]);
bnum++;
}
pingOK = true;
......
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