Commit 9d2c4f2c authored by Pavel Vainerman's avatar Pavel Vainerman

(modbus): Дореализовал обмен с RTU188

parent da5c851e
......@@ -3,7 +3,7 @@
Name: libuniset
Version: 1.3
Release: alt9
Release: alt10
Summary: UniSet - library for building distributed industrial control systems
License: GPL
Group: Development/C++
......@@ -213,6 +213,9 @@ rm -f %buildroot%_libdir/*.la
%changelog
* Fri Feb 24 2012 Pavel Vainerman <pv@altlinux.ru> 1.3-alt10
- (modbus): realized exchange with RTU188
* Wed Feb 22 2012 Pavel Vainerman <pv@altlinux.ru> 1.3-alt9
- (modbus): fixed bug in modbus exchange for RTU188 (initialization)
......
......@@ -1925,6 +1925,13 @@ bool MBExchange::initRTUDevice( RTUDevice* d, UniXML_iterator& it )
}
d->mbaddr = ModbusRTU::str2mbAddr(addr);
if( d->dtype == MBExchange::dtRTU188 )
{
if( !d->rtu )
d->rtu = new RTUStorage(d->mbaddr);
}
return true;
}
// ------------------------------------------------------------------------------------------
......
......@@ -131,11 +131,21 @@ ModbusClient* RTUExchange::initMB( bool reopen )
dlog[Debug::INFO] << myname << "(init): dev=" << devname << " speed=" << ComPort::getSpeed(defSpeed) << endl;
}
catch( Exception& ex )
{
if( mbrtu )
delete mbrtu;
mbrtu = 0;
dlog[Debug::WARN] << myname << "(init): " << ex << endl;
}
catch(...)
{
if( mbrtu )
delete mbrtu;
mbrtu = 0;
dlog[Debug::INFO] << myname << "(init): catch...." << endl;
}
mb = mbrtu;
......@@ -161,27 +171,39 @@ void RTUExchange::step()
// -----------------------------------------------------------------------------
void RTUExchange::poll()
{
if( trAllNotRespond.hi(allNotRespond) )
ptTimeout.reset();
if( allNotRespond && mb && ptTimeout.checkTime() )
{
ptTimeout.reset();
initMB(true);
}
if( !mb )
{
initMB(false);
if( !mb )
{
for( MBExchange::RTUDeviceMap::iterator it=rmap.begin(); it!=rmap.end(); ++it )
it->second->resp_real = false;
uniset_mutex_lock l(pollMutex, 300);
pollActivated = false;
mb = initMB(false);
if( !mb )
{
for( MBExchange::RTUDeviceMap::iterator it=rmap.begin(); it!=rmap.end(); ++it )
it->second->resp_real = false;
}
}
if( !checkProcActive() )
return;
updateSM();
allInitOK = false;
return;
}
{
uniset_mutex_lock l(pollMutex,200);
pollActivated = true;
ptTimeout.reset();
}
if( !allInitOK )
firstInitRegisters();
if( !checkProcActive() )
return;
ComPort::Speed s = mbrtu->getSpeed();
for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
......@@ -194,10 +216,7 @@ void RTUExchange::poll()
mbrtu->setSpeed(d->speed);
}
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(poll): ask addr=" << ModbusRTU::addr2str(d->mbaddr) << endl;
if( d->dtype==RTUExchange::dtRTU188 )
if( d->dtype == MBExchange::dtRTU188 )
{
if( !d->rtu )
continue;
......@@ -232,6 +251,10 @@ void RTUExchange::poll()
}
else
{
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(poll): ask addr=" << ModbusRTU::addr2str(d->mbaddr)
<< " regs=" << d->regmap.size() << endl;
d->resp_real = false;
for( RTUExchange::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
{
......@@ -262,6 +285,9 @@ void RTUExchange::poll()
if( it==d->regmap.end() )
break;
if( !checkProcActive() )
return;
}
}
}
......
......@@ -34,7 +34,7 @@ class RTUExchange:
bool transmitCtl;
virtual void step();
void poll();
virtual void poll();
virtual ModbusClient* initMB( bool reopen=false );
virtual bool initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML_iterator& it );
......
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