Commit 5e03f449 authored by Pavel Vainerman's avatar Pavel Vainerman

Очередная попытка исправить периодиеские подвисания ModbusSlave.

parent 9ce79082
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
Name: libuniset Name: libuniset
Version: 1.0 Version: 1.0
Release: alt37 Release: alt38
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++
...@@ -207,6 +207,9 @@ rm -f %buildroot%_libdir/*.la ...@@ -207,6 +207,9 @@ rm -f %buildroot%_libdir/*.la
%changelog %changelog
* Thu Jun 09 2011 Pavel Vainerman <pv@altlinux.ru> 1.0-alt38
- fied bug in ComPort::cleanupChannel()
* Sun Jun 05 2011 Pavel Vainerman <pv@altlinux.ru> 1.0-alt37 * Sun Jun 05 2011 Pavel Vainerman <pv@altlinux.ru> 1.0-alt37
- add cleanup before send for ComPort - add cleanup before send for ComPort
......
...@@ -309,6 +309,10 @@ void ComPort::cleanupChannel() ...@@ -309,6 +309,10 @@ void ComPort::cleanupChannel()
*/ */
unsigned char tmpbuf[100]; unsigned char tmpbuf[100];
int k = 0; int k = 0;
bool old_waiting = waiting;
waiting = false;
int mask = fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,O_NONBLOCK);
try try
{ {
do do
...@@ -319,9 +323,8 @@ void ComPort::cleanupChannel() ...@@ -319,9 +323,8 @@ void ComPort::cleanupChannel()
} }
catch(...){} catch(...){}
// #warning Обнулять нельзя, может надо делать что-то интелектуальнее... fcntl(fd,F_SETFL,mask);
// curSym = 0; waiting = old_waiting;
// bufLength = 0;
} }
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
void ComPort::setSpeed( std::string s ) void ComPort::setSpeed( std::string s )
......
...@@ -81,6 +81,7 @@ mbErrCode ModbusRTUSlave::receive( ModbusRTU::ModbusAddr addr, timeout_t timeout ...@@ -81,6 +81,7 @@ mbErrCode ModbusRTUSlave::receive( ModbusRTU::ModbusAddr addr, timeout_t timeout
} }
// dlog[Debug::WARN] << "(receive): " << mbErr2Str(res) << endl; // dlog[Debug::WARN] << "(receive): " << mbErr2Str(res) << endl;
// cerr << "**** (receive): " << mbErr2Str(res) << endl;
usleep(10000); usleep(10000);
return res; return res;
} }
......
...@@ -21,6 +21,12 @@ ModbusServer::ModbusServer(): ...@@ -21,6 +21,12 @@ ModbusServer::ModbusServer():
cleanBeforeSend(false) cleanBeforeSend(false)
{ {
tmProcessing.setTiming(replyTimeout_ms); tmProcessing.setTiming(replyTimeout_ms);
/*
dlog.addLevel(Debug::ANY);
dlog.addLevel(Debug::WARN);
dlog.addLevel(Debug::CRIT);
dlog.addLevel(Debug::INFO);
*/
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
...@@ -486,10 +492,15 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t ...@@ -486,10 +492,15 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t
// Проверка кому адресован пакет... // Проверка кому адресован пакет...
if( rbuf.addr!=addr && rbuf.addr!=BroadcastAddr ) if( rbuf.addr!=addr && rbuf.addr!=BroadcastAddr )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(recv): BadNodeAddress. my= " << addr2str(addr) {
<< " msg.addr=" << addr2str(rbuf.addr); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(recv): BadNodeAddress. my= " << addr2str(addr)
<< " msg.addr=" << addr2str(rbuf.addr);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadReplyNodeAddress; return erBadReplyNodeAddress;
} }
...@@ -502,6 +513,7 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t ...@@ -502,6 +513,7 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t
catch( Exception& ex ) // SystemError catch( Exception& ex ) // SystemError
{ {
dlog[Debug::CRIT] << "(recv): " << ex << endl; dlog[Debug::CRIT] << "(recv): " << ex << endl;
cleanupChannel();
return erHardwareError; return erHardwareError;
} }
...@@ -522,6 +534,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -522,6 +534,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
{ {
dlog[Debug::WARN] << "(recv): " << (ModbusHeader*)(&rbuf) << endl; dlog[Debug::WARN] << "(recv): " << (ModbusHeader*)(&rbuf) << endl;
dlog[Debug::WARN] << "(recv): заголовок меньше положенного..." << endl; dlog[Debug::WARN] << "(recv): заголовок меньше положенного..." << endl;
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -601,7 +614,6 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -601,7 +614,6 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
return erUnExpectedPacketType; return erUnExpectedPacketType;
} }
// ДЛЯ ТОГО ЧТОБЫ НЕ ЖДАТЬ ПРОДОЛЖЕНИЯ БЕЗКОНЕЧНО СБРАСЫВАЕМ TIMEOUT // ДЛЯ ТОГО ЧТОБЫ НЕ ЖДАТЬ ПРОДОЛЖЕНИЯ БЕЗКОНЕЧНО СБРАСЫВАЕМ TIMEOUT
setChannelTimeout(10); // 10 msec setChannelTimeout(10); // 10 msec
...@@ -609,11 +621,15 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -609,11 +621,15 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
int rlen = getNextData((unsigned char*)(rbuf.data),rbuf.len); int rlen = getNextData((unsigned char*)(rbuf.data),rbuf.len);
if( rlen < rbuf.len ) if( rlen < rbuf.len )
{ {
// rbuf.len = bcnt + rlen - szModbusHeader; if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(recv): buf: " << rbuf << endl; {
dlog[Debug::WARN] << "(recv)(" << rbuf.func // rbuf.len = bcnt + rlen - szModbusHeader;
<< "): Получили данных меньше чем ждали...(recv=" dlog[Debug::WARN] << "(recv): buf: " << rbuf << endl;
<< rlen << " < wait=" << (int)rbuf.len << ")" << endl; dlog[Debug::WARN] << "(recv)(" << rbuf.func
<< "): Получили данных меньше чем ждали...(recv="
<< rlen << " < wait=" << (int)rbuf.len << ")" << endl;
}
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -634,10 +650,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -634,10 +650,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mRead.crc ) if( tcrc != mRead.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x01): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mRead.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x01): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mRead.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
...@@ -657,10 +677,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -657,10 +677,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mRead.crc ) if( tcrc != mRead.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x02): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mRead.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x02): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mRead.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
...@@ -673,17 +697,21 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -673,17 +697,21 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
dlog[Debug::INFO] << "(0x03): recv buf: " << rbuf << endl; dlog[Debug::INFO] << "(0x03): recv buf: " << rbuf << endl;
if( crcNoCheckit ) if( crcNoCheckit )
return erNoError; return erNoError;
// Проверяем контрольную сумму // Проверяем контрольную сумму
// от начала(включая заголовок) и до конца (исключив последний элемент содержащий CRC) // от начала(включая заголовок) и до конца (исключив последний элемент содержащий CRC)
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mRead.crc ) if( tcrc != mRead.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x03): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mRead.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x03): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mRead.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
...@@ -703,10 +731,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -703,10 +731,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mRead.crc ) if( tcrc != mRead.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x04): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mRead.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x04): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mRead.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
...@@ -724,13 +756,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -724,13 +756,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen); int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen);
if( rlen1 < szDataLen ) if( rlen1 < szDataLen )
{ {
rbuf.len = bcnt + rlen1 - szModbusHeader; if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(0x0F): buf: " << rbuf << endl; {
dlog[Debug::WARN] << "(0x0F)(" rbuf.len = bcnt + rlen1 - szModbusHeader;
<< rbuf.func << "):(fnForceMultipleCoils) " dlog[Debug::WARN] << "(0x0F): buf: " << rbuf << endl;
<< "Получили данных меньше чем ждали...(" dlog[Debug::WARN] << "(0x0F)("
<< rlen1 << " < " << szDataLen << ")" << endl; << rbuf.func << "):(fnForceMultipleCoils) "
<< "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -755,15 +790,20 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -755,15 +790,20 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
err << "(0x0F): bad crc. calc.crc=" << dat2str(tcrc) err << "(0x0F): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mWrite.crc); << " msg.crc=" << dat2str(mWrite.crc);
dlog[Debug::WARN] << err.str() << endl; dlog[Debug::WARN] << err.str() << endl;
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
} }
if( !mWrite.checkFormat() ) if( !mWrite.checkFormat() )
{ {
dlog[Debug::WARN] << "(0x0F): (" << rbuf.func if( dlog.debugging(Debug::WARN) )
<< ")(fnForceMultipleCoils): " {
<< ": некорректный формат сообщения..." << endl; dlog[Debug::WARN] << "(0x0F): (" << rbuf.func
<< ")(fnForceMultipleCoils): "
<< ": некорректный формат сообщения..." << endl;
}
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -782,13 +822,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -782,13 +822,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen); int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen);
if( rlen1 < szDataLen ) if( rlen1 < szDataLen )
{ {
rbuf.len = bcnt + rlen1 - szModbusHeader; if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(0x10): buf: " << rbuf << endl; {
dlog[Debug::WARN] << "(0x10)(" rbuf.len = bcnt + rlen1 - szModbusHeader;
<< rbuf.func << "):(fnWriteOutputRegisters) " dlog[Debug::WARN] << "(0x10): buf: " << rbuf << endl;
<< "Получили данных меньше чем ждали...(" dlog[Debug::WARN] << "(0x10)("
<< rlen1 << " < " << szDataLen << ")" << endl; << rbuf.func << "):(fnWriteOutputRegisters) "
<< "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -809,10 +852,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -809,10 +852,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mWrite.crc ) if( tcrc != mWrite.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x10): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mWrite.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x10): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mWrite.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
} }
...@@ -822,6 +869,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -822,6 +869,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
dlog[Debug::WARN] << "(0x10): (" << rbuf.func dlog[Debug::WARN] << "(0x10): (" << rbuf.func
<< ")(fnWriteOutputRegisters): " << ")(fnWriteOutputRegisters): "
<< ": некорректный формат сообщения..." << endl; << ": некорректный формат сообщения..." << endl;
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -840,13 +888,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -840,13 +888,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen); int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen);
if( rlen1 < szDataLen ) if( rlen1 < szDataLen )
{ {
rbuf.len = bcnt + rlen1 - szModbusHeader; if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(0x05): buf: " << rbuf << endl; {
dlog[Debug::WARN] << "(0x05)(" rbuf.len = bcnt + rlen1 - szModbusHeader;
<< rbuf.func << "):(fnForceSingleCoil) " dlog[Debug::WARN] << "(0x05): buf: " << rbuf << endl;
<< "Получили данных меньше чем ждали...(" dlog[Debug::WARN] << "(0x05)("
<< rlen1 << " < " << szDataLen << ")" << endl; << rbuf.func << "):(fnForceSingleCoil) "
<< "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -867,10 +918,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -867,10 +918,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mWrite.crc ) if( tcrc != mWrite.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x05): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mWrite.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x05): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mWrite.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
} }
...@@ -880,6 +935,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -880,6 +935,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
dlog[Debug::WARN] << "(0x05): (" << rbuf.func dlog[Debug::WARN] << "(0x05): (" << rbuf.func
<< ")(fnForceSingleCoil): " << ")(fnForceSingleCoil): "
<< ": некорректный формат сообщения..." << endl; << ": некорректный формат сообщения..." << endl;
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -898,13 +954,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -898,13 +954,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen); int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen);
if( rlen1 < szDataLen ) if( rlen1 < szDataLen )
{ {
rbuf.len = bcnt + rlen1 - szModbusHeader; if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(0x06): buf: " << rbuf << endl; {
dlog[Debug::WARN] << "(0x06)(" rbuf.len = bcnt + rlen1 - szModbusHeader;
<< rbuf.func << "):(fnWriteOutputSingleRegisters) " dlog[Debug::WARN] << "(0x06): buf: " << rbuf << endl;
<< "Получили данных меньше чем ждали...(" dlog[Debug::WARN] << "(0x06)("
<< rlen1 << " < " << szDataLen << ")" << endl; << rbuf.func << "):(fnWriteOutputSingleRegisters) "
<< "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -925,10 +984,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -925,10 +984,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mWrite.crc ) if( tcrc != mWrite.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x06): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mWrite.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x06): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mWrite.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
} }
...@@ -938,6 +1001,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -938,6 +1001,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
dlog[Debug::WARN] << "(0x06): (" << rbuf.func dlog[Debug::WARN] << "(0x06): (" << rbuf.func
<< ")(fnWriteOutputSingleRegisters): " << ")(fnWriteOutputSingleRegisters): "
<< ": некорректный формат сообщения..." << endl; << ": некорректный формат сообщения..." << endl;
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -958,10 +1022,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -958,10 +1022,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mRead.crc ) if( tcrc != mRead.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x65): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mRead.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x65): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mRead.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
...@@ -981,10 +1049,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -981,10 +1049,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mSet.crc ) if( tcrc != mSet.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x50): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mSet.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x50): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mSet.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
} }
...@@ -992,6 +1064,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -992,6 +1064,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
if( !mSet.checkFormat() ) if( !mSet.checkFormat() )
{ {
dlog[Debug::WARN] << "(0x50): некорректные значения..." << endl; dlog[Debug::WARN] << "(0x50): некорректные значения..." << endl;
cleanupChannel();
return erBadDataValue; // return erInvalidFormat; return erBadDataValue; // return erInvalidFormat;
} }
...@@ -1010,13 +1083,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -1010,13 +1083,16 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen); int rlen1 = getNextData((unsigned char*)(&(rbuf.data[rlen])),szDataLen);
if( rlen1 < szDataLen ) if( rlen1 < szDataLen )
{ {
rbuf.len = bcnt + rlen1 - szModbusHeader; if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(0x53): buf: " << rbuf << endl; {
dlog[Debug::WARN] << "(0x53)(" rbuf.len = bcnt + rlen1 - szModbusHeader;
<< rbuf.func << "):(fnWriteOutputRegisters) " dlog[Debug::WARN] << "(0x53): buf: " << rbuf << endl;
<< "Получили данных меньше чем ждали...(" dlog[Debug::WARN] << "(0x53)("
<< rlen1 << " < " << szDataLen << ")" << endl; << rbuf.func << "):(fnWriteOutputRegisters) "
<< "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -1038,10 +1114,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -1038,10 +1114,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mRServ.crc ) if( tcrc != mRServ.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x53): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mRServ.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x53): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mRServ.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
...@@ -1063,10 +1143,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -1063,10 +1143,14 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC); ModbusData tcrc = checkCRC((ModbusByte*)(&rbuf),bcnt-szCRC);
if( tcrc != mFT.crc ) if( tcrc != mFT.crc )
{ {
ostringstream err; if( dlog.debugging(Debug::WARN) )
err << "(0x66): bad crc. calc.crc=" << dat2str(tcrc) {
<< " msg.crc=" << dat2str(mFT.crc); ostringstream err;
dlog[Debug::WARN] << err.str() << endl; err << "(0x66): bad crc. calc.crc=" << dat2str(tcrc)
<< " msg.crc=" << dat2str(mFT.crc);
dlog[Debug::WARN] << err.str() << endl;
}
cleanupChannel();
return erBadCheckSum; return erBadCheckSum;
} }
...@@ -1085,6 +1169,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -1085,6 +1169,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
catch( Exception& ex ) // SystemError catch( Exception& ex ) // SystemError
{ {
dlog[Debug::CRIT] << "(recv): " << ex << endl; dlog[Debug::CRIT] << "(recv): " << ex << endl;
cleanupChannel();
return erHardwareError; return erHardwareError;
} }
......
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