Commit 3290b030 authored by Pavel Vainerman's avatar Pavel Vainerman

попытка исправить подвисание в ModbusSlave

parent 0d25a1c6
...@@ -135,6 +135,8 @@ class ModbusClient ...@@ -135,6 +135,8 @@ class ModbusClient
inline void setCRCNoCheckit( bool set ){ crcNoCheckit = set; } inline void setCRCNoCheckit( bool set ){ crcNoCheckit = set; }
inline bool isCRCNoCheckit(){ return crcNoCheckit; } inline bool isCRCNoCheckit(){ return crcNoCheckit; }
virtual void cleanupChannel(){}
protected: protected:
/*! get next data block from channel ot recv buffer /*! get next data block from channel ot recv buffer
......
...@@ -24,7 +24,7 @@ class ModbusRTUMaster: ...@@ -24,7 +24,7 @@ class ModbusRTUMaster:
ModbusRTUMaster( const std::string dev, bool use485=false, bool tr_ctl=false ); ModbusRTUMaster( const std::string dev, bool use485=false, bool tr_ctl=false );
virtual ~ModbusRTUMaster(); virtual ~ModbusRTUMaster();
inline void cleanupChannel(){ if( port ) port->cleanupChannel(); } virtual void cleanupChannel(){ if( port ) port->cleanupChannel(); }
void setSpeed( ComPort::Speed s ); void setSpeed( ComPort::Speed s );
void setSpeed( const std::string s ); void setSpeed( const std::string s );
......
...@@ -33,6 +33,8 @@ class ModbusRTUSlave: ...@@ -33,6 +33,8 @@ class ModbusRTUSlave:
ComPort::Speed getSpeed(); ComPort::Speed getSpeed();
virtual ModbusRTU::mbErrCode receive( ModbusRTU::ModbusAddr addr, timeout_t msecTimeout ); virtual ModbusRTU::mbErrCode receive( ModbusRTU::ModbusAddr addr, timeout_t msecTimeout );
virtual void cleanupChannel(){ if(port) port->cleanupChannel(); }
protected: protected:
......
...@@ -68,6 +68,8 @@ class ModbusServer ...@@ -68,6 +68,8 @@ class ModbusServer
ModbusRTU::FileTransferRetMessage& reply, ModbusRTU::FileTransferRetMessage& reply,
DebugStream* dlog=0 ); DebugStream* dlog=0 );
virtual void cleanupChannel(){}
protected: protected:
/*! Обработка запроса на чтение данных (0x01). /*! Обработка запроса на чтение данных (0x01).
......
...@@ -30,6 +30,8 @@ class ModbusTCPMaster: ...@@ -30,6 +30,8 @@ class ModbusTCPMaster:
void reconnect(); void reconnect();
void cleanInputStream(); void cleanInputStream();
virtual void cleanupChannel(){ cleanInputStream(); }
protected: protected:
......
...@@ -27,7 +27,9 @@ class ModbusTCPServer: ...@@ -27,7 +27,9 @@ class ModbusTCPServer:
inline void setIgnoreAddrMode( bool st ){ ignoreAddr = st; } inline void setIgnoreAddrMode( bool st ){ ignoreAddr = st; }
inline bool getIgnoreAddrMode(){ return ignoreAddr; } inline bool getIgnoreAddrMode(){ return ignoreAddr; }
void cleanInputStream();
virtual void cleanupChannel(){ cleanInputStream(); }
protected: protected:
virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request ); virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request );
......
...@@ -198,12 +198,12 @@ unsigned char ComPort::m_receiveByte( bool wait ) ...@@ -198,12 +198,12 @@ unsigned char ComPort::m_receiveByte( bool wait )
/* select' returns 0 if timeout, 1 if input available, -1 if error. */ /* select' returns 0 if timeout, 1 if input available, -1 if error. */
if(select(FD_SETSIZE, &set, NULL, NULL, &timeout)==1) if(select(FD_SETSIZE, &set, NULL, NULL, &timeout)==1)
bufLength=read(fd,buf,BufSize); bufLength= ::read(fd,buf,BufSize);
else else
bufLength=-1; bufLength=-1;
} }
else else
bufLength=read(fd,buf,BufSize); bufLength= ::read(fd,buf,BufSize);
if(bufLength <= 0) if(bufLength <= 0)
{ {
throw UniSetTypes::TimeOut(); throw UniSetTypes::TimeOut();
...@@ -299,18 +299,23 @@ void ComPort::cleanupChannel() ...@@ -299,18 +299,23 @@ void ComPort::cleanupChannel()
if( fd < 0 ) if( fd < 0 )
return; return;
// PassiveTimer pt(t_msec); int fd2 = dup(fd);
if( fd2 < 0 )
return;
fcntl(fd2,F_SETFL,O_NONBLOCK);
unsigned char tmpbuf[100]; unsigned char tmpbuf[100];
int k = 0; int k = 0;
do do
{ {
k = ::read(fd,tmpbuf,sizeof(tmpbuf)); k = ::read(fd2,tmpbuf,sizeof(tmpbuf));
} }
while( k>0 ); while( k>0 );
// #warning Обнулять нельзя, может надо делать что-то интелектуальнее... close(fd2);
// curSym = 0;
// bufLength = 0; curSym = 0;
bufLength=-1;
} }
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
void ComPort::setSpeed( std::string s ) void ComPort::setSpeed( std::string s )
......
...@@ -340,6 +340,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -340,6 +340,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, 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;
} }
...@@ -366,6 +367,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -366,6 +367,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< "): Получили данных меньше чем ждали...(recv=" << "): Получили данных меньше чем ждали...(recv="
<< rlen << " < wait=" << rbuf.len << ")" << endl; << rlen << " < wait=" << rbuf.len << ")" << endl;
} }
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
bcnt+=rlen; bcnt+=rlen;
...@@ -388,7 +391,10 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -388,7 +391,10 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
} }
if( qfunc!=rbuf.func ) if( qfunc!=rbuf.func )
{
cleanupChannel();
return erUnExpectedPacketType; return erUnExpectedPacketType;
}
// Определяем тип сообщения // Определяем тип сообщения
switch( rbuf.func ) switch( rbuf.func )
...@@ -453,6 +459,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -453,6 +459,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
break; break;
*/ */
default: default:
cleanupChannel();
return erUnExpectedPacketType; return erUnExpectedPacketType;
} }
...@@ -472,6 +479,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -472,6 +479,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< "): Получили данных меньше чем ждали...(recv=" << "): Получили данных меньше чем ждали...(recv="
<< rlen << " < wait=" << rbuf.len << ")" << endl; << rlen << " < wait=" << rbuf.len << ")" << endl;
} }
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -501,6 +510,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -501,6 +510,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< rlen1 << " < " << szDataLen << ")" << endl; << rlen1 << " < " << szDataLen << ")" << endl;
} }
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -554,7 +564,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -554,7 +564,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< "Получили данных меньше чем ждали...(" << "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl; << rlen1 << " < " << szDataLen << ")" << endl;
} }
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -609,6 +620,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -609,6 +620,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< rlen1 << " < " << szDataLen << ")" << endl; << rlen1 << " < " << szDataLen << ")" << endl;
} }
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -662,6 +674,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -662,6 +674,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< rlen1 << " < " << szDataLen << ")" << endl; << rlen1 << " < " << szDataLen << ")" << endl;
} }
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -844,7 +857,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -844,7 +857,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< rbuf.func << "):(fnFileTransfer) " << rbuf.func << "):(fnFileTransfer) "
<< "Получили данных меньше чем ждали...(" << "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl; << rlen1 << " < " << szDataLen << ")" << endl;
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -919,6 +933,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -919,6 +933,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< "Получили данных меньше чем ждали...(" << "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl; << rlen1 << " < " << szDataLen << ")" << endl;
cleanupChannel();
return erInvalidFormat; return erInvalidFormat;
} }
...@@ -954,6 +969,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -954,6 +969,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
else else
{ {
// А как мы сюда добрались?!!!!!! // А как мы сюда добрались?!!!!!!
cleanupChannel();
return erUnExpectedPacketType; return erUnExpectedPacketType;
} }
} }
......
...@@ -593,6 +593,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout ) ...@@ -593,6 +593,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
break; break;
default: default:
cleanupChannel();
return erUnExpectedPacketType; return erUnExpectedPacketType;
} }
......
...@@ -224,3 +224,14 @@ mbErrCode ModbusTCPServer::pre_send_request( ModbusMessage& request ) ...@@ -224,3 +224,14 @@ mbErrCode ModbusTCPServer::pre_send_request( ModbusMessage& request )
return erNoError; return erNoError;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusTCPServer::cleanInputStream()
{
unsigned char buf[100];
int ret=0;
do
{
ret = getNextData(buf,sizeof(buf));
}
while( ret > 0);
}
// -------------------------------------------------------------------------
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