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

fixed minor bugs in ModbusTCPMaster

parent 1044b53c
......@@ -3,7 +3,7 @@
Name: libuniset
Version: 0.97
Release: eter30
Release: eter31
Summary: UniSet - library for building distributed industrial control systems
License: GPL
Group: Development/C++
......@@ -178,6 +178,9 @@ rm -f %buildroot%_libdir/*.la
%exclude %_pkgconfigdir/libUniSet.pc
%changelog
* Wed Oct 21 2009 Pavel Vainerman <pv@altlinux.ru> 0.97-eter30
- new build
* Sun Oct 18 2009 Pavel Vainerman <pv@altlinux.ru> 0.97-eter29
- new build
......
......@@ -335,7 +335,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<< " IGNORE register..." << endl;
return false;
}
switch( p->mbfunc )
{
case ModbusRTU::fnReadInputRegisters:
......@@ -392,6 +392,8 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<< " IGNORE WRITE SINGLE REGISTER (0x06) q_count=" << p->q_count << " ..." << endl;
return false;
}
cerr << "**** mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(dev->mbaddr,p->mbreg+p->offset,p->mbval);
}
break;
......@@ -415,6 +417,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return false;
}
cerr << "****(coil) mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
ModbusRTU::ForceSingleCoilRetMessage ret = mb->write05(dev->mbaddr,p->mbreg+p->offset,p->mbval);
}
break;
......
......@@ -54,6 +54,13 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
if( !isConnection() )
{
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): no connection.. reconnnect..." << endl;
reconnect();
}
if( !isConnection() )
{
dlog[Debug::WARN] << "(query): not connected to server..." << endl;
return erTimeOut;
}
......@@ -95,7 +102,13 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
return res;
if( !tcp->isPending(ost::Socket::pendingOutput,timeout) )
{
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): no write pending.. reconnnect.." << endl;
reconnect();
return erTimeOut;
}
if( timeout != UniSetTimer::WaitUpTime )
{
......@@ -174,21 +187,25 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
// -------------------------------------------------------------------------
void ModbusTCPMaster::reconnect()
{
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): reconnect " << iaddr << endl;
if( tcp )
{
tcp->disconnect();
delete tcp;
}
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): reconnect " << iaddr << endl;
tcp = new ost::TCPStream(iaddr.c_str());
}
// -------------------------------------------------------------------------
void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
{
if( !tcp )
{
if( tcp )
disconnect();
// if( !tcp )
// {
ostringstream s;
s << addr << ":" << port;
......@@ -197,17 +214,17 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
iaddr = s.str();
tcp = new ost::TCPStream(iaddr.c_str());
}
// }
}
// -------------------------------------------------------------------------
void ModbusTCPMaster::disconnect()
{
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): disconnect." << endl;
if( !tcp )
return;
// if( dlog.debugging(Debug::INFO) )
// dlog[Debug::INFO] << "(ModbusTCPMaster): disconnect." << endl;
tcp->disconnect();
delete tcp;
tcp = 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