Commit e2cbe9cd authored by Pavel Vainerman's avatar Pavel Vainerman

Merge branch 'new_mbtcp'

parents 2b9e27eb 337de1f1
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:49 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <sstream> #include <sstream>
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/08/28 20:55:53 $
* \version $Id: DBInterface.h,v 1.1 2005/08/28 20:55:53 vpashka Exp $
*/ */
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
#ifndef DBInterface_H_ #ifndef DBInterface_H_
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
/*! \file /*! \file
* \brief файл реализации DB-сервера * \brief файл реализации DB-сервера
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2009/02/26 19:55:37 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/08/28 20:55:53 $
* \version $Id: DBServer_MySQL.h,v 1.1 2005/08/28 20:55:53 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef DBServer_MySQL_H_ #ifndef DBServer_MySQL_H_
......
/*! $Id: MBSlave.h,v 1.6 2009/02/24 20:27:24 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef MBSlave_H_ #ifndef MBSlave_H_
#define MBSlave_H_ #define MBSlave_H_
......
/*! $Id: MBTCPServer.h,v 1.1 2008/11/22 23:22:23 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef MBTCPServer_H_ #ifndef MBTCPServer_H_
#define MBTCPServer_H_ #define MBTCPServer_H_
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
// $Id: NullController.h,v 1.11 2008/02/10 03:21:41 vpashka Exp $
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef NullController_H_ #ifndef NullController_H_
#define NullController_H_ #define NullController_H_
......
// $Id$
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef TestGen_H_ #ifndef TestGen_H_
#define TestGen_H_ #define TestGen_H_
......
// $Id$
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef TestGenAlone_H_ #ifndef TestGenAlone_H_
#define TestGenAlone_H_ #define TestGenAlone_H_
......
// $Id: ComediInterface.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef ComediInterface_H_ #ifndef ComediInterface_H_
#define ComediInterface_H_ #define ComediInterface_H_
......
// $Id: IOControl.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef IOControl_H_ #ifndef IOControl_H_
#define IOControl_H_ #define IOControl_H_
......
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <cmath> #include <cmath>
#include <limits>
#include <sstream> #include <sstream>
#include <Exceptions.h> #include <Exceptions.h>
#include <extensions/Extensions.h> #include <extensions/Extensions.h>
...@@ -12,6 +13,7 @@ using namespace UniSetExtensions; ...@@ -12,6 +13,7 @@ using namespace UniSetExtensions;
MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId,
SharedMemory* ic, const std::string prefix ): SharedMemory* ic, const std::string prefix ):
UniSetObject_LT(objId), UniSetObject_LT(objId),
allInitOK(false),
mb(0), mb(0),
shm(0), shm(0),
initPause(0), initPause(0),
...@@ -20,11 +22,11 @@ force_out(false), ...@@ -20,11 +22,11 @@ force_out(false),
mbregFromID(false), mbregFromID(false),
activated(false), activated(false),
noQueryOptimization(false), noQueryOptimization(false),
force_disconnect(false), force_disconnect(true),
allNotRespond(false),
prefix(prefix), prefix(prefix),
no_extimer(false), no_extimer(false),
poll_count(0) poll_count(0),
pollThread(0)
{ {
// cout << "$ $" << endl; // cout << "$ $" << endl;
...@@ -64,10 +66,10 @@ poll_count(0) ...@@ -64,10 +66,10 @@ poll_count(0)
throw UniSetTypes::SystemError(myname+"(MBMaster): Unknown inet port...(Use: " + tmp +")" ); throw UniSetTypes::SystemError(myname+"(MBMaster): Unknown inet port...(Use: " + tmp +")" );
recv_timeout = conf->getArgPInt("--" + prefix + "-recv-timeout",it.getProp("recv_timeout"), 50); recv_timeout = conf->getArgPInt("--" + prefix + "-recv-timeout",it.getProp("recv_timeout"), 500);
int alltout = conf->getArgPInt("--" + prefix + "-all-timeout",it.getProp("all_timeout"), 2000); int tout = conf->getArgPInt("--" + prefix + "-timeout",it.getProp("timeout"), 5000);
ptAllNotRespond.setTiming(alltout); ptTimeout.setTiming(tout);
noQueryOptimization = conf->getArgInt("--" + prefix + "-no-query-optimization",it.getProp("no_query_optimization")); noQueryOptimization = conf->getArgInt("--" + prefix + "-no-query-optimization",it.getProp("no_query_optimization"));
...@@ -80,7 +82,9 @@ poll_count(0) ...@@ -80,7 +82,9 @@ poll_count(0)
force = conf->getArgInt("--" + prefix + "-force",it.getProp("force")); force = conf->getArgInt("--" + prefix + "-force",it.getProp("force"));
force_out = conf->getArgInt("--" + prefix + "-force-out",it.getProp("force_out")); force_out = conf->getArgInt("--" + prefix + "-force-out",it.getProp("force_out"));
force_disconnect = conf->getArgInt("--" + prefix + "-force-disconnect",it.getProp("force_disconnect"));
force_disconnect = conf->getArgInt("--" + prefix + "-persistent-connection",it.getProp("persistent_connection")) ? false : true;
dlog[Debug::INFO] << myname << "(init): persisten-connection=" << (!force_disconnect) << endl;
if( shm->isLocalwork() ) if( shm->isLocalwork() )
{ {
...@@ -135,6 +139,8 @@ poll_count(0) ...@@ -135,6 +139,8 @@ poll_count(0)
// abort(); // abort();
poll_count = -1; poll_count = -1;
pollThread = new ThreadCreator<MBTCPMaster>(this, &MBTCPMaster::poll_thread);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBTCPMaster::~MBTCPMaster() MBTCPMaster::~MBTCPMaster()
...@@ -147,7 +153,8 @@ MBTCPMaster::~MBTCPMaster() ...@@ -147,7 +153,8 @@ MBTCPMaster::~MBTCPMaster()
delete it1->second; delete it1->second;
} }
delete pollThread;
delete mb; delete mb;
delete shm; delete shm;
} }
...@@ -190,6 +197,8 @@ void MBTCPMaster::initMB( bool reopen ) ...@@ -190,6 +197,8 @@ void MBTCPMaster::initMB( bool reopen )
delete mb; delete mb;
mb = 0; mb = 0;
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBTCPMaster::waitSMReady() void MBTCPMaster::waitSMReady()
...@@ -223,11 +232,8 @@ void MBTCPMaster::timerInfo( TimerMessage *tm ) ...@@ -223,11 +232,8 @@ void MBTCPMaster::timerInfo( TimerMessage *tm )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBTCPMaster::step() void MBTCPMaster::step()
{ {
{ updateRespondSensors();
uniset_mutex_lock l(pollMutex,2000);
poll();
}
if( !activated ) if( !activated )
return; return;
...@@ -247,30 +253,121 @@ void MBTCPMaster::step() ...@@ -247,30 +253,121 @@ void MBTCPMaster::step()
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBTCPMaster::poll() void MBTCPMaster::updateRespondSensors()
{ {
if( trAllNotRespond.hi(allNotRespond) ) bool tcpIsTimeout = false;
ptAllNotRespond.reset();
if( allNotRespond && mb && ptAllNotRespond.checkTime() )
{ {
ptAllNotRespond.reset(); uniset_mutex_lock l(tcpMutex);
// initMB(true); tcpIsTimeout = pollActivated && ptTimeout.checkTime();
} }
if( dlog.debugging(Debug::LEVEL4) )
dlog[Debug::LEVEL4] << myname << ": tcpTimeout=" << tcpIsTimeout << endl;
for( MBTCPMaster::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{
RTUDevice* d(it1->second);
if( tcpIsTimeout )
d->resp_real = false;
if( dlog.debugging(Debug::LEVEL4) )
{
dlog[Debug::LEVEL4] << myname << ": check respond addr=" << ModbusRTU::addr2str(d->mbaddr)
<< " respond_id=" << d->resp_id
<< " real=" << d->resp_real
<< " state=" << d->resp_state
<< endl;
}
if( d->checkRespond() && d->resp_id != DefaultObjectId )
{
try
{
bool set = d->resp_invert ? !d->resp_state : d->resp_state;
shm->localSaveState(d->resp_dit,d->resp_id,set,getId());
}
catch( Exception& ex )
{
dlog[Debug::CRIT] << myname << "(step): (respond) " << ex << std::endl;
}
}
}
}
// -----------------------------------------------------------------------------
void MBTCPMaster::poll_thread()
{
cerr << "*********** polling starting.." << endl;
{
uniset_mutex_lock l(pollMutex,300);
ptTimeout.reset();
}
while( checkProcActive() )
{
try
{
poll();
}
catch(...){}
if( !checkProcActive() )
break;
msleep(polltime);
}
cerr << "*********** polling finished.." << endl;
}
// -----------------------------------------------------------------------------
bool MBTCPMaster::checkProcActive()
{
uniset_mutex_lock l(actMutex, 300);
return activated;
}
// -----------------------------------------------------------------------------
void MBTCPMaster::setProcActive( bool st )
{
uniset_mutex_lock l(actMutex, 400);
activated = st;
}
// -----------------------------------------------------------------------------
void MBTCPMaster::poll()
{
if( !mb ) if( !mb )
{ {
initMB(false);
if( !mb )
{ {
for( MBTCPMaster::RTUDeviceMap::iterator it=rmap.begin(); it!=rmap.end(); ++it ) uniset_mutex_lock l(pollMutex, 300);
it->second->resp_real = false; pollActivated = false;
initMB(false);
if( !mb )
{
for( MBTCPMaster::RTUDeviceMap::iterator it=rmap.begin(); it!=rmap.end(); ++it )
it->second->resp_real = false;
}
} }
if( !checkProcActive() )
return;
updateSM(); updateSM();
allInitOK = false;
return; return;
} }
{
uniset_mutex_lock l(pollMutex);
pollActivated = true;
ptTimeout.reset();
}
if( !allInitOK )
firstInitRegisters();
if( !checkProcActive() )
return;
for( MBTCPMaster::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 ) for( MBTCPMaster::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{ {
RTUDevice* d(it1->second); RTUDevice* d(it1->second);
...@@ -282,6 +379,9 @@ void MBTCPMaster::poll() ...@@ -282,6 +379,9 @@ void MBTCPMaster::poll()
d->resp_real = false; d->resp_real = false;
for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it ) for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
{ {
if( !checkProcActive() )
return;
try try
{ {
if( d->dtype==MBTCPMaster::dtRTU || d->dtype==MBTCPMaster::dtMTR ) if( d->dtype==MBTCPMaster::dtRTU || d->dtype==MBTCPMaster::dtMTR )
...@@ -304,12 +404,19 @@ void MBTCPMaster::poll() ...@@ -304,12 +404,19 @@ void MBTCPMaster::poll()
// } // }
// d->resp_real = false; // d->resp_real = false;
if( !d->ask_every_reg ) if( ex.err == ModbusRTU::erTimeOut && !d->ask_every_reg )
break; break;
// если контроллер хоть что-то ответил, то вроде как связь есть..
if( ex.err != ModbusRTU::erTimeOut )
d->resp_real = true;
} }
if( it==d->regmap.end() ) if( it==d->regmap.end() )
break; break;
if( !checkProcActive() )
return;
} }
if( stat_time > 0 ) if( stat_time > 0 )
...@@ -326,6 +433,14 @@ void MBTCPMaster::poll() ...@@ -326,6 +433,14 @@ void MBTCPMaster::poll()
// mb->disconnect(); // mb->disconnect();
} }
{
uniset_mutex_lock l(pollMutex);
pollActivated = false;
}
if( !checkProcActive() )
return;
// update SharedMemory... // update SharedMemory...
updateSM(); updateSM();
...@@ -335,6 +450,9 @@ void MBTCPMaster::poll() ...@@ -335,6 +450,9 @@ void MBTCPMaster::poll()
RTUDevice* d(it1->second); RTUDevice* d(it1->second);
for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it ) for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
{ {
if( !checkProcActive() )
return;
RegInfo* r(it->second); RegInfo* r(it->second);
for( PList::iterator i=r->slst.begin(); i!=r->slst.end(); ++i ) for( PList::iterator i=r->slst.begin(); i!=r->slst.end(); ++i )
IOBase::processingThreshold( &(*i),shm,force); IOBase::processingThreshold( &(*i),shm,force);
...@@ -353,10 +471,11 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -353,10 +471,11 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
dlog[Debug::LEVEL3] << myname << "(pollRTU): poll " dlog[Debug::LEVEL3] << myname << "(pollRTU): poll "
<< " mbaddr=" << ModbusRTU::addr2str(dev->mbaddr) << " mbaddr=" << ModbusRTU::addr2str(dev->mbaddr)
<< " mbreg=" << ModbusRTU::dat2str(p->mbreg) << " mbreg=" << ModbusRTU::dat2str(p->mbreg)
<< " mboffset=" << p->offset
<< " mbfunc=" << p->mbfunc << " mbfunc=" << p->mbfunc
<< " q_count=" << p->q_count << " q_count=" << p->q_count
<< " mb_init=" << p->mb_init << " mb_initOK=" << p->mb_initOK
<< " sm_initOK=" << p->sm_initOK
<< " mbval=" << p->mbval
<< endl; << endl;
if( p->q_count > ModbusRTU::MAXDATALEN ) if( p->q_count > ModbusRTU::MAXDATALEN )
...@@ -381,7 +500,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -381,7 +500,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
{ {
case ModbusRTU::fnReadInputRegisters: case ModbusRTU::fnReadInputRegisters:
{ {
ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr,p->mbreg+p->offset,p->q_count); ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr,p->mbreg,p->q_count);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i]; it->second->mbval = ret.data[i];
it--; it--;
...@@ -390,7 +509,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -390,7 +509,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case ModbusRTU::fnReadOutputRegisters: case ModbusRTU::fnReadOutputRegisters:
{ {
ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr, p->mbreg+p->offset,p->q_count); ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr, p->mbreg,p->q_count);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i]; it->second->mbval = ret.data[i];
it--; it--;
...@@ -399,7 +518,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -399,7 +518,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case ModbusRTU::fnReadInputStatus: case ModbusRTU::fnReadInputStatus:
{ {
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr,p->mbreg+p->offset,p->q_count); ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr,p->mbreg,p->q_count);
int m=0; int m=0;
for( int i=0; i<ret.bcnt; i++ ) for( int i=0; i<ret.bcnt; i++ )
{ {
...@@ -413,7 +532,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -413,7 +532,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case ModbusRTU::fnReadCoilStatus: case ModbusRTU::fnReadCoilStatus:
{ {
ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr,p->mbreg+p->offset,p->q_count); ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr,p->mbreg,p->q_count);
int m = 0; int m = 0;
for( int i=0; i<ret.bcnt; i++ ) for( int i=0; i<ret.bcnt; i++ )
{ {
...@@ -434,39 +553,33 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -434,39 +553,33 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return false; return false;
} }
if( !p->mb_init ) if( !p->sm_initOK )
{ {
// cerr << "******* mb_init: mbreg=" << ModbusRTU::dat2str(p->mbreg) << endl; if( dlog.debugging(Debug::LEVEL3) )
ModbusRTU::ReadInputRetMessage ret1 = mb->read04(dev->mbaddr,p->mb_init_mbreg,1); dlog[Debug::LEVEL3] << myname << "(pollRTU): mbreg=" << ModbusRTU::dat2str(p->mbreg)
p->mbval = ret1.data[0]; << " IGNORE...(sm_initOK=false)" << endl;
p->sm_init = true;
return true; return true;
} }
// cerr << "**** mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl; // 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); ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(dev->mbaddr,p->mbreg,p->mbval);
} }
break; break;
case ModbusRTU::fnWriteOutputRegisters: case ModbusRTU::fnWriteOutputRegisters:
{ {
ModbusRTU::WriteOutputMessage msg(dev->mbaddr,p->mbreg+p->offset); if( !p->sm_initOK )
for( int i=0; i<p->q_count; i++,it++ )
{ {
if( !it->second->mb_init ) if( dlog.debugging(Debug::LEVEL3) )
{ dlog[Debug::LEVEL3] << myname << "(pollRTU): mbreg=" << ModbusRTU::dat2str(p->mbreg)
// cerr << "******* mb_init: mbreg=" << ModbusRTU::dat2str(it->second->mbreg) << " IGNORE...(sm_initOK=false)" << endl;
// << " mb_init mbreg=" << ModbusRTU::dat2str(it->second->mb_init_mbreg) << endl; return true;
ModbusRTU::ReadOutputRetMessage ret1 = mb->read03(dev->mbaddr,it->second->mb_init_mbreg,1); }
// cerr << "******* mb_init: mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " mb_init mbreg=" << ModbusRTU::dat2str(it->second->mb_init_mbreg) ModbusRTU::WriteOutputMessage msg(dev->mbaddr,p->mbreg);
// << " mbval=" << ret1.data[0] << endl; for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret1.data[0];
it->second->sm_init = true;
}
msg.addData(it->second->mbval); msg.addData(it->second->mbval);
}
it--; it--;
ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg); ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg);
} }
...@@ -480,57 +593,30 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -480,57 +593,30 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<< " IGNORE FORCE SINGLE COIL (0x05) q_count=" << p->q_count << " ..." << endl; << " IGNORE FORCE SINGLE COIL (0x05) q_count=" << p->q_count << " ..." << endl;
return false; return false;
} }
if( !p->sm_initOK )
if( !p->mb_init )
{ {
// cerr << "******* mb_init: mbreg=" << ModbusRTU::dat2str(p->mbreg) if( dlog.debugging(Debug::LEVEL3) )
// << " init mbreg=" << ModbusRTU::dat2str(p->mb_init_mbreg) << endl; dlog[Debug::LEVEL3] << myname << "(pollRTU): mbreg=" << ModbusRTU::dat2str(p->mbreg)
ModbusRTU::ReadInputStatusRetMessage ret1 = mb->read02(dev->mbaddr,p->mb_init_mbreg,1); << " IGNORE...(sm_initOK=false)" << endl;
ModbusRTU::DataBits b(ret1.data[0]);
// cerr << "******* mb_init_mbreg=" << ModbusRTU::dat2str(p->mb_init_mbreg)
// << " read val=" << (int)b[0] << endl;
p->mbval = b[0];
p->sm_init = true;
return true; return true;
} }
// cerr << "****(coil) mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl; // 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); ModbusRTU::ForceSingleCoilRetMessage ret = mb->write05(dev->mbaddr,p->mbreg,p->mbval);
} }
break; break;
case ModbusRTU::fnForceMultipleCoils: case ModbusRTU::fnForceMultipleCoils:
{ {
if( !p->mb_init ) if( !p->sm_initOK )
{ {
// every register ask... (for mb_init_mbreg no some) if( dlog.debugging(Debug::LEVEL3) )
for( int i=0; i<p->q_count; i++,it++ ) dlog[Debug::LEVEL3] << myname << "(pollRTU): mbreg=" << ModbusRTU::dat2str(p->mbreg)
{ << " IGNORE...(sm_initOK=false)" << endl;
ModbusRTU::ReadInputStatusRetMessage ret1 = mb->read02(dev->mbaddr,it->second->mb_init_mbreg,1);
ModbusRTU::DataBits b(ret1.data[0]);
it->second->mbval = b[0] ? 1 : 0;
it->second->sm_init = true;
}
/*
// alone query for all register (if mb_init_mbreg ++ )
ModbusRTU::ReadInputStatusRetMessage ret1 = mb->read02(dev->mbaddr,p->mb_init_mbreg,p->q_count);
int m=0;
for( int i=0; i<ret1.bcnt; i++ )
{
ModbusRTU::DataBits b(ret1.data[i]);
for( int k=0;k<ModbusRTU::BitsPerByte && m<p->q_count; k++,it++,m++ )
{
it->second->mbval = b[k] ? 1 : 0;
it->second->sm_init = true;
}
}
*/
p->sm_init = true;
it--;
return true; return true;
} }
ModbusRTU::ForceCoilsMessage msg(dev->mbaddr,p->mbreg+p->offset); ModbusRTU::ForceCoilsMessage msg(dev->mbaddr,p->mbreg);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
msg.addBit( (it->second->mbval ? true : false) ); msg.addBit( (it->second->mbval ? true : false) );
...@@ -553,9 +639,259 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -553,9 +639,259 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return true; return true;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBTCPMaster::firstInitRegisters()
{
// если все вернут TRUE, значит OK.
allInitOK = true;
for( InitList::iterator it=initRegList.begin(); it!=initRegList.end(); ++it )
{
try
{
it->initOK = preInitRead( it );
allInitOK = it->initOK;
}
catch( ModbusRTU::mbException& ex )
{
allInitOK = false;
if( dlog.debugging(Debug::LEVEL3) )
{
dlog[Debug::LEVEL3] << myname << "(preInitRead): FAILED ask addr=" << ModbusRTU::addr2str(it->dev->mbaddr)
<< " reg=" << ModbusRTU::dat2str(it->mbreg)
<< " err: " << ex << endl;
}
if( !it->dev->ask_every_reg )
break;
}
}
}
// -----------------------------------------------------------------------------
bool MBTCPMaster::preInitRead( InitList::iterator& p )
{
if( p->initOK )
return true;
RTUDevice* dev = p->dev;
int q_count = p->p.rnum;
if( dlog.debugging(Debug::LEVEL3) )
{
dlog[Debug::LEVEL3] << myname << "(preInitRead): poll "
<< " mbaddr=" << ModbusRTU::addr2str(dev->mbaddr)
<< " mbreg=" << ModbusRTU::dat2str(p->mbreg)
<< " mbfunc=" << p->mbfunc
<< " q_count=" << q_count
<< endl;
if( q_count > ModbusRTU::MAXDATALEN )
{
dlog[Debug::LEVEL3] << myname << "(preInitRead): count(" << q_count
<< ") > MAXDATALEN(" << ModbusRTU::MAXDATALEN
<< " ..ignore..."
<< endl;
}
}
switch( p->mbfunc )
{
case ModbusRTU::fnReadOutputRegisters:
{
ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr,p->mbreg,q_count);
p->initOK = initSMValue(ret.data, ret.count,&(p->p));
}
break;
case ModbusRTU::fnReadInputRegisters:
{
ModbusRTU::ReadInputRetMessage ret1 = mb->read04(dev->mbaddr,p->mbreg,q_count);
p->initOK = initSMValue(ret1.data,ret1.count, &(p->p));
}
break;
case ModbusRTU::fnReadInputStatus:
{
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr,p->mbreg,q_count);
ModbusRTU::ModbusData* dat = new ModbusRTU::ModbusData[q_count];
int m=0;
for( int i=0; i<ret.bcnt; i++ )
{
ModbusRTU::DataBits b(ret.data[i]);
for( int k=0;k<ModbusRTU::BitsPerByte && m<q_count; k++,m++ )
dat[m] = b[k];
}
p->initOK = initSMValue(dat,q_count, &(p->p));
delete[] dat;
}
break;
case ModbusRTU::fnReadCoilStatus:
{
ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr,p->mbreg,q_count);
ModbusRTU::ModbusData* dat = new ModbusRTU::ModbusData[q_count];
int m = 0;
for( int i=0; i<ret.bcnt; i++ )
{
ModbusRTU::DataBits b(ret.data[i]);
for( int k=0;k<ModbusRTU::BitsPerByte && m<q_count; k++,m++ )
dat[m] = b[k];
}
p->initOK = initSMValue(dat,q_count, &(p->p));
delete[] dat;
}
break;
default:
p->initOK = false;
break;
}
if( p->initOK )
{
p->ri->mb_initOK = true;
p->ri->sm_initOK = false;
bool f_out = force_out;
// выставляем флаг принудительного обновления
force_out = true;
updateRTU(p->ri->rit);
force_out = f_out;
}
return p->initOK;
}
// -----------------------------------------------------------------------------
bool MBTCPMaster::initSMValue( ModbusRTU::ModbusData* data, int count, RSProperty* p )
{
using namespace ModbusRTU;
try
{
if( p->vType == VTypes::vtUnknown )
{
ModbusRTU::DataBits16 b(data[0]);
if( p->nbit >= 0 )
{
bool set = b[p->nbit];
IOBase::processingAsDI( p, set, shm, force );
return true;
}
if( p->rnum <= 1 )
{
if( p->stype == UniversalIO::DigitalInput ||
p->stype == UniversalIO::DigitalOutput )
{
IOBase::processingAsDI( p, data[0], shm, force );
}
else
IOBase::processingAsAI( p, (signed short)(data[0]), shm, force );
return true;
}
dlog[Debug::CRIT] << myname << "(initSMValue): IGNORE item: rnum=" << p->rnum
<< " > 1 ?!! for id=" << p->si.id << endl;
return false;
}
else if( p->vType == VTypes::vtSigned )
{
if( p->stype == UniversalIO::DigitalInput ||
p->stype == UniversalIO::DigitalOutput )
{
IOBase::processingAsDI( p, data[0], shm, force );
}
else
IOBase::processingAsAI( p, (signed short)(data[0]), shm, force );
return true;
}
else if( p->vType == VTypes::vtUnsigned )
{
if( p->stype == UniversalIO::DigitalInput ||
p->stype == UniversalIO::DigitalOutput )
{
IOBase::processingAsDI( p, data[0], shm, force );
}
else
IOBase::processingAsAI( p, (unsigned short)data[0], shm, force );
return true;
}
else if( p->vType == VTypes::vtByte )
{
if( p->nbyte <= 0 || p->nbyte > VTypes::Byte::bsize )
{
dlog[Debug::CRIT] << myname << "(initSMValue): IGNORE item: sid=" << ModbusRTU::dat2str(p->si.id)
<< " vtype=" << p->vType << " but nbyte=" << p->nbyte << endl;
return false;
}
VTypes::Byte b(data[0]);
IOBase::processingAsAI( p, b.raw.b[p->nbyte-1], shm, force );
return true;
}
else if( p->vType == VTypes::vtF2 )
{
VTypes::F2 f(data,VTypes::F2::wsize());
IOBase::processingFasAI( p, (float)f, shm, force );
}
else if( p->vType == VTypes::vtF4 )
{
VTypes::F4 f(data,VTypes::F4::wsize());
IOBase::processingFasAI( p, (float)f, shm, force );
}
else if( p->vType == VTypes::vtI2 )
{
VTypes::I2 i2(data,VTypes::I2::wsize());
IOBase::processingAsAI( p, (int)i2, shm, force );
}
else if( p->vType == VTypes::vtU2 )
{
VTypes::U2 u2(data,VTypes::U2::wsize());
IOBase::processingAsAI( p, (unsigned int)u2, shm, force );
}
return true;
}
catch(IOController_i::NameNotFound &ex)
{
dlog[Debug::LEVEL3] << myname << "(initSMValue):(NameNotFound) " << ex.err << endl;
}
catch(IOController_i::IOBadParam& ex )
{
dlog[Debug::LEVEL3] << myname << "(initSMValue):(IOBadParam) " << ex.err << endl;
}
catch(IONotifyController_i::BadRange )
{
dlog[Debug::LEVEL3] << myname << "(initSMValue): (BadRange)..." << endl;
}
catch( Exception& ex )
{
dlog[Debug::LEVEL3] << myname << "(initSMValue): " << ex << endl;
}
catch(CORBA::SystemException& ex)
{
dlog[Debug::LEVEL3] << myname << "(initSMValue): CORBA::SystemException: "
<< ex.NP_minorString() << endl;
}
catch(...)
{
dlog[Debug::LEVEL3] << myname << "(initSMValue): catch ..." << endl;
}
return false;
}
// -----------------------------------------------------------------------------
bool MBTCPMaster::RTUDevice::checkRespond() bool MBTCPMaster::RTUDevice::checkRespond()
{ {
bool prev = resp_state; bool prev = resp_state;
if( resp_ptTimeout.getInterval() <= 0 )
{
resp_state = resp_real;
return (prev != resp_state);
}
if( resp_trTimeout.hi(resp_real) ) if( resp_trTimeout.hi(resp_real) )
{ {
if( resp_real ) if( resp_real )
...@@ -582,38 +918,13 @@ bool MBTCPMaster::RTUDevice::checkRespond() ...@@ -582,38 +918,13 @@ bool MBTCPMaster::RTUDevice::checkRespond()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBTCPMaster::updateSM() void MBTCPMaster::updateSM()
{ {
allNotRespond = true;
for( MBTCPMaster::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 ) for( MBTCPMaster::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{ {
RTUDevice* d(it1->second); RTUDevice* d(it1->second);
if( dlog.debugging(Debug::LEVEL4) )
{
dlog[Debug::LEVEL4] << "check respond addr=" << ModbusRTU::addr2str(d->mbaddr)
<< " respond=" << d->resp_id
<< " real=" << d->resp_real
<< " state=" << d->resp_state
<< endl;
}
if( d->resp_real )
allNotRespond = false;
// update respond sensors...
if( d->checkRespond() && d->resp_id != DefaultObjectId )
{
try
{
bool set = d->resp_invert ? !d->resp_state : d->resp_state;
shm->localSaveState(d->resp_dit,d->resp_id,set,getId());
}
catch(Exception& ex)
{
dlog[Debug::CRIT] << myname
<< "(step): (respond) " << ex << std::endl;
}
}
// cerr << "*********** allNotRespond=" << allNotRespond << endl; // обновление датчиков связи происходит в другом потоке
// чтобы не зависеть от TCP таймаутов
// см. updateRespondSensors()
// update values... // update values...
for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it ) for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
...@@ -746,15 +1057,8 @@ void MBTCPMaster::sysCommand( UniSetTypes::SystemMessage *sm ) ...@@ -746,15 +1057,8 @@ void MBTCPMaster::sysCommand( UniSetTypes::SystemMessage *sm )
initOutput(); initOutput();
} }
// начальная инициализация
if( !force )
{
uniset_mutex_lock l(pollMutex,2000);
force = true;
poll();
force = false;
}
askTimer(tmExchange,polltime); askTimer(tmExchange,polltime);
pollThread->start();
break; break;
} }
...@@ -881,14 +1185,14 @@ void MBTCPMaster::sensorInfo( UniSetTypes::SensorMessage* sm ) ...@@ -881,14 +1185,14 @@ void MBTCPMaster::sensorInfo( UniSetTypes::SensorMessage* sm )
dlog[Debug::INFO] << myname<< "(sensorInfo): si.id=" << sm->id dlog[Debug::INFO] << myname<< "(sensorInfo): si.id=" << sm->id
<< " reg=" << ModbusRTU::dat2str(i->reg->mbreg) << " reg=" << ModbusRTU::dat2str(i->reg->mbreg)
<< " val=" << sm->value << " val=" << sm->value
<< " mb_init=" << i->reg->mb_init << endl; << " mb_initOK=" << i->reg->mb_initOK << endl;
} }
if( !i->reg->mb_init ) if( !i->reg->mb_initOK )
continue; continue;
i->value = sm->value; i->value = sm->value;
updateRSProperty( &(*i),true); updateRSProperty( &(*i),true );
return; return;
} }
} }
...@@ -902,13 +1206,13 @@ bool MBTCPMaster::activateObject() ...@@ -902,13 +1206,13 @@ bool MBTCPMaster::activateObject()
// пока не пройдёт инициализация датчиков // пока не пройдёт инициализация датчиков
// см. sysCommand() // см. sysCommand()
{ {
activated = false; setProcActive(false);
UniSetTypes::uniset_mutex_lock l(mutex_start, 5000); UniSetTypes::uniset_mutex_lock l(mutex_start, 5000);
UniSetObject_LT::activateObject(); UniSetObject_LT::activateObject();
if( !shm->isLocalwork() ) if( !shm->isLocalwork() )
rtuQueryOptimization(rmap); rtuQueryOptimization(rmap);
initIterators(); initIterators();
activated = true; setProcActive(true);
} }
return true; return true;
...@@ -917,7 +1221,7 @@ bool MBTCPMaster::activateObject() ...@@ -917,7 +1221,7 @@ bool MBTCPMaster::activateObject()
void MBTCPMaster::sigterm( int signo ) void MBTCPMaster::sigterm( int signo )
{ {
cerr << myname << ": ********* SIGTERM(" << signo <<") ********" << endl; cerr << myname << ": ********* SIGTERM(" << signo <<") ********" << endl;
activated = false; setProcActive(false);
/*! \todo Доделать выставление безопасного состояния на выходы. /*! \todo Доделать выставление безопасного состояния на выходы.
И нужно ли это. Ведь может не хватить времени на "обмен" И нужно ли это. Ведь может не хватить времени на "обмен"
...@@ -961,7 +1265,7 @@ void MBTCPMaster::readConfiguration() ...@@ -961,7 +1265,7 @@ void MBTCPMaster::readConfiguration()
UniXML_iterator it(root); UniXML_iterator it(root);
if( !it.goChildren() ) if( !it.goChildren() )
{ {
std::cerr << myname << "(readConfiguration): раздел <sensors> не содержит секций ?!!\n"; dlog[Debug::CRIT] << myname << "(readConfiguration): раздел <sensors> не содержит секций ?!!\n";
return; return;
} }
...@@ -1032,23 +1336,23 @@ MBTCPMaster::RTUDevice* MBTCPMaster::addDev( RTUDeviceMap& mp, ModbusRTU::Modbus ...@@ -1032,23 +1336,23 @@ MBTCPMaster::RTUDevice* MBTCPMaster::addDev( RTUDeviceMap& mp, ModbusRTU::Modbus
return d; return d;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, ModbusRTU::ModbusData r, MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, RegID id, ModbusRTU::ModbusData r,
UniXML_iterator& xmlit, MBTCPMaster::RTUDevice* dev, UniXML_iterator& xmlit, MBTCPMaster::RTUDevice* dev,
MBTCPMaster::RegInfo* rcopy ) MBTCPMaster::RegInfo* rcopy )
{ {
RegMap::iterator it = mp.find(r); RegMap::iterator it = mp.find(id);
if( it != mp.end() ) if( it != mp.end() )
{ {
if( !it->second->dev ) if( !it->second->dev )
{ {
dlog[Debug::CRIT] << myname << "(addReg): for reg=" << ModbusRTU::dat2str(r) dlog[Debug::CRIT] << myname << "(addReg): for " << xmlit.getProp("name")
<< " dev=0!!!! " << endl; << " dev=0!!!! " << endl;
return 0; return 0;
} }
if( it->second->dev->dtype != dev->dtype ) if( it->second->dev->dtype != dev->dtype )
{ {
dlog[Debug::CRIT] << myname << "(addReg): OTHER mbtype=" << dev->dtype << " for reg=" << ModbusRTU::dat2str(r) dlog[Debug::CRIT] << myname << "(addReg): OTHER mbtype=" << dev->dtype << " for " << xmlit.getProp("name")
<< ". Already used devtype=" << it->second->dev->dtype << " for " << it->second->dev << endl; << ". Already used devtype=" << it->second->dev->dtype << " for " << it->second->dev << endl;
return 0; return 0;
} }
...@@ -1080,9 +1384,11 @@ MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, ModbusRTU::ModbusData r, ...@@ -1080,9 +1384,11 @@ MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, ModbusRTU::ModbusData r,
} }
ri->mbreg = r; ri->mbreg = r;
} }
ri->id = id;
mp.insert(RegMap::value_type(r,ri)); mp.insert(RegMap::value_type(id,ri));
ri->rit = mp.find(r); ri->rit = mp.find(id);
return ri; return ri;
} }
...@@ -1190,8 +1496,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT ...@@ -1190,8 +1496,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
{ {
r->dev = dev; r->dev = dev;
r->mbval = it.getIntProp("default"); r->mbval = it.getIntProp("default");
r->offset = it.getIntProp("tcp_mboffset");
r->mb_init = it.getIntProp("tcp_mbinit");
if( dev->dtype == MBTCPMaster::dtRTU ) if( dev->dtype == MBTCPMaster::dtRTU )
{ {
...@@ -1228,19 +1532,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT ...@@ -1228,19 +1532,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
r->mbreg = ModbusRTU::str2mbData(sr); r->mbreg = ModbusRTU::str2mbData(sr);
} }
{
string sr = it.getProp("tcp_init_mbreg");
if( sr == "-1" )
{
r->mb_init = true; // OFF mb_init
r->sm_init = true;
}
else if( sr.empty() )
r->mb_init_mbreg = r->mbreg;
else
r->mb_init_mbreg = ModbusRTU::str2mbData(sr);
}
r->mbfunc = ModbusRTU::fnUnknown; r->mbfunc = ModbusRTU::fnUnknown;
string f = it.getProp("tcp_mbfunc"); string f = it.getProp("tcp_mbfunc");
if( !f.empty() ) if( !f.empty() )
...@@ -1253,7 +1544,7 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT ...@@ -1253,7 +1544,7 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
return false; return false;
} }
} }
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -1294,7 +1585,15 @@ bool MBTCPMaster::initRTUDevice( RTUDevice* d, UniXML_iterator& it ) ...@@ -1294,7 +1585,15 @@ bool MBTCPMaster::initRTUDevice( RTUDevice* d, UniXML_iterator& it )
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
MBTCPMaster::RegID MBTCPMaster::genRegID( const ModbusRTU::ModbusData mbreg, const int fn )
{
// формула для вычисления ID
// требования:
// - ID > диапазона возможных регитров
// - разные функции должны давать разный ID
return numeric_limits<ModbusRTU::ModbusData>::max() + mbreg + fn;
}
// ------------------------------------------------------------------------------------------
bool MBTCPMaster::initItem( UniXML_iterator& it ) bool MBTCPMaster::initItem( UniXML_iterator& it )
{ {
RSProperty p; RSProperty p;
...@@ -1304,7 +1603,7 @@ bool MBTCPMaster::initItem( UniXML_iterator& it ) ...@@ -1304,7 +1603,7 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
string addr = it.getProp("tcp_mbaddr"); string addr = it.getProp("tcp_mbaddr");
if( addr.empty() ) if( addr.empty() )
{ {
dlog[Debug::CRIT] << myname << "(initItem): Unknown mbaddr='" << addr << " for " << it.getProp("name") << endl; dlog[Debug::CRIT] << myname << "(initItem): Unknown mbaddr='" << addr << "' for " << it.getProp("name") << endl;
return false; return false;
} }
...@@ -1332,7 +1631,15 @@ bool MBTCPMaster::initItem( UniXML_iterator& it ) ...@@ -1332,7 +1631,15 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
mbreg = ModbusRTU::str2mbData(reg); mbreg = ModbusRTU::str2mbData(reg);
} }
RegInfo* ri = addReg(dev->regmap,mbreg,it,dev); int fn = it.getIntProp("tcp_mbfunc");
// формула для вычисления ID
// требования:
// - ID > диапазона возможных регитров
// - разные функции должны давать разный ID
RegID rID = genRegID(mbreg,fn);
RegInfo* ri = addReg(dev->regmap,rID,mbreg,it,dev);
if( dev->dtype == dtMTR ) if( dev->dtype == dtMTR )
{ {
...@@ -1349,16 +1656,16 @@ bool MBTCPMaster::initItem( UniXML_iterator& it ) ...@@ -1349,16 +1656,16 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
ri->dev = dev; ri->dev = dev;
// п÷п═п·п▓п•п═п п░! // ПРОВЕРКА!
// п╣я│п╩п╦ я└я┐п╫п╨я├п╦я▐ п╫п╟ п╥п╟п©п╦я│я▄, я┌п╬ п╫п╟п╢п╬ п©я─п╬п╡п╣я─п╦я┌я▄ // если функция на запись, то надо проверить
// я┤я┌п╬ п╬п╢п╦п╫ п╦ я┌п╬я┌п╤п╣ я─п╣пЁп╦я│я┌я─ п╫п╣ п©п╣я─п╣п╥п╟п©п╦я┬я┐я┌ п╫п╣я│п╨п╬п╩я▄п╨п╬ п╢п╟я┌я┤п╦п╨п╬п╡ // что один и тотже регистр не перезапишут несколько датчиков
// я█я┌п╬ п╡п╬п╥п╪п╬п╤п╫п╬ я┌п╬п╩я▄п╨п╬, п╣я│п╩п╦ п╬п╫п╦ п©п╦я┬я┐я┌ п╠п╦я┌я▀!! // это возможно только, если они пишут биты!!
// п≤п╒п·п⌠: // ИТОГ:
// п•я│п╩п╦ п╢п╩я▐ я└я┐п╫п╨я├п╦п╧ п╥п╟п©п╦я│п╦ я│п©п╦я│п╬п╨ п╢п╟я┌я┤п╦п╨п╬п╡ п╫п╟ п╬п╢п╦п╫ я─п╣пЁп╦я│я┌я─ > 1 // Если для функций записи список датчиков для регистра > 1
// п╥п╫п╟я┤п╦я┌ п╡ я│п©п╦я│п╨п╣ п╪п╬пЁя┐я┌ п╠я▀я┌я▄ я┌п╬п╩я▄п╨п╬ п╠п╦я┌п╬п╡я▀п╣ п╢п╟я┌я┤п╦п╨п╦ // значит в списке могут быть только битовые датчики
// п╦ п╣я│п╩п╦ п╦п╢я▒я┌ п©п╬п©я▀я┌п╨п╟ п╡п╫п╣я│я┌п╦ п╡ я│п©п╦я│п╬п╨ п╫п╣ п╠п╦я┌п╬п╡я▀п╧ п╢п╟я┌я┤п╦п╨ я┌п╬ п·п╗п≤п▒п п░! // и если идёт попытка внести в список не битовый датчик то ОШИБКА!
// п≤ п╫п╟п╬п╠п╬я─п╬я┌: п╣я│п╩п╦ п╦п╢я▒я┌ п©п╬п©я▀я┌п╨п╟ п╡п╫п╣я│я┌п╦ п╠п╦я┌п╬п╡я▀п╧ п╢п╟я┌я┤п╦п╨, п╟ п╡ я│п©п╦я│п╨п╣ // И наоборот: если идёт попытка внести битовый датчик, а в списке
// я┐п╤п╣ я│п╦п╢п╦я┌ п╢п╟я┌я┤п╦п╨ п╥п╟п╫п╦п╪п╟я▌я┴п╦п╧ я├п╣п╩я▀п╧ я─п╣пЁп╦я│я┌я─, я┌п╬ я┌п╬п╤п╣ п·п╗п≤п▒п п░! // уже сидит датчик занимающий целый регистр, то тоже ОШИБКА!
if( ModbusRTU::isWriteFunction(ri->mbfunc) ) if( ModbusRTU::isWriteFunction(ri->mbfunc) )
{ {
if( p.nbit<0 && ri->slst.size() > 1 ) if( p.nbit<0 && ri->slst.size() > 1 )
...@@ -1383,7 +1690,20 @@ bool MBTCPMaster::initItem( UniXML_iterator& it ) ...@@ -1383,7 +1690,20 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
return false; return false;
} }
} }
// Раз это регистр для записи, то как минимум надо сперва
// инициализировать значением из SM
ri->sm_initOK = it.getIntProp("tcp_sm_initOK");
ri->mb_initOK = true; // может быть переопределён если будет указан tcp_preinit="1" (см. ниже)
} }
else
{
// Если это регистр для чтения, то сразу можно работать
// инициализировать не надо
ri->mb_initOK = true;
ri->sm_initOK = true;
}
RSProperty* p1 = addProp(ri->slst,p); RSProperty* p1 = addProp(ri->slst,p);
if( !p1 ) if( !p1 )
...@@ -1395,9 +1715,67 @@ bool MBTCPMaster::initItem( UniXML_iterator& it ) ...@@ -1395,9 +1715,67 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
{ {
for( int i=1; i<p1->rnum; i++ ) for( int i=1; i<p1->rnum; i++ )
{ {
MBTCPMaster::RegInfo* ri1 = addReg(dev->regmap,mbreg+i,it,dev,ri); RegID id1 = genRegID(mbreg+i,fn);
ri1->mb_init_mbreg = ri->mb_init_mbreg+i; addReg(dev->regmap,id1,mbreg+i,it,dev,ri);
}
}
// Фомируем список инициализации
bool need_init = it.getIntProp("tcp_preinit");
if( need_init && ModbusRTU::isWriteFunction(ri->mbfunc) )
{
InitRegInfo ii;
ii.p = p;
ii.dev = dev;
ii.ri = ri;
string s_reg(it.getProp("tcp_init_mbreg"));
if( !s_reg.empty() )
ii.mbreg = ModbusRTU::str2mbData(s_reg);
else
ii.mbreg = ri->mbreg;
string s_mbfunc(it.getProp("tcp_init_mbfunc"));
if( !s_mbfunc.empty() )
{
ii.mbfunc = (ModbusRTU::SlaveFunctionCode)UniSetTypes::uni_atoi(s_mbfunc);
if( ii.mbfunc == ModbusRTU::fnUnknown )
{
dlog[Debug::CRIT] << myname << "(initItem): Unknown tcp_init_mbfunc ='" << s_mbfunc
<< "' for " << it.getProp("name") << endl;
return false;
}
}
else
{
switch(ri->mbfunc)
{
case ModbusRTU::fnWriteOutputSingleRegister:
ii.mbfunc = ModbusRTU::fnReadOutputRegisters;
break;
case ModbusRTU::fnForceSingleCoil:
ii.mbfunc = ModbusRTU::fnReadCoilStatus;
break;
case ModbusRTU::fnWriteOutputRegisters:
ii.mbfunc = ModbusRTU::fnReadOutputRegisters;
break;
case ModbusRTU::fnForceMultipleCoils:
ii.mbfunc = ModbusRTU::fnReadCoilStatus;
break;
default:
ii.mbfunc = ModbusRTU::fnReadOutputRegisters;
break;
}
} }
initRegList.push_back(ii);
ri->mb_initOK = false;
ri->sm_initOK = false;
} }
return true; return true;
...@@ -1441,15 +1819,29 @@ void MBTCPMaster::initIterators() ...@@ -1441,15 +1819,29 @@ void MBTCPMaster::initIterators()
void MBTCPMaster::help_print( int argc, const char* const* argv ) void MBTCPMaster::help_print( int argc, const char* const* argv )
{ {
cout << "Default: prefix='mbtcp'" << endl; cout << "Default: prefix='mbtcp'" << endl;
cout << "--prefix-polltime msec - Пауза между опросаом карт. По умолчанию 200 мсек." << endl; cout << "--prefix-name name - ObjectId (имя) процесса. По умолчанию: MBTCPMaster1" << endl;
cout << "--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком." << endl; cout << "--prefix-confnode name - Настроечная секция в конф. файле <name>. " << endl;
cout << "--prefix-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10." << endl; cout << "--prefix-polltime msec - Пауза между опросаом карт. По умолчанию 200 мсек." << endl;
cout << "--prefix-ready-timeout - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')" << endl; cout << "--prefix-heartbeat-id name - Данный процесс связан с указанным аналоговым heartbeat-дачиком." << endl;
cout << "--prefix-force - Сохранять значения в SM, независимо от, того менялось ли значение" << endl; cout << "--prefix-heartbeat-max val - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10." << endl;
cout << "--prefix-initPause - Задержка перед инициализацией (время на активизация процесса)" << endl; cout << "--prefix-ready-timeout msec - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')" << endl;
cout << "--prefix-force 0,1 - Сохранять значения в SM, независимо от, того менялось ли значение" << endl;
cout << "--prefix-force-out 0,1 - Считывать значения 'выходов' кажый раз SM (а не по изменению)" << endl;
cout << "--prefix-initPause msec - Задержка перед инициализацией (время на активизация процесса)" << endl;
cout << "--prefix-no-query-optimization 0,1 - Не оптимизировать запросы (не объединять соседние регистры в один запрос)" << endl;
cout << "--prefix-reg-from-id 0,1 - Использовать в качестве регистра sensor ID" << endl;
cout << "--prefix-filter-field name - Считывать список опрашиваемых датчиков, только у которых есть поле field" << endl;
cout << "--prefix-filter-value val - Считывать список опрашиваемых датчиков, только у которых field=value" << endl;
cout << "--prefix-statistic-sec sec - Выводить статистику опроса каждые sec секунд" << endl;
// ---------- init MBTCP ----------
// cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl; // cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl;
cout << " Настройки протокола TCP: " << endl; cout << " Настройки протокола TCP: " << endl;
cout << "--prefix-recv-timeout - Таймаут на ожидание ответа." << endl; cout << "--prefix-gateway hostname,IP - IP опрашиваемого узла" << endl;
cout << "--prefix-gateway-port num - port на опрашиваемом узле" << endl;
cout << "--prefix-recv-timeout msec - Таймаут на приём одного сообщения." << endl;
cout << "--prefix-timeout msec - Таймаут для определения отсутсвия соединения.в" << endl;
cout << "--prefix-persistent-connection 0,1 - Не закрывать соединение на каждом цикле опроса" << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBTCPMaster* MBTCPMaster::init_mbmaster( int argc, const char* const* argv, UniSetTypes::ObjectId icID, SharedMemory* ic, MBTCPMaster* MBTCPMaster::init_mbmaster( int argc, const char* const* argv, UniSetTypes::ObjectId icID, SharedMemory* ic,
...@@ -1562,12 +1954,12 @@ bool MBTCPMaster::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniX ...@@ -1562,12 +1954,12 @@ bool MBTCPMaster::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniX
} }
dlog[Debug::INFO] << myname << "(initDeviceInfo): add addr=" << ModbusRTU::addr2str(a) << endl; dlog[Debug::INFO] << myname << "(initDeviceInfo): add addr=" << ModbusRTU::addr2str(a) << endl;
int tout = it.getPIntProp("timeout", UniSetTimer::WaitUpTime); int tout = it.getPIntProp("timeout",5000);
d->second->resp_ptTimeout.setTiming(tout); d->second->resp_ptTimeout.setTiming(tout);
d->second->resp_invert = it.getIntProp("invert"); d->second->resp_invert = it.getIntProp("invert");
// d->second->no_clean_input = it.getIntProp("no_clean_input"); // d->second->no_clean_input = it.getIntProp("no_clean_input");
// dlog[Debug::INFO] << myname << "(initDeviceInfo): add " << d->second << endl; dlog[Debug::INFO] << myname << "(initDeviceInfo): add " << d->second << endl;
return true; return true;
} }
...@@ -1611,7 +2003,8 @@ std::ostream& operator<<( std::ostream& os, MBTCPMaster::RTUDevice& d ) ...@@ -1611,7 +2003,8 @@ std::ostream& operator<<( std::ostream& os, MBTCPMaster::RTUDevice& d )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::ostream& operator<<( std::ostream& os, MBTCPMaster::RegInfo& r ) std::ostream& operator<<( std::ostream& os, MBTCPMaster::RegInfo& r )
{ {
os << " mbreg=" << ModbusRTU::dat2str(r.mbreg) os << " id=" << r.id
<< " mbreg=" << ModbusRTU::dat2str(r.mbreg)
<< " mbfunc=" << r.mbfunc << " mbfunc=" << r.mbfunc
<< " q_num=" << r.q_num << " q_num=" << r.q_num
<< " q_count=" << r.q_count << " q_count=" << r.q_count
...@@ -1638,14 +2031,14 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -1638,14 +2031,14 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it ) for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
{ {
MBTCPMaster::RegMap::iterator beg = it; MBTCPMaster::RegMap::iterator beg = it;
ModbusRTU::ModbusData reg = it->second->mbreg + it->second->offset; ModbusRTU::ModbusData reg = it->second->mbreg;
beg->second->q_num = 1; beg->second->q_num = 1;
beg->second->q_count = 1; beg->second->q_count = 1;
it++; it++;
for( ;it!=d->regmap.end(); ++it ) for( ;it!=d->regmap.end(); ++it )
{ {
if( (it->second->mbreg + it->second->offset - reg) > 1 ) if( (it->second->mbreg - reg) > 1 )
break; break;
if( beg->second->mbfunc != it->second->mbfunc ) if( beg->second->mbfunc != it->second->mbfunc )
...@@ -1656,7 +2049,7 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -1656,7 +2049,7 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
if( beg->second->q_count >= ModbusRTU::MAXDATALEN ) if( beg->second->q_count >= ModbusRTU::MAXDATALEN )
break; break;
reg = it->second->mbreg + it->second->offset; reg = it->second->mbreg;
it->second->q_num = beg->second->q_count; it->second->q_num = beg->second->q_count;
it->second->q_count = 0; it->second->q_count = 0;
} }
...@@ -1697,8 +2090,6 @@ void MBTCPMaster::updateRTU( RegMap::iterator& rit ) ...@@ -1697,8 +2090,6 @@ void MBTCPMaster::updateRTU( RegMap::iterator& rit )
for( PList::iterator it=r->slst.begin(); it!=r->slst.end(); ++it ) for( PList::iterator it=r->slst.begin(); it!=r->slst.end(); ++it )
updateRSProperty( &(*it),false ); updateRSProperty( &(*it),false );
if( r->sm_init )
r->mb_init = true;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...@@ -1711,6 +2102,11 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1711,6 +2102,11 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
if( !save && write_only ) if( !save && write_only )
return; return;
// если требуется инициализация и она ещё не произведена,
// то игнорируем
if( save && !r->mb_initOK )
return;
if( dlog.debugging(Debug::LEVEL3) ) if( dlog.debugging(Debug::LEVEL3) )
dlog[Debug::LEVEL3] << "updateP: sid=" << p->si.id dlog[Debug::LEVEL3] << "updateP: sid=" << p->si.id
<< " mbval=" << r->mbval << " mbval=" << r->mbval
...@@ -1719,7 +2115,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1719,7 +2115,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
<< " nbit=" << p->nbit << " nbit=" << p->nbit
<< " save=" << save << " save=" << save
<< " ioype=" << p->stype << " ioype=" << p->stype
<< " mb_init=" << r->mb_init << " mb_initOK=" << r->mb_initOK
<< " sm_initOK=" << r->sm_initOK
<< endl; << endl;
try try
...@@ -1729,11 +2126,15 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1729,11 +2126,15 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
ModbusRTU::DataBits16 b(r->mbval); ModbusRTU::DataBits16 b(r->mbval);
if( p->nbit >= 0 ) if( p->nbit >= 0 )
{ {
if( save && r->mb_init ) if( save )
{ {
bool set = IOBase::processingAsDO( p, shm, force_out ); if( r->mb_initOK )
b.set(p->nbit,set); {
r->mbval = b.mdata(); bool set = IOBase::processingAsDO( p, shm, force_out );
b.set(p->nbit,set);
r->mbval = b.mdata();
r->sm_initOK = true;
}
} }
else else
{ {
...@@ -1746,15 +2147,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1746,15 +2147,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
if( p->rnum <= 1 ) if( p->rnum <= 1 )
{ {
if( save && r->mb_init ) if( save )
{ {
if( p->stype == UniversalIO::DigitalInput || if( r->mb_initOK )
p->stype == UniversalIO::DigitalOutput ) {
{ if( p->stype == UniversalIO::DigitalInput ||
r->mbval = IOBase::processingAsDO( p, shm, force_out ); p->stype == UniversalIO::DigitalOutput )
} {
else r->mbval = IOBase::processingAsDO( p, shm, force_out );
r->mbval = IOBase::processingAsAO( p, shm, force_out ); }
else
r->mbval = IOBase::processingAsAO( p, shm, force_out );
r->sm_initOK = true;
}
} }
else else
{ {
...@@ -1766,6 +2172,7 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1766,6 +2172,7 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else else
IOBase::processingAsAI( p, (signed short)(r->mbval), shm, force ); IOBase::processingAsAI( p, (signed short)(r->mbval), shm, force );
} }
return; return;
} }
...@@ -1775,15 +2182,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1775,15 +2182,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
} }
else if( p->vType == VTypes::vtSigned ) else if( p->vType == VTypes::vtSigned )
{ {
if( save && r->mb_init ) if( save )
{ {
if( p->stype == UniversalIO::DigitalInput || if( r->mb_initOK )
p->stype == UniversalIO::DigitalOutput )
{ {
r->mbval = (signed short)IOBase::processingAsDO( p, shm, force_out ); if( p->stype == UniversalIO::DigitalInput ||
p->stype == UniversalIO::DigitalOutput )
{
r->mbval = (signed short)IOBase::processingAsDO( p, shm, force_out );
}
else
r->mbval = (signed short)IOBase::processingAsAO( p, shm, force_out );
r->sm_initOK = true;
} }
else
r->mbval = (signed short)IOBase::processingAsAO( p, shm, force_out );
} }
else else
{ {
...@@ -1801,15 +2213,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1801,15 +2213,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
} }
else if( p->vType == VTypes::vtUnsigned ) else if( p->vType == VTypes::vtUnsigned )
{ {
if( save && r->mb_init ) if( save )
{ {
if( p->stype == UniversalIO::DigitalInput || if( r->mb_initOK )
p->stype == UniversalIO::DigitalOutput ) {
{ if( p->stype == UniversalIO::DigitalInput ||
r->mbval = (unsigned short)IOBase::processingAsDO( p, shm, force_out ); p->stype == UniversalIO::DigitalOutput )
} {
else r->mbval = (unsigned short)IOBase::processingAsDO( p, shm, force_out );
r->mbval = (unsigned short)IOBase::processingAsAO( p, shm, force_out ); }
else
r->mbval = (unsigned short)IOBase::processingAsAO( p, shm, force_out );
r->sm_initOK = true;
}
} }
else else
{ {
...@@ -1834,12 +2251,16 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1834,12 +2251,16 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
return; return;
} }
if( save && r->mb_init ) if( save && r->sm_initOK )
{ {
long v = IOBase::processingAsAO( p, shm, force_out ); if( r->mb_initOK )
VTypes::Byte b(r->mbval); {
b.raw.b[p->nbyte-1] = v; long v = IOBase::processingAsAO( p, shm, force_out );
r->mbval = b.raw.w; VTypes::Byte b(r->mbval);
b.raw.b[p->nbyte-1] = v;
r->mbval = b.raw.w;
r->sm_initOK = true;
}
} }
else else
{ {
...@@ -1852,12 +2273,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1852,12 +2273,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else if( p->vType == VTypes::vtF2 ) else if( p->vType == VTypes::vtF2 )
{ {
RegMap::iterator i(p->reg->rit); RegMap::iterator i(p->reg->rit);
if( save && r->mb_init ) if( save )
{ {
float f = IOBase::processingFasAO( p, shm, force_out ); if( r->mb_initOK )
VTypes::F2 f2(f); {
for( int k=0; k<VTypes::F2::wsize(); k++, i++ ) float f = IOBase::processingFasAO( p, shm, force_out );
i->second->mbval = f2.raw.v[k]; VTypes::F2 f2(f);
for( int k=0; k<VTypes::F2::wsize(); k++, i++ )
i->second->mbval = f2.raw.v[k];
r->sm_initOK = true;
}
} }
else else
{ {
...@@ -1874,12 +2300,15 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1874,12 +2300,15 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else if( p->vType == VTypes::vtF4 ) else if( p->vType == VTypes::vtF4 )
{ {
RegMap::iterator i(p->reg->rit); RegMap::iterator i(p->reg->rit);
if( save && r->mb_init ) if( save )
{ {
float f = IOBase::processingFasAO( p, shm, force_out ); if( r->mb_initOK )
VTypes::F4 f4(f); {
for( int k=0; k<VTypes::F4::wsize(); k++, i++ ) float f = IOBase::processingFasAO( p, shm, force_out );
i->second->mbval = f4.raw.v[k]; VTypes::F4 f4(f);
for( int k=0; k<VTypes::F4::wsize(); k++, i++ )
i->second->mbval = f4.raw.v[k];
}
} }
else else
{ {
...@@ -1896,12 +2325,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1896,12 +2325,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else if( p->vType == VTypes::vtI2 ) else if( p->vType == VTypes::vtI2 )
{ {
RegMap::iterator i(p->reg->rit); RegMap::iterator i(p->reg->rit);
if( save && r->mb_init ) if( save )
{ {
long v = IOBase::processingAsAO( p, shm, force_out ); if( r->mb_initOK )
VTypes::I2 i2(v); {
for( int k=0; k<VTypes::I2::wsize(); k++, i++ ) long v = IOBase::processingAsAO( p, shm, force_out );
i->second->mbval = i2.raw.v[k]; VTypes::I2 i2(v);
for( int k=0; k<VTypes::I2::wsize(); k++, i++ )
i->second->mbval = i2.raw.v[k];
r->sm_initOK = true;
}
} }
else else
{ {
...@@ -1918,12 +2352,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1918,12 +2352,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else if( p->vType == VTypes::vtU2 ) else if( p->vType == VTypes::vtU2 )
{ {
RegMap::iterator i(p->reg->rit); RegMap::iterator i(p->reg->rit);
if( save && r->mb_init ) if( save )
{ {
long v = IOBase::processingAsAO( p, shm, force_out ); if( r->mb_initOK )
VTypes::U2 u2(v); {
for( int k=0; k<VTypes::U2::wsize(); k++, i++ ) long v = IOBase::processingAsAO( p, shm, force_out );
i->second->mbval = u2.raw.v[k]; VTypes::U2 u2(v);
for( int k=0; k<VTypes::U2::wsize(); k++, i++ )
i->second->mbval = u2.raw.v[k];
r->sm_initOK = true;
}
} }
else else
{ {
...@@ -1937,6 +2376,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1937,6 +2376,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
IOBase::processingAsAI( p, (unsigned int)u2, shm, force ); IOBase::processingAsAI( p, (unsigned int)u2, shm, force );
} }
} }
return;
} }
catch(IOController_i::NameNotFound &ex) catch(IOController_i::NameNotFound &ex)
{ {
...@@ -1963,6 +2404,10 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1963,6 +2404,10 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
{ {
dlog[Debug::LEVEL3] << myname << "(updateRSProperty): catch ..." << endl; dlog[Debug::LEVEL3] << myname << "(updateRSProperty): catch ..." << endl;
} }
// Если SM стала (или была) недоступна
// то флаг инициализации надо сбросить
r->sm_initOK = false;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBTCPMaster::updateMTR( RegMap::iterator& rit ) void MBTCPMaster::updateMTR( RegMap::iterator& rit )
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "Calibration.h" #include "Calibration.h"
#include "SMInterface.h" #include "SMInterface.h"
#include "SharedMemory.h" #include "SharedMemory.h"
#include "ThreadCreator.h"
#include "IOBase.h" #include "IOBase.h"
#include "VTypes.h" #include "VTypes.h"
#include "MTR.h" #include "MTR.h"
...@@ -68,10 +69,11 @@ ...@@ -68,10 +69,11 @@
Порт задаётся в конфигурационном файле параметром \b gateway_port или Порт задаётся в конфигурационном файле параметром \b gateway_port или
параметром командной строки \b --xxx-gateway-port. По умолчанию используется порт \b 502. параметром командной строки \b --xxx-gateway-port. По умолчанию используется порт \b 502.
\b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём сообщений. По умолчанию 2000 мсек. \b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём одного сообщения. По умолчанию 100 мсек.
\b --xxx-all-timeout или \b all_timeout msec - таймаут на определение отсутсвия связи \b --xxx-timeout или \b timeout msec - таймаут на определение отсутсвия связи
(после этого идёт попытка реинициализировать соединение) (после этого идёт попытка реинициализировать соединение)
По умолчанию 5000 мсек.
\b --xxx-no-query-optimization или \b no_query_optimization - [1|0] отключить оптимизацию запросов \b --xxx-no-query-optimization или \b no_query_optimization - [1|0] отключить оптимизацию запросов
...@@ -87,7 +89,7 @@ ...@@ -87,7 +89,7 @@
- 1 - перечитывать значения входов из SharedMemory на каждом цикле - 1 - перечитывать значения входов из SharedMemory на каждом цикле
- 0 - обновлять значения только по изменению - 0 - обновлять значения только по изменению
\b --xxx-force-disconnect или \b force_disconnect - закрывать соединение после каждого запроса. \b --xxx-persistent-connection или \b persistent_connection - НЕ закрывать соединение после каждого запроса.
\b --xxx-force-out или \b force_out [1|0] \b --xxx-force-out или \b force_out [1|0]
- 1 - перечитывать значения выходов из SharedMemory на каждом цикле - 1 - перечитывать значения выходов из SharedMemory на каждом цикле
...@@ -137,7 +139,7 @@ ...@@ -137,7 +139,7 @@
Помимо этого можно задавать следующие параметры: Помимо этого можно задавать следующие параметры:
- \b tcp_vtype - тип переменной. см VTypes::VType. - \b tcp_vtype - тип переменной. см VTypes::VType.
- \b tcp_rawdata - [1|0] - игнорировать или нет параметры калибровки - \b tcp_rawdata - [0|1] - игнорировать или нет параметры калибровки
- \b tcp_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype. - \b tcp_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
- \b tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется - \b tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется
функция читающая слова (03 функция читающая слова (03
...@@ -145,13 +147,31 @@ ...@@ -145,13 +147,31 @@
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи. - \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset". Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
- \b tcp_preinit - [0|1] считать регистр перед использованием (при запуске процесса)
- \b tcp_init_mbfunc - Номер функции для инициализации. Если не указана, будет определена автоматически исходя из tcp_mbfunc.
- \b tcp_init_mbreg - Номер регистра откуда считывать значение для инициализации. Если это поле не указано используется tcp_mbreg.
Если указано tcp_preinit="1", то прежде чем начать писать регистр в устройство, будет произведено его чтение.
По умолчанию все "записываемые" регистры инициализируются значением из SM. Т.е. пока не будет первый раз считано значение из SM,
регистры в устройство писатся не будут. Чтобы отключить это поведение, можно указать параметр
- \b tcp_sm_initOK - [0|1] Игнорировать начальную инициализацию из SM (сразу писать в устройство)
При этом будет записывыться значение "default".
\warning Регистр должен быть уникальным. И может повторятся только если указан параметр \a nbit или \a nbyte. \warning Регистр должен быть уникальным. И может повторятся только если указан параметр \a nbit или \a nbyte.
*/ */
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
/*! /*!
Реализация Modbus TCP Master для обмена с многими ModbusRTU устройствами \par Реализация Modbus TCP Master для обмена с многими ModbusRTU устройствами
через один modbus tcp шлюз. через один modbus tcp шлюз.
\par Чтобы не зависеть от таймаутов TCP соединений, которые могут неопределённо зависать
на создании соединения с недоступным хостом. Обмен вынесен в отдельный поток.
При этом в этом же потоке обновляются данные в SM. В свою очередь информация о датчиках
связи обновляется в основном потоке (чтобы не зависеть от TCP).
*/ */
class MBTCPMaster: class MBTCPMaster:
public UniSetObject_LT public UniSetObject_LT
...@@ -214,25 +234,25 @@ class MBTCPMaster: ...@@ -214,25 +234,25 @@ class MBTCPMaster:
typedef std::list<RSProperty> PList; typedef std::list<RSProperty> PList;
static std::ostream& print_plist( std::ostream& os, PList& p ); static std::ostream& print_plist( std::ostream& os, PList& p );
typedef std::map<ModbusRTU::ModbusData,RegInfo*> RegMap; typedef unsigned long RegID;
typedef std::map<RegID,RegInfo*> RegMap;
struct RegInfo struct RegInfo
{ {
RegInfo(): RegInfo():
mbval(0),mbreg(0),mbfunc(ModbusRTU::fnUnknown), mbval(0),mbreg(0),mbfunc(ModbusRTU::fnUnknown),
dev(0),offset(0),mtrType(MTR::mtUnknown), id(0),dev(0),mtrType(MTR::mtUnknown),
q_num(0),q_count(1),mb_init(false),sm_init(false), q_num(0),q_count(1),mb_initOK(true),sm_initOK(true)
mb_init_mbreg(0)
{} {}
ModbusRTU::ModbusData mbval; ModbusRTU::ModbusData mbval;
ModbusRTU::ModbusData mbreg; /*!< регистр */ ModbusRTU::ModbusData mbreg; /*!< регистр */
ModbusRTU::SlaveFunctionCode mbfunc; /*!< функция для чтения/записи */ ModbusRTU::SlaveFunctionCode mbfunc; /*!< функция для чтения/записи */
PList slst; PList slst;
RegID id;
RTUDevice* dev; RTUDevice* dev;
int offset;
// only for MTR // only for MTR
MTR::MTRType mtrType; /*!< тип регистра (согласно спецификации на MTR) */ MTR::MTRType mtrType; /*!< тип регистра (согласно спецификации на MTR) */
...@@ -241,9 +261,17 @@ class MBTCPMaster: ...@@ -241,9 +261,17 @@ class MBTCPMaster:
int q_count; /*!< count registers for query */ int q_count; /*!< count registers for query */
RegMap::iterator rit; RegMap::iterator rit;
bool mb_init; /*!< init before use */
bool sm_init; /*!< SM init value */ // начальная инициалиазция для "записываемых" регистров
ModbusRTU::ModbusData mb_init_mbreg; /*!< mb_init register */ // Механизм:
// Если tcp_preinit="1", то сперва будет сделано чтение значения из устройства.
// при этом флаг mb_init=false пока не пройдёт успешной инициализации
// Если tcp_preinit="0", то флаг mb_init сразу выставляется в true.
bool mb_initOK; /*!< инициализировалось ли значение из устройства */
// Флаг sm_init означает, что писать в устройство нельзя, т.к. значение в "карте регистров"
// ещё не инициализировано из SM
bool sm_initOK; /*!< инициализировалось ли значение из SM */
}; };
friend std::ostream& operator<<( std::ostream& os, RegInfo& r ); friend std::ostream& operator<<( std::ostream& os, RegInfo& r );
...@@ -293,9 +321,30 @@ class MBTCPMaster: ...@@ -293,9 +321,30 @@ class MBTCPMaster:
void printMap(RTUDeviceMap& d); void printMap(RTUDeviceMap& d);
// ---------------------------------- // ----------------------------------
protected: protected:
struct InitRegInfo
{
InitRegInfo():
dev(0),mbreg(0),
mbfunc(ModbusRTU::fnUnknown),
initOK(false),ri(0)
{}
RSProperty p;
RTUDevice* dev;
ModbusRTU::ModbusData mbreg;
ModbusRTU::SlaveFunctionCode mbfunc;
bool initOK;
RegInfo* ri;
};
typedef std::list<InitRegInfo> InitList;
void firstInitRegisters();
bool preInitRead( InitList::iterator& p );
bool initSMValue( ModbusRTU::ModbusData* data, int count, RSProperty* p );
bool allInitOK;
RTUDeviceMap rmap; RTUDeviceMap rmap;
InitList initRegList; /*!< список регистров для инициализации */
ModbusTCPMaster* mb; ModbusTCPMaster* mb;
UniSetTypes::uniset_mutex mbMutex; UniSetTypes::uniset_mutex mbMutex;
std::string iaddr; std::string iaddr;
...@@ -310,6 +359,7 @@ class MBTCPMaster: ...@@ -310,6 +359,7 @@ class MBTCPMaster:
SMInterface* shm; SMInterface* shm;
void step(); void step();
void poll_thread();
void poll(); void poll();
bool pollRTU( RTUDevice* dev, RegMap::iterator& it ); bool pollRTU( RTUDevice* dev, RegMap::iterator& it );
...@@ -317,6 +367,7 @@ class MBTCPMaster: ...@@ -317,6 +367,7 @@ class MBTCPMaster:
void updateRTU(RegMap::iterator& it); void updateRTU(RegMap::iterator& it);
void updateMTR(RegMap::iterator& it); void updateMTR(RegMap::iterator& it);
void updateRSProperty( RSProperty* p, bool write_only=false ); void updateRSProperty( RSProperty* p, bool write_only=false );
void updateRespondSensors();
virtual void processingMessage( UniSetTypes::VoidMessage *msg ); virtual void processingMessage( UniSetTypes::VoidMessage *msg );
void sysCommand( UniSetTypes::SystemMessage *msg ); void sysCommand( UniSetTypes::SystemMessage *msg );
...@@ -338,9 +389,9 @@ class MBTCPMaster: ...@@ -338,9 +389,9 @@ class MBTCPMaster:
void initDeviceList(); void initDeviceList();
void initOffsetList(); void initOffsetList();
static RegID genRegID( const ModbusRTU::ModbusData r, const int fn );
RTUDevice* addDev( RTUDeviceMap& dmap, ModbusRTU::ModbusAddr a, UniXML_iterator& it ); RTUDevice* addDev( RTUDeviceMap& dmap, ModbusRTU::ModbusAddr a, UniXML_iterator& it );
RegInfo* addReg( RegMap& rmap, ModbusRTU::ModbusData r, UniXML_iterator& it, RegInfo* addReg( RegMap& rmap, RegID id, ModbusRTU::ModbusData r, UniXML_iterator& it,
RTUDevice* dev, RegInfo* rcopy=0 ); RTUDevice* dev, RegInfo* rcopy=0 );
RSProperty* addProp( PList& plist, RSProperty& p ); RSProperty* addProp( PList& plist, RSProperty& p );
...@@ -355,7 +406,10 @@ class MBTCPMaster: ...@@ -355,7 +406,10 @@ class MBTCPMaster:
void readConfiguration(); void readConfiguration();
bool check_item( UniXML_iterator& it ); bool check_item( UniXML_iterator& it );
private: bool checkProcActive();
void setProcActive( bool st );
private:
MBTCPMaster(); MBTCPMaster();
bool initPause; bool initPause;
UniSetTypes::uniset_mutex mutex_start; UniSetTypes::uniset_mutex mutex_start;
...@@ -371,17 +425,13 @@ class MBTCPMaster: ...@@ -371,17 +425,13 @@ class MBTCPMaster:
IOController::AIOStateList::iterator aitHeartBeat; IOController::AIOStateList::iterator aitHeartBeat;
UniSetTypes::ObjectId test_id; UniSetTypes::ObjectId test_id;
UniSetTypes::uniset_mutex pollMutex; UniSetTypes::uniset_mutex actMutex;
bool activated; bool activated;
int activateTimeout; int activateTimeout;
bool noQueryOptimization; bool noQueryOptimization;
bool force_disconnect; bool force_disconnect;
bool allNotRespond;
Trigger trAllNotRespond;
PassiveTimer ptAllNotRespond;
std::string prefix; std::string prefix;
bool no_extimer; bool no_extimer;
...@@ -389,6 +439,16 @@ class MBTCPMaster: ...@@ -389,6 +439,16 @@ class MBTCPMaster:
timeout_t stat_time; /*!< время сбора статистики обмена */ timeout_t stat_time; /*!< время сбора статистики обмена */
int poll_count; int poll_count;
PassiveTimer ptStatistic; /*!< таймер для сбора статистики обмена */ PassiveTimer ptStatistic; /*!< таймер для сбора статистики обмена */
// т.к. TCP может "зависнуть" на подключении к недоступному узлу
// делаем опрос в отдельном потоке
ThreadCreator<MBTCPMaster>* pollThread; /*!< поток опроса */
bool pollActivated;
UniSetTypes::uniset_mutex pollMutex;
// определение timeout для соединения
PassiveTimer ptTimeout;
UniSetTypes::uniset_mutex tcpMutex;
}; };
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#endif // _MBTCPMaster_H_ #endif // _MBTCPMaster_H_
......
bin_PROGRAMS = @PACKAGE@-mbtcpmaster bin_PROGRAMS = @PACKAGE@-mbtcpmaster
# не забывайте править версию в pc-файле # не забывайте править версию в pc-файле
UMBTCP_VER=@LIBVER@ UMBTCP_VER=1:1:0
lib_LTLIBRARIES = libUniSetMBTCPMaster.la lib_LTLIBRARIES = libUniSetMBTCPMaster.la
libUniSetMBTCPMaster_la_LDFLAGS = -version-info $(UMBTCP_VER) libUniSetMBTCPMaster_la_LDFLAGS = -version-info $(UMBTCP_VER)
......
...@@ -6,6 +6,6 @@ includedir=@includedir@ ...@@ -6,6 +6,6 @@ includedir=@includedir@
Name: libUniSetMBTCPMaster Name: libUniSetMBTCPMaster
Description: Support library for UniSetModbusTCPMaster Description: Support library for UniSetModbusTCPMaster
Requires: libUniSetExtensions libUniSetSharedMemory Requires: libUniSetExtensions libUniSetSharedMemory
Version: @VERSION@ Version: 1.1.0
Libs: -L${libdir} -lUniSetMBTCPMaster Libs: -L${libdir} -lUniSetMBTCPMaster
Cflags: -I${includedir}/uniset Cflags: -I${includedir}/uniset
...@@ -607,7 +607,7 @@ void RTUExchange::updateSM() ...@@ -607,7 +607,7 @@ void RTUExchange::updateSM()
if( dlog.debugging(Debug::LEVEL4) ) if( dlog.debugging(Debug::LEVEL4) )
{ {
dlog[Debug::LEVEL4] << "check respond addr=" << ModbusRTU::addr2str(d->mbaddr) dlog[Debug::LEVEL4] << "check respond addr=" << ModbusRTU::addr2str(d->mbaddr)
<< " respond=" << d->resp_id << " respond_id=" << d->resp_id
<< " real=" << d->resp_real << " real=" << d->resp_real
<< " state=" << d->resp_state << " state=" << d->resp_state
<< endl; << endl;
......
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
//! \version $Id: RTUStorage.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef _RTUSTORAGE_H_ #ifndef _RTUSTORAGE_H_
#define _RTUSTORAGE_H_ #define _RTUSTORAGE_H_
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
/*! $Id$ */
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
#ifndef _SMVIEWER_H #ifndef _SMVIEWER_H
#define _SMVIEWER_H #define _SMVIEWER_H
......
/* $Id: SharedMemory.h,v 1.2 2009/01/22 02:11:24 vpashka Exp $ */
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef SharedMemory_H_ #ifndef SharedMemory_H_
#define SharedMemory_H_ #define SharedMemory_H_
......
// $Id: UDPPacket.h,v 1.1 2009/02/10 20:38:27 vpashka Exp $
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef UDPPacket_H_ #ifndef UDPPacket_H_
#define UDPPacket_H_ #define UDPPacket_H_
......
// $Id: UniExchange.h,v 1.2 2009/04/07 16:11:23 pv Exp $
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef UniExchange_H_ #ifndef UniExchange_H_
#define UniExchange_H_ #define UniExchange_H_
......
// $Id: DigitalFilter.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Цифровой фильтр с двумя (опционально) уровнями фильтрации сигнала // Цифровой фильтр с двумя (опционально) уровнями фильтрации сигнала
// Первый уровень фильтра усредняет несколько значений, переданных через массив // Первый уровень фильтра усредняет несколько значений, переданных через массив
......
// $Id: Extensions.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef Extensions_H_ #ifndef Extensions_H_
#define Extensions_H_ #define Extensions_H_
......
// $Id: IOBase.h,v 1.3 2009/01/23 23:56:54 vpashka Exp $
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef IOBase_H_ #ifndef IOBase_H_
#define IOBase_H_ #define IOBase_H_
......
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
//! \version $Id: MTR.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef _MTR_H_ #ifndef _MTR_H_
#define _MTR_H_ #define _MTR_H_
......
// $Id: PID.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef PID_H_ #ifndef PID_H_
#define PID_H_ #define PID_H_
......
/* $Id: SMInterface.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $ */
//--------------------------------------------------------------------------
#ifndef SMInterface_H_ #ifndef SMInterface_H_
#define SMInterface_H_ #define SMInterface_H_
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#include <string> #include <string>
#include "UniSetTypes.h" #include "UniSetTypes.h"
#include "Mutex.h"
#include "IONotifyController.h" #include "IONotifyController.h"
#include "UniversalInterface.h" #include "UniversalInterface.h"
class SMInterface class SMInterface
...@@ -89,6 +88,7 @@ class SMInterface ...@@ -89,6 +88,7 @@ class SMInterface
CORBA::Object_var oref; CORBA::Object_var oref;
UniSetTypes::ObjectId shmID; UniSetTypes::ObjectId shmID;
UniSetTypes::ObjectId myid; UniSetTypes::ObjectId myid;
UniSetTypes::uniset_mutex shmMutex;
}; };
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
......
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
//! \version $Id: RTUTypes.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef _RTUTypes_H_ #ifndef _RTUTypes_H_
#define _RTUTypes_H_ #define _RTUTypes_H_
......
...@@ -10,6 +10,7 @@ using namespace UniSetTypes; ...@@ -10,6 +10,7 @@ using namespace UniSetTypes;
#define BEG_FUNC(name) \ #define BEG_FUNC(name) \
try \ try \
{ \ { \
uniset_mutex_lock l(shmMutex,500); \
IONotifyController_i_var shm;\ IONotifyController_i_var shm;\
for( unsigned int i=0; i<conf->getRepeatCount(); i++)\ for( unsigned int i=0; i<conf->getRepeatCount(); i++)\
{\ {\
...@@ -32,6 +33,7 @@ using namespace UniSetTypes; ...@@ -32,6 +33,7 @@ using namespace UniSetTypes;
#define BEG_FUNC1(name) \ #define BEG_FUNC1(name) \
try \ try \
{ \ { \
uniset_mutex_lock l(shmMutex,500); \
if( true ) \ if( true ) \
{ \ { \
try \ try \
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 20:52:20 $
* \version $Id: CallBackTimer.h,v 1.5 2005/01/28 20:52:20 vitlav Exp $
*/ */
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
# ifndef CallBackTimer_H_ # ifndef CallBackTimer_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/02/07 21:04:56 $
* \version $Id: CallBackTimer_template.h,v 1.6 2008/02/07 21:04:56 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
# ifndef CallBackTimer_TEMPLATE_H_ # ifndef CallBackTimer_TEMPLATE_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Класс работы с конфигурацией * \brief Класс работы с конфигурацией
* \author Vitaly Lipatov, Pavel Vainerman * \author Vitaly Lipatov, Pavel Vainerman
* \date $Date: 2008/02/21 19:59:57 $
* \version $Id: Configuration.h,v 1.25 2008/02/21 19:59:57 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef Configuration_H_ #ifndef Configuration_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: DBServer.h,v 1.8 2007/06/17 21:30:55 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef DBServer_H_ #ifndef DBServer_H_
......
...@@ -20,9 +20,6 @@ ...@@ -20,9 +20,6 @@
/*! \file /*! \file
* \brief "Пустая" реализация интерфейса работы с сообщениями * \brief "Пустая" реализация интерфейса работы с сообщениями
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2006/12/22 13:37:48 $
* \version $Id: DefaultMessageInterface.h,v 1.3 2006/12/22 13:37:48 vpashka Exp $
*
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef DefaultMessageInterface_H_ #ifndef DefaultMessageInterface_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Реализация IOController_i * \brief Реализация IOController_i
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/11/29 21:24:25 $
* \version $Id: IOController.h,v 1.28 2008/11/29 21:24:25 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef IOController_H_ #ifndef IOController_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Реализация IONotifyController_i * \brief Реализация IONotifyController_i
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/12/16 21:32:07 $
* \version $Id: IONotifyController.h,v 1.23 2007/12/16 21:32:07 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef IONotifyController_H_ #ifndef IONotifyController_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/07/31 18:13:40 $
* \version $Id: IONotifyController_LT.h,v 1.4 2007/07/31 18:13:40 vpashka Exp $
*/ */
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef IONotifyController_LT_H_ #ifndef IONotifyController_LT_H_
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \version $Id: IORFile.h,v 1.4 2007/11/15 20:55:26 vpashka Exp $
* \date $Date: 2007/11/15 20:55:26 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef IORFile_H_ #ifndef IORFile_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Заголовочный файл для организации низкоуровневого ввода-вывода. * \brief Заголовочный файл для организации низкоуровневого ввода-вывода.
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2005/11/01 21:44:53 $
* \version $Id: DigitalCard.h,v 1.4 2005/11/01 21:44:53 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef DIGITALCARD_H__ #ifndef DIGITALCARD_H__
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Заголовочный файл для дискретной карты DIO5600 * \brief Заголовочный файл для дискретной карты DIO5600
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2005/01/28 20:52:53 $
* \version $Id: DigitalCard_O5600.h,v 1.3 2005/01/28 20:52:53 vitlav Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef __DIO5600_H_ #ifndef __DIO5600_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Заголовочный файл для организации низкоуровневого ввода-вывода. * \brief Заголовочный файл для организации низкоуровневого ввода-вывода.
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2006/12/21 14:47:42 $
* \version $Id: IOAccess.h,v 1.5 2006/12/21 14:47:42 vpashka Exp $
* \par * \par
* Этот файл предназначен для внутреннего использования в классах * Этот файл предназначен для внутреннего использования в классах
* ввода-вывода * ввода-вывода
...@@ -39,8 +37,6 @@ ...@@ -39,8 +37,6 @@
/*! \class IOAccess /*! \class IOAccess
* \brief Предоставление операций для низкоуровневого ввода-вывода. * \brief Предоставление операций для низкоуровневого ввода-вывода.
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2006/12/21 14:47:42 $
* \version $Id: IOAccess.h,v 1.5 2006/12/21 14:47:42 vpashka Exp $
* \par * \par
* Этот класс предназначен для внутреннего использования в классах * Этот класс предназначен для внутреннего использования в классах
* ввода-вывода * ввода-вывода
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Предоставление операций для низкоуровневого ввода-вывода. * \brief Предоставление операций для низкоуровневого ввода-вывода.
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2006/12/19 15:46:14 $
* \version $Id: IOAccessOld.h,v 1.4 2006/12/19 15:46:14 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <unistd.h> #include <unistd.h>
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Интерфейс к объекту сохраняющему список заказчиков и сообщений для InfoServer-а * \brief Интерфейс к объекту сохраняющему список заказчиков и сообщений для InfoServer-а
* \author Pavel Vainerman * \author Pavel Vainerman
* \version $Id: ISRestorer.h,v 1.9 2008/12/14 21:57:51 vpashka Exp $
* \date $Date: 2008/12/14 21:57:51 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ISRestorer_H_ #ifndef ISRestorer_H_
...@@ -58,8 +56,6 @@ class ISRestorer ...@@ -58,8 +56,6 @@ class ISRestorer
/*! /*!
* \brief Реализация сохранения списка заказчиков в xml. * \brief Реализация сохранения списка заказчиков в xml.
* \author Pavel Vainerman * \author Pavel Vainerman
* \version $Id: ISRestorer.h,v 1.9 2008/12/14 21:57:51 vpashka Exp $
* \date $Date: 2008/12/14 21:57:51 $
* *
Реализует сохранение списка заказчиков в xml-файле. Реализует сохранение списка заказчиков в xml-файле.
\sa ISRestorer \sa ISRestorer
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/01/06 00:03:34 $
* \version $Id: InfoServer.h,v 1.11 2007/01/06 00:03:34 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef InfoServer_H_ #ifndef InfoServer_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2006/12/20 10:39:01 $
* \version $Id: LT_Object.h,v 1.5 2006/12/20 10:39:01 vpashka Exp $
*/ */
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef Object_LT_H_ #ifndef Object_LT_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Класс работы с сообщениями * \brief Класс работы с сообщениями
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2006/12/22 13:37:48 $
* \version $Id: MessageInterface.h,v 1.7 2006/12/22 13:37:48 vpashka Exp $
* *
* Получение сообщения по id * Получение сообщения по id
*/ */
......
...@@ -20,9 +20,6 @@ ...@@ -20,9 +20,6 @@
/*! \file /*! \file
* \brief Реализация интерфейса работы с сообщениями на основе XML * \brief Реализация интерфейса работы с сообщениями на основе XML
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/11/22 23:22:24 $
* \version $Id: MessageInterface_XML.h,v 1.7 2008/11/22 23:22:24 vpashka Exp $
*
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef __MESSAGEINTERFACE_XML_H__ #ifndef __MESSAGEINTERFACE_XML_H__
......
/*! \file /*! \file
* \brief Класс работы с сообщениями * \brief Класс работы с сообщениями
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/11/22 23:22:24 $
* \version $Id: MessageInterface_idXML.h,v 1.5 2008/11/22 23:22:24 vpashka Exp $
*/ */
/**************************************************************************/ /**************************************************************************/
#ifndef MessageInterface_idXML_H_ #ifndef MessageInterface_idXML_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Базовые типы сообщений * \brief Базовые типы сообщений
* \author Vitaly Lipatov, Pavel Vainerman * \author Vitaly Lipatov, Pavel Vainerman
* \date $Date: 2008/12/14 21:57:51 $
* \version $Id: MessageType.h,v 1.14 2008/12/14 21:57:51 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef MessageType_H_ #ifndef MessageType_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
* \version $Id: Mutex.h,v 1.14 2007/11/18 19:13:35 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef UniSet_MUTEX_H_ #ifndef UniSet_MUTEX_H_
...@@ -75,8 +73,6 @@ namespace UniSetTypes ...@@ -75,8 +73,6 @@ namespace UniSetTypes
/*! \class uniset_mutex_lock /*! \class uniset_mutex_lock
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
* \version $Id: Mutex.h,v 1.14 2007/11/18 19:13:35 vpashka Exp $
* *
* Предназначен для блокирования совместного доступа. Как пользоваться см. \ref MutexHowToPage * Предназначен для блокирования совместного доступа. Как пользоваться см. \ref MutexHowToPage
* \note Если ресурс уже занят, то lock ждет его освобождения... * \note Если ресурс уже занят, то lock ждет его освобождения...
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
/*! \file /*! \file
* \brief Интерфейс к объекту сохраняющему список заказчиков для NotifyController-ов * \brief Интерфейс к объекту сохраняющему список заказчиков для NotifyController-ов
* \author Pavel Vainerman * \author Pavel Vainerman
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef NCRestorer_H_ #ifndef NCRestorer_H_
#define NCRestorer_H_ #define NCRestorer_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \version $Id: ORepHelpers.h,v 1.9 2007/11/18 19:13:35 vpashka Exp $
* \date $Date: 2007/11/18 19:13:35 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ORepHelpers_H_ #ifndef ORepHelpers_H_
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \version $Id: ObjectIndex.h,v 1.11 2008/11/22 23:22:24 vpashka Exp $
* \date $Date: 2008/11/22 23:22:24 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ObjcetIndex_H_ #ifndef ObjcetIndex_H_
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \version $Id: ObjectIndex_Array.h,v 1.6 2008/11/22 23:22:24 vpashka Exp $
* \date $Date: 2008/11/22 23:22:24 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ObjectIndex_Array_H_ #ifndef ObjectIndex_Array_H_
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \version $Id: ObjectIndex_XML.h,v 1.8 2008/11/22 23:22:24 vpashka Exp $
* \date $Date: 2008/11/22 23:22:24 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ObjectIndex_XML_H_ #ifndef ObjectIndex_XML_H_
......
// $Id: ObjectIndex_idXML.h,v 1.6 2008/11/22 23:22:24 vpashka Exp $
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ObjectIndex_idXML_H_ #ifndef ObjectIndex_idXML_H_
#define ObjectIndex_idXML_H_ #define ObjectIndex_idXML_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Интерфейсный класс для работы с репозитарием объектов * \brief Интерфейсный класс для работы с репозитарием объектов
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
* \version $Id: ObjectRepository.h,v 1.9 2007/11/18 19:13:35 vpashka Exp $ *
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ObjectRepository_H_ #ifndef ObjectRepository_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Интерфейсный класс для создания структуры репозитария объектов * \brief Интерфейсный класс для создания структуры репозитария объектов
* \author Pavel Vainerman * \author Pavel Vainerman
* \version $Id: ObjectRepositoryFactory.h,v 1.8 2007/07/07 18:58:42 vpashka Exp $
* \date $Date: 2007/07/07 18:58:42 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ObjectRepositoryFactory_H_ #ifndef ObjectRepositoryFactory_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Активатор объектов * \brief Активатор объектов
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: ObjectsActivator.h,v 1.13 2007/06/17 21:30:55 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ObjectsActivator_H_ #ifndef ObjectsActivator_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Реализация интерфейса менеджера объектов. * \brief Реализация интерфейса менеджера объектов.
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2009/01/16 23:16:42 $
* \version $Id: ObjectsManager.h,v 1.13 2009/01/16 23:16:42 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ObjectsManager_H_ #ifndef ObjectsManager_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/07/31 18:13:40 $
* \version $Id: ObjectsManager_LT.h,v 1.4 2007/07/31 18:13:40 vpashka Exp $
*/ */
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef ObjectsManager_LT_H_ #ifndef ObjectsManager_LT_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Создатель потоков * \brief Создатель потоков
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 20:52:21 $
* \version $Id: OmniThreadCreator.h,v 1.5 2005/01/28 20:52:21 vitlav Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef OmniThreadCreator_h_ #ifndef OmniThreadCreator_h_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/11/29 21:24:25 $
* \version $Id: PassiveObject.h,v 1.9 2008/11/29 21:24:25 vpashka Exp $
*/ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef PassiveObject_H_ #ifndef PassiveObject_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Vitaly Lipatov, Pavel Vainerman * \author Vitaly Lipatov, Pavel Vainerman
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
*/ */
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
# ifndef PASSIVETIMER_H_ # ifndef PASSIVETIMER_H_
...@@ -36,8 +34,6 @@ ...@@ -36,8 +34,6 @@
/*! \class UniSetTimer /*! \class UniSetTimer
* \brief Базовый интерфейс пасивных таймеров * \brief Базовый интерфейс пасивных таймеров
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
*/ */
class UniSetTimer class UniSetTimer
{ {
...@@ -78,8 +74,6 @@ class UniSetTimer ...@@ -78,8 +74,6 @@ class UniSetTimer
/*! \class PassiveTimer /*! \class PassiveTimer
* \brief Пассивный таймер * \brief Пассивный таймер
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
* \par * \par
* Установив таймер в конструкторе или с помощью setTiming, * Установив таймер в конструкторе или с помощью setTiming,
* можно с помощью checkTime проверять, не наступило ли нужное время * можно с помощью checkTime проверять, не наступило ли нужное время
...@@ -125,8 +119,6 @@ class omni_condition; ...@@ -125,8 +119,6 @@ class omni_condition;
/*! \class ThrPassiveTimer /*! \class ThrPassiveTimer
* \brief Пассивный таймер с режимом засыпания (ожидания) * \brief Пассивный таймер с режимом засыпания (ожидания)
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
* \par * \par
* Позволяет заснуть на заданное время wait(timeout_t timeMS). * Позволяет заснуть на заданное время wait(timeout_t timeMS).
* Механизм работает на основе взаимных блокировок потоков (mutex и condition). * Механизм работает на основе взаимных блокировок потоков (mutex и condition).
...@@ -154,8 +146,6 @@ class ThrPassiveTimer: ...@@ -154,8 +146,6 @@ class ThrPassiveTimer:
/*! \class PassiveSysTimer /*! \class PassiveSysTimer
* \brief Пассивный таймер с режимом засыпания (ожидания) * \brief Пассивный таймер с режимом засыпания (ожидания)
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
* \par * \par
* Создан на основе сигнала (SIGALRM). * Создан на основе сигнала (SIGALRM).
*/ */
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Интефес для создания и управления потоками * \brief Интефес для создания и управления потоками
* \author Anthony Korbin * \author Anthony Korbin
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: PosixThread.h,v 1.7 2007/06/17 21:30:55 vpashka Exp $
*/ */
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
#ifndef PosixThread_h_ #ifndef PosixThread_h_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2006/12/20 10:39:01 $
* \version $Id: ProxyManager.h,v 1.6 2006/12/20 10:39:01 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef ProxyManager_H_ #ifndef ProxyManager_H_
......
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
//! \version $Id: Pulse.h,v 1.1 2008/12/14 21:57:51 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef Pulse_H_ #ifndef Pulse_H_
#define Pulse_H_ #define Pulse_H_
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Реализация RepositoryAgent * \brief Реализация RepositoryAgent
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 20:52:21 $
* \version $Id: RepositoryAgent.h,v 1.5 2005/01/28 20:52:21 vitlav Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef RepositoryAgent_H_ #ifndef RepositoryAgent_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Интерфейс к объекту сохраняющему список заказчиков и сообщений для InfoServer-а * \brief Интерфейс к объекту сохраняющему список заказчиков и сообщений для InfoServer-а
* \author Pavel Vainerman * \author Pavel Vainerman
* \version $Id: Restorer.h,v 1.4 2007/11/18 19:13:35 vpashka Exp $
* \date $Date: 2007/11/18 19:13:35 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef Restorer_H_ #ifndef Restorer_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Блокировка повторного запуска программы * \brief Блокировка повторного запуска программы
* \author Ahton Korbin, Pavel Vainerman * \author Ahton Korbin, Pavel Vainerman
* \date $Date: 2006/12/20 10:39:01 $
* \version $Id: RunLock.h,v 1.6 2006/12/20 10:39:01 vpashka Exp $
*/ */
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
#ifndef RunLock_H_ #ifndef RunLock_H_
......
// $Id: SMonitor.h,v 1.2 2007/12/17 22:51:00 vpashka Exp $
// ------------------------------------------------------------------------------------------
#ifndef SMonitor_H_ #ifndef SMonitor_H_
#define SMonitor_H_ #define SMonitor_H_
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
......
...@@ -20,9 +20,6 @@ ...@@ -20,9 +20,6 @@
/*! \file /*! \file
* \brief Программа просмотра состояния датчиков * \brief Программа просмотра состояния датчиков
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: SViewer.h,v 1.11 2007/06/17 21:30:55 vpashka Exp $
* \par
*/ */
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
#ifndef _SVIEWER_H #ifndef _SVIEWER_H
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// idea: lav@etersoft.ru // idea: lav@etersoft.ru
// realisation: pv@etersoft.ru, lav@etersoft.ru // realisation: pv@etersoft.ru, lav@etersoft.ru
//! \version $Id: SandClock.h,v 1.1 2008/10/05 19:00:53 vpashka Exp $
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef SandClock_H_ #ifndef SandClock_H_
#define SandClock_H_ #define SandClock_H_
......
...@@ -19,11 +19,8 @@ ...@@ -19,11 +19,8 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \version $Id: StorageInterface.h,v 1.2 2006/12/20 10:39:01 vpashka Exp $
* \date $Date: 2006/12/20 10:39:01 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef StorageInterface_H_ #ifndef StorageInterface_H_
#define StorageInterface_H_ #define StorageInterface_H_
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Ivan Donchevskiy * \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
* \version $Id: Jrn.h,v 1.0 2009/07/15 15:55:00 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Реализация SystemGuard * \brief Реализация SystemGuard
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: SystemGuard.h,v 1.9 2007/06/17 21:30:55 vpashka Exp $
*/ */
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
#ifndef SystemGuard_H_ #ifndef SystemGuard_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2007/01/02 22:30:48 $
* \version $Id: TextDBIndex.h,v 1.6 2007/01/02 22:30:48 vpashka Exp $
* \par * \par
* Базовый класс получения строки по её индексу * Базовый класс получения строки по её индексу
*/ */
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2007/01/02 22:30:48 $
* \version $Id: TextFileIndex.h,v 1.7 2007/01/02 22:30:48 vpashka Exp $
* \par * \par
* Базовый класс получения строки по её индексу * Базовый класс получения строки по её индексу
*/ */
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2007/01/02 22:30:48 $
* \version $Id: TextIndex.h,v 1.6 2007/01/02 22:30:48 vpashka Exp $
* \par * \par
* Базовый класс получения строки по её индексу * Базовый класс получения строки по её индексу
*/ */
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Создатель потоков * \brief Создатель потоков
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 20:52:21 $
* \version $Id: ThreadCreator.h,v 1.5 2005/01/28 20:52:21 vitlav Exp $
*/ */
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
#ifndef ThreadCreator_h_ #ifndef ThreadCreator_h_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Реализация TimerService * \brief Реализация TimerService
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:56 $
* \version $Id: TimerService.h,v 1.7 2007/06/17 21:30:56 vpashka Exp $
*/ */
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef TimerService_H_ #ifndef TimerService_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Триггер, позволяющий красиво засекать изменения во флаге * \brief Триггер, позволяющий красиво засекать изменения во флаге
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2006/11/18 14:53:58 $
* \version $Id: Trigger.h,v 1.1 2006/11/18 14:53:58 vpashka Exp $
*/ */
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#ifndef UNITRIGGER_H_ #ifndef UNITRIGGER_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief * \brief
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerAND.h,v 1.7 2008/06/01 21:36:19 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerAND_template.h,v 1.8 2008/06/01 21:36:19 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "TriggerAND.h" #include "TriggerAND.h"
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerOR.h,v 1.7 2008/06/01 21:36:19 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerOR_template.h,v 1.8 2008/06/01 21:36:19 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "TriggerOR.h" #include "TriggerOR.h"
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerOutput.h,v 1.7 2008/06/01 21:36:19 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerOutput_template.h,v 1.4 2008/06/01 21:36:19 vpashka Exp $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
* \brief Реализация базового(фундаментального) класса для объектов системы * \brief Реализация базового(фундаментального) класса для объектов системы
* (процессов управления, элементов графического интерфейса и т.п.) * (процессов управления, элементов графического интерфейса и т.п.)
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2009/01/16 23:16:42 $
* \version $Id: UniSetObject.h,v 1.19 2009/01/16 23:16:42 vpashka Exp $
*/ */
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef UniSetObject_H_ #ifndef UniSetObject_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/07/31 18:13:40 $
* \version $Id: UniSetObject_LT.h,v 1.5 2007/07/31 18:13:40 vpashka Exp $
*/ */
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef UniSetObject_LT_H_ #ifndef UniSetObject_LT_H_
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Базовый класс для реализации шаблона "наблюдатель" * \brief Базовый класс для реализации шаблона "наблюдатель"
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2006/12/20 10:39:04 $
* \version $Id: UniSetObserver.h,v 1.3 2006/12/20 10:39:04 vpashka Exp $
*/ */
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef UniSetObserver_H_ #ifndef UniSetObserver_H_
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2009/01/16 23:16:42 $
* \version $Id: UniSetTypes.h,v 1.12 2009/01/16 23:16:42 vpashka Exp $
* \brief базовые типы библиотеки UniSet * \brief базовые типы библиотеки UniSet
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2006/12/20 10:39:04 $
* \version $Id: UniXML.h,v 1.9 2006/12/20 10:39:04 vpashka Exp $
* \par * \par
* \bug НЕ РАБОТАЕТ функция findNode. (не ищет по полю name, если задать) * \bug НЕ РАБОТАЕТ функция findNode. (не ищет по полю name, если задать)
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
/*! \file /*! \file
* \brief Универсальный интерфейс для взаимодействия с объектами системы * \brief Универсальный интерфейс для взаимодействия с объектами системы
* \author Pavel Vainerman * \author Pavel Vainerman
* \version $Id: UniversalInterface.h,v 1.24 2008/12/14 21:57:51 vpashka Exp $
* \date $Date: 2008/12/14 21:57:51 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef UniversalInterface_H_ #ifndef UniversalInterface_H_
......
/* $Id: WDTInterface.h,v 1.1 2008/12/14 21:57:51 vpashka Exp $ */
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#ifndef WDTInterface_H_ #ifndef WDTInterface_H_
#define WDTInterface_H_ #define WDTInterface_H_
......
/*! $Id: ModbusClient.h,v 1.3 2009/01/11 19:08:46 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusClient_H_ #ifndef ModbusClient_H_
#define ModbusClient_H_ #define ModbusClient_H_
......
/*! $Id: ModbusHelpers.h,v 1.1 2009/01/12 20:40:11 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusHelpers_H_ #ifndef ModbusHelpers_H_
#define ModbusHelpers_H_ #define ModbusHelpers_H_
......
/*! $Id: ModbusRTUMaster.h,v 1.3 2009/02/24 20:27:25 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusRTUMaster_H_ #ifndef ModbusRTUMaster_H_
#define ModbusRTUMaster_H_ #define ModbusRTUMaster_H_
......
/*! $Id: ModbusRTUSlave.h,v 1.3 2009/02/24 20:27:25 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusRTUSlave_H_ #ifndef ModbusRTUSlave_H_
#define ModbusRTUSlave_H_ #define ModbusRTUSlave_H_
......
/*! $Id: ModbusRTUSlaveSlot.h,v 1.2 2009/02/24 20:27:25 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusRTUSlaveSlot_H_ #ifndef ModbusRTUSlaveSlot_H_
#define ModbusRTUSlaveSlot_H_ #define ModbusRTUSlaveSlot_H_
......
/*! $Id: ModbusServer.h,v 1.3 2009/01/11 19:08:46 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusServer_H_ #ifndef ModbusServer_H_
#define ModbusServer_H_ #define ModbusServer_H_
......
/*! $Id: ModbusServerSlot.h,v 1.1 2008/11/22 23:22:24 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusServerSlot_H_ #ifndef ModbusServerSlot_H_
#define ModbusServerSlot_H_ #define ModbusServerSlot_H_
......
/*! $Id: ModbusTCPCore.h,v 1.1 2008/11/22 23:22:24 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusTCPCore_H_ #ifndef ModbusTCPCore_H_
#define ModbusTCPCore_H_ #define ModbusTCPCore_H_
......
/*! $Id: ModbusTCPMaster.h,v 1.1 2008/11/22 23:22:24 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusTCPMaster_H_ #ifndef ModbusTCPMaster_H_
#define ModbusTCPMaster_H_ #define ModbusTCPMaster_H_
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
/*! $Id: ModbusTCPServer.h,v 1.2 2008/11/23 22:16:03 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusTCPServer_H_ #ifndef ModbusTCPServer_H_
#define ModbusTCPServer_H_ #define ModbusTCPServer_H_
......
/*! $Id: ModbusTCPServerSlot.h,v 1.1 2008/11/22 23:22:24 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusTCPServerSlot_H_ #ifndef ModbusTCPServerSlot_H_
#define ModbusTCPServerSlot_H_ #define ModbusTCPServerSlot_H_
......
/*! $Id: ModbusTypes.h,v 1.11 2008/11/22 23:22:24 vpashka Exp $ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#ifndef ModbusTypes_H_ #ifndef ModbusTypes_H_
#define ModbusTypes_H_ #define ModbusTypes_H_
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
/*! \file /*! \file
* \brief Обращения к последовательным интерфейсам * \brief Обращения к последовательным интерфейсам
* \author Nick Lezzhov, Pavel Veynerman, Vitaly Lipatov * \author Nick Lezzhov, Pavel Veynerman, Vitaly Lipatov
* \date $Date: 2009/02/24 20:27:25 $
*/ */
/**************************************************************************/ /**************************************************************************/
#include <cstdlib> #include <cstdlib>
......
...@@ -14,7 +14,7 @@ ModbusTCPMaster::ModbusTCPMaster(): ...@@ -14,7 +14,7 @@ ModbusTCPMaster::ModbusTCPMaster():
tcp(0), tcp(0),
nTransaction(0), nTransaction(0),
iaddr(""), iaddr(""),
force_disconnect(false) force_disconnect(true)
{ {
setCRCNoCheckit(true); setCRCNoCheckit(true);
} }
...@@ -45,34 +45,36 @@ mbErrCode ModbusTCPMaster::sendData( unsigned char* buf, int len ) ...@@ -45,34 +45,36 @@ mbErrCode ModbusTCPMaster::sendData( unsigned char* buf, int len )
mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
ModbusMessage& reply, timeout_t timeout ) ModbusMessage& reply, timeout_t timeout )
{ {
if( iaddr.empty() ) try
{ {
dlog[Debug::WARN] << "(query): unknown ip address for server..." << endl; if( iaddr.empty() )
return erHardwareError; {
} dlog[Debug::WARN] << "(query): unknown ip address for server..." << endl;
return erHardwareError;
}
if( !isConnection() ) if( !isConnection() )
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): no connection.. reconnnect..." << endl; dlog[Debug::INFO] << "(ModbusTCPMaster): no connection.. reconnnect..." << endl;
reconnect(); reconnect();
} }
if( !isConnection() ) if( !isConnection() )
{ {
dlog[Debug::WARN] << "(query): not connected to server..." << endl; dlog[Debug::WARN] << "(query): not connected to server..." << endl;
return erTimeOut; return erTimeOut;
} }
assert(timeout); assert(timeout);
ptTimeout.setTiming(timeout); ptTimeout.setTiming(timeout);
tcp->setTimeout(timeout); tcp->setTimeout(timeout);
// ost::Thread::setException(ost::Thread::throwException);
// ost::tpport_t port;
// cerr << "****** peer: " << tcp->getPeer(&port) << " err: " << tcp->getErrorNumber() << endl;
ost::Thread::setException(ost::Thread::throwException);
try
{
if( nTransaction >= numeric_limits<ModbusRTU::ModbusData>::max() ) if( nTransaction >= numeric_limits<ModbusRTU::ModbusData>::max() )
nTransaction = 0; nTransaction = 0;
...@@ -136,6 +138,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -136,6 +138,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
while( !qrecv.empty() ) while( !qrecv.empty() )
qrecv.pop(); qrecv.pop();
tcp->sync();
if( tcp->isPending(ost::Socket::pendingInput,timeout) ) if( tcp->isPending(ost::Socket::pendingInput,timeout) )
{ {
/* /*
...@@ -158,9 +161,14 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -158,9 +161,14 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
if( ret < (int)sizeof(rmh) ) if( ret < (int)sizeof(rmh) )
{ {
ost::tpport_t port;
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster::query): ret=" << (int)ret dlog[Debug::INFO] << "(ModbusTCPMaster::query): ret=" << (int)ret
<< " < rmh=" << (int)sizeof(rmh) << endl; << " < rmh=" << (int)sizeof(rmh)
<< " err: " << tcp->getErrorNumber()
<< " perr: " << tcp->getPeer(&port)
<< endl;
disconnect(); disconnect();
return erTimeOut; // return erHardwareError; return erTimeOut; // return erHardwareError;
} }
...@@ -211,17 +219,18 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -211,17 +219,18 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
{ {
dlog[Debug::WARN] << "(query): " << ex << endl; dlog[Debug::WARN] << "(query): " << ex << endl;
} }
catch(SystemError& err) catch( SystemError& err )
{ {
dlog[Debug::WARN] << "(query): " << err << endl; dlog[Debug::WARN] << "(query): " << err << endl;
} }
catch(Exception& ex) catch( Exception& ex )
{ {
dlog[Debug::WARN] << "(query): " << ex << endl; dlog[Debug::WARN] << "(query): " << ex << endl;
} }
catch( ost::SockException& e ) catch( ost::SockException& e )
{ {
dlog[Debug::WARN] << e.getString() << ": " << e.getSystemErrorString() << endl; dlog[Debug::WARN] << "(query): tcp error: " << e.getString() << endl;
return erTimeOut;
} }
catch(...) catch(...)
{ {
...@@ -252,19 +261,42 @@ void ModbusTCPMaster::reconnect() ...@@ -252,19 +261,42 @@ void ModbusTCPMaster::reconnect()
// cerr << "tcp diconnect..." << endl; // cerr << "tcp diconnect..." << endl;
tcp->disconnect(); tcp->disconnect();
delete tcp; delete tcp;
tcp = 0;
} }
ost::Thread::setException(ost::Thread::throwException); ost::Thread::setException(ost::Thread::throwException);
// cerr << "create new tcp..." << endl; try
tcp = new ost::TCPStream(iaddr.c_str()); {
tcp->setTimeout(500); // TCPStream (const char *name, Family family=IPV4, unsigned mss=536, bool throwflag=false, timeout_t timer=0)
tcp = new ost::TCPStream(iaddr.c_str(),ost::Socket::IPV4,536,true,500);
tcp->setTimeout(replyTimeOut_ms);
}
catch(ost::Socket *socket)
{
ost::tpport_t port;
int err = socket->getErrorNumber();
ost::InetAddress saddr = (ost::InetAddress)socket->getPeer(&port);
dlog[Debug::CRIT] << "tcp error " << saddr.getHostname() << ":" << port << " = " << err << endl;
}
catch( ost::SockException& e)
{
dlog[Debug::CRIT] << "tcp error: " << e.getString() << endl;
}
catch(...)
{
dlog[Debug::CRIT] << "create TCPStream[" << iaddr << "] error..." << endl;
}
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusTCPMaster::connect( ost::InetAddress addr, int port ) void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
{ {
if( tcp ) if( tcp )
{
disconnect(); disconnect();
delete tcp;
tcp = 0;
}
// if( !tcp ) // if( !tcp )
// { // {
...@@ -275,9 +307,26 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port ) ...@@ -275,9 +307,26 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
dlog[Debug::INFO] << "(ModbusTCPMaster): connect to " << s.str() << endl; dlog[Debug::INFO] << "(ModbusTCPMaster): connect to " << s.str() << endl;
iaddr = s.str(); iaddr = s.str();
tcp = new ost::TCPStream(iaddr.c_str()); try
tcp->setTimeout(500); {
tcp = new ost::TCPStream(iaddr.c_str());
tcp->setTimeout(replyTimeOut_ms);
}
catch(ost::Socket *socket)
{
ost::tpport_t port;
int err = socket->getErrorNumber();
ost::InetAddress saddr = (ost::InetAddress)socket->getPeer(&port);
dlog[Debug::CRIT] << ": tcp error " << saddr.getHostname() << ":" << port << " = " << err << endl;
}
catch( ost::SockException& e)
{
dlog[Debug::CRIT] << "tcp error: " << e.getString() << endl;
}
catch(...)
{
dlog[Debug::CRIT] << "create TCPStream[" << iaddr << "] error..." << endl;
}
// } // }
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
...@@ -5,9 +5,6 @@ ...@@ -5,9 +5,6 @@
/*! \file /*! \file
* \brief Класс для дискретной карты O5600 * \brief Класс для дискретной карты O5600
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2006/12/19 15:46:14 $
*
*
*/ */
/**************************************************************************/ /**************************************************************************/
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/12/14 21:57:51 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <omniORB4/CORBA.h> #include <omniORB4/CORBA.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <omniORB4/CORBA.h> #include <omniORB4/CORBA.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/27 21:54:19 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <omniORB4/CORBA.h> #include <omniORB4/CORBA.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <omniORB4/CORBA.h> #include <omniORB4/CORBA.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/12/14 21:57:51 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2009/02/10 20:38:27 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <cstdlib> #include <cstdlib>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 21:07:41 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "Exceptions.h" #include "Exceptions.h"
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/02/21 19:59:57 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/11/29 21:24:25 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <sstream> #include <sstream>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/29 22:19:54 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <unistd.h> #include <unistd.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 21:07:41 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "Exceptions.h" #include "Exceptions.h"
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2009/01/16 23:16:42 $
*/ */
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <cmath> #include <cmath>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2009/02/07 13:25:59 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
//#include <stream.h> //#include <stream.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/11/29 21:24:25 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 21:09:33 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "Exceptions.h" #include "Exceptions.h"
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 21:09:33 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
/*! \file /*! \file
* \brief файл реализации DB-сервера * \brief файл реализации DB-сервера
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2006/12/20 13:43:41 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
/*! \file /*! \file
* \brief файл реализации Info-сервера * \brief файл реализации Info-сервера
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/01/17 23:33:41 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <string> #include <string>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 21:10:33 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:58 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <unistd.h> #include <unistd.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Anthony Korbin * \author Anthony Korbin
* \date $Date: 2005/10/06 21:47:42 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "PosixThread.h" #include "PosixThread.h"
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 21:12:49 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/29 22:19:54 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <time.h> #include <time.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/08/02 22:52:28 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/01/28 21:12:49 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
/*! \file /*! \file
* \brief Класс работы с конфигурацией * \brief Класс работы с конфигурацией
* \author Vitaly Lipatov, Pavel Vainerman * \author Vitaly Lipatov, Pavel Vainerman
* \date $Date: 2008/09/16 19:02:46 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Ivan Donchevskiy * \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2005/07/21 17:41:43 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/12/14 21:57:51 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <sstream> #include <sstream>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <sstream> #include <sstream>
......
/*! \file /*! \file
* \brief Класс работы с сообщениями * \brief Класс работы с сообщениями
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2008/11/22 23:22:25 $
*/ */
/**************************************************************************/ /**************************************************************************/
#include <sstream> #include <sstream>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:58 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/15 23:53:36 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/12/18 20:24:12 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2009/01/11 19:08:46 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <sstream> #include <sstream>
...@@ -444,41 +443,37 @@ bool NCRestorer_XML::getConsumerList( UniXML& xml,xmlNode* node, ...@@ -444,41 +443,37 @@ bool NCRestorer_XML::getConsumerList( UniXML& xml,xmlNode* node,
bool NCRestorer_XML::getThresholdInfo( UniXML& xml,xmlNode* node, bool NCRestorer_XML::getThresholdInfo( UniXML& xml,xmlNode* node,
IONotifyController::ThresholdInfoExt& ti ) IONotifyController::ThresholdInfoExt& ti )
{ {
string sid_name = xml.getProp(node,"sid"); UniXML_iterator uit(node);
string sid_name = uit.getProp("sid");
if( !sid_name.empty() ) if( !sid_name.empty() )
{ {
ti.sid = conf->getSensorID(sid_name); ti.sid = conf->getSensorID(sid_name);
if( ti.sid == UniSetTypes::DefaultObjectId ) if( ti.sid == UniSetTypes::DefaultObjectId )
{ {
unideb[Debug::CRIT] << "(NCRestorer_XML:getThresholdInfo): " unideb[Debug::CRIT] << "(NCRestorer_XML:getThresholdInfo): "
<< " Неверно указан НАЗВАНИЕ датчика " << sid_name << " Not found ID for " << sid_name << endl;
<< " Не найден ID для данного дачика\n" << flush; }
else
{
UniversalIO::IOTypes iotype = conf->getIOType(sid_name);
// Пока что IONotifyController поддерживает работу только с 'DI'.
if( iotype != UniversalIO::DigitalInput )
{
unideb[Debug::CRIT] << "(NCRestorer_XML:getThresholdInfo): "
<< " Bad iotype for " << sid_name << ". iotype must be 'DI'!" << endl;
return false;
}
} }
} }
UniXML_iterator uit(node);
ti.id = uit.getIntProp("id"); ti.id = uit.getIntProp("id");
ti.lowlimit = uit.getIntProp("lowlimit"); ti.lowlimit = uit.getIntProp("lowlimit");
ti.hilimit = uit.getIntProp("hilimit"); ti.hilimit = uit.getIntProp("hilimit");
ti.sensibility = uit.getIntProp("sensibility"); ti.sensibility = uit.getIntProp("sensibility");
ti.inverse = uit.getIntProp("inverse"); ti.inverse = uit.getIntProp("inverse");
ti.state = IONotifyController_i::NormalThreshold; ti.state = IONotifyController_i::NormalThreshold;
if( ti.sid == UniSetTypes::DefaultObjectId )
{
string sid_name(uit.getProp("sid"));
if( !sid_name.empty() )
{
ti.sid = conf->getSensorID(sid_name);
if( ti.sid == UniSetTypes::DefaultObjectId )
{
unideb[Debug::CRIT] << "(NCRestorer_XML:getThresholdInfo): "
<< " Неверно указан НАЗВАНИЕ датчика " << sid_name
<< " Не найден ID для данного дачика\n" << flush;
}
}
}
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <sstream> #include <sstream>
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
/*! \file /*! \file
* \brief Блокировка повторного запуска программы * \brief Блокировка повторного запуска программы
* \author Ahton Korbin<ahtoh>, Pavel Vainerman * \author Ahton Korbin<ahtoh>, Pavel Vainerman
* \date $Date: 2006/12/20 13:43:41 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <dirent.h> #include <dirent.h>
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
/*! \file /*! \file
* \brief Программа просмотра состояния датчиков * \brief Программа просмотра состояния датчиков
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <sstream> #include <sstream>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Pavel Vainerman * \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <sstream> #include <sstream>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Ivan Donchevskiy * \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Ivan Donchevskiy * \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2005/01/28 21:14:18 $
* \par * \par
* Базовый класс получения строки по её индексу * Базовый класс получения строки по её индексу
*/ */
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2005/01/28 21:14:18 $
* \par * \par
* Базовый класс получения строки по её индексу * Базовый класс получения строки по её индексу
*/ */
......
...@@ -19,8 +19,6 @@ ...@@ -19,8 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Vitaly Lipatov * \author Vitaly Lipatov
* \date $Date: 2006/12/20 13:43:41 $
* \par
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <unistd.h> #include <unistd.h>
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Ivan Donchevskiy * \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! \file /*! \file
* \author Ivan Donchevskiy * \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "stdio.h" #include "stdio.h"
......
...@@ -10,7 +10,7 @@ PassiveTimer pt(1000); ...@@ -10,7 +10,7 @@ PassiveTimer pt(1000);
int main() int main()
{ {
PassiveTimer pt1(5000); PassiveTimer pt1(5000);
cout << " pt1.getInterval()=" << pt1.getInterval() << endl; cout << " pt1.getInterval()=" << pt1.getInterval() << " TEST: " << ((pt1.getInterval()==5000) ? "OK" : "FAILED") << endl;
PassiveTimer pt2; PassiveTimer pt2;
cout << " pt2.getInterval()=" << pt2.getInterval() << endl; cout << " pt2.getInterval()=" << pt2.getInterval() << endl;
......
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