Commit 5955d512 authored by Pavel Vainerman's avatar Pavel Vainerman

new version

parent 6dfe533b
...@@ -48,10 +48,10 @@ ...@@ -48,10 +48,10 @@
<HeartBeatTime time_msec="5000"/> <HeartBeatTime time_msec="5000"/>
<RSExchange name="RSExchange"> <RSExchange name="RSExchange" speed="38400">
<RespondList> <DeviceList>
<item addr="0x02" respondSensor="RTU_Not_Respond_FS" timeout="2000" invert="1" default="1"/> <item addr="0x02" speed="9600" respondSensor="RTU_Not_Respond_FS" timeout="2000" invert="0"/>
</RespondList> </DeviceList>
</RSExchange> </RSExchange>
</settings> </settings>
......
...@@ -12,6 +12,7 @@ using namespace UniSetExtensions; ...@@ -12,6 +12,7 @@ using namespace UniSetExtensions;
RTUExchange::RTUExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic ): RTUExchange::RTUExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic ):
UniSetObject_LT(objId), UniSetObject_LT(objId),
mb(0), mb(0),
defSpeed(ComPort::ComSpeed0),
shm(0), shm(0),
initPause(0), initPause(0),
force(false), force(false),
...@@ -48,10 +49,12 @@ allNotRespond(false) ...@@ -48,10 +49,12 @@ allNotRespond(false)
if( devname.empty() ) if( devname.empty() )
throw UniSetTypes::SystemError(myname+"(RTUExchange): Unknown device..." ); throw UniSetTypes::SystemError(myname+"(RTUExchange): Unknown device..." );
speed = conf->getArgParam("--rs-speed",it.getProp("speed")); string speed = conf->getArgParam("--rs-speed",it.getProp("speed"));
if( speed.empty() ) if( speed.empty() )
speed = "38400"; speed = "38400";
defSpeed = ComPort::getSpeed(speed);
recv_timeout = atoi(conf->getArgParam("--rs-recv-timeout",it.getProp("recv_timeout")).c_str()); recv_timeout = atoi(conf->getArgParam("--rs-recv-timeout",it.getProp("recv_timeout")).c_str());
if( recv_timeout <= 0 ) if( recv_timeout <= 0 )
recv_timeout = 50; recv_timeout = 50;
...@@ -83,7 +86,7 @@ allNotRespond(false) ...@@ -83,7 +86,7 @@ allNotRespond(false)
{ {
readConfiguration(); readConfiguration();
rtuQueryOptimization(rmap); rtuQueryOptimization(rmap);
initRespondList(); initDeviceList();
} }
else else
ic->addReadItem( sigc::mem_fun(this,&RTUExchange::readItem) ); ic->addReadItem( sigc::mem_fun(this,&RTUExchange::readItem) );
...@@ -182,15 +185,15 @@ void RTUExchange::initMB( bool reopen ) ...@@ -182,15 +185,15 @@ void RTUExchange::initMB( bool reopen )
{ {
mb = new ModbusRTUMaster(devname); mb = new ModbusRTUMaster(devname);
if( !speed.empty() ) if( defSpeed != ComPort::ComSpeed0 )
mb->setSpeed(speed); mb->setSpeed(defSpeed);
// mb->setLog(dlog); // mb->setLog(dlog);
if( recv_timeout > 0 ) if( recv_timeout > 0 )
mb->setTimeout(recv_timeout); mb->setTimeout(recv_timeout);
dlog[Debug::INFO] << myname << "(init): dev=" << devname << " speed=" << speed << endl; dlog[Debug::INFO] << myname << "(init): dev=" << devname << " speed=" << ComPort::getSpeed(defSpeed) << endl;
} }
catch(...) catch(...)
{ {
...@@ -273,9 +276,17 @@ void RTUExchange::poll() ...@@ -273,9 +276,17 @@ void RTUExchange::poll()
return; return;
} }
ComPort::Speed s = mb->getSpeed();
for( RTUExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 ) for( RTUExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{ {
RTUDevice* d(it1->second); RTUDevice* d(it1->second);
if( d->speed != s )
{
s = d->speed;
mb->setSpeed(d->speed);
}
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(poll): ask addr=" << ModbusRTU::addr2str(d->mbaddr) << endl; dlog[Debug::INFO] << myname << "(poll): ask addr=" << ModbusRTU::addr2str(d->mbaddr) << endl;
...@@ -505,6 +516,14 @@ bool RTUExchange::RTUDevice::checkRespond() ...@@ -505,6 +516,14 @@ bool RTUExchange::RTUDevice::checkRespond()
if( resp_state && !resp_real && resp_ptTimeout.checkTime() ) if( resp_state && !resp_real && resp_ptTimeout.checkTime() )
resp_state = false; resp_state = false;
// ݣ SM
// true,
if( !resp_init )
{
resp_init = true;
return true;
}
return ( prev != resp_state ); return ( prev != resp_state );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -524,7 +543,7 @@ void RTUExchange::updateSM() ...@@ -524,7 +543,7 @@ void RTUExchange::updateSM()
if( d->resp_real ) if( d->resp_real )
allNotRespond = false; allNotRespond = false;
// update respond sensors...... // update respond sensors...
if( d->checkRespond() && d->resp_id != DefaultObjectId ) if( d->checkRespond() && d->resp_id != DefaultObjectId )
{ {
try try
...@@ -649,7 +668,7 @@ void RTUExchange::sysCommand( UniSetTypes::SystemMessage *sm ) ...@@ -649,7 +668,7 @@ void RTUExchange::sysCommand( UniSetTypes::SystemMessage *sm )
dlog[Debug::INFO] << myname << "(sysCommand): rmap size= " << rmap.size() << endl; dlog[Debug::INFO] << myname << "(sysCommand): rmap size= " << rmap.size() << endl;
if( !shm->isLocalwork() ) if( !shm->isLocalwork() )
initRespondList(); initDeviceList();
waitSMReady(); waitSMReady();
...@@ -1189,6 +1208,7 @@ bool RTUExchange::initRTUDevice( RTUDevice* d, UniXML_iterator& it ) ...@@ -1189,6 +1208,7 @@ bool RTUExchange::initRTUDevice( RTUDevice* d, UniXML_iterator& it )
return false; return false;
} }
d->speed = defSpeed;
d->mbaddr = ModbusRTU::str2mbAddr(addr); d->mbaddr = ModbusRTU::str2mbAddr(addr);
return true; return true;
} }
...@@ -1471,9 +1491,9 @@ std::ostream& operator<<( std::ostream& os, const RTUExchange::RSProperty& p ) ...@@ -1471,9 +1491,9 @@ std::ostream& operator<<( std::ostream& os, const RTUExchange::RSProperty& p )
return os; return os;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void RTUExchange::initRespondList() void RTUExchange::initDeviceList()
{ {
xmlNode* respNode = conf->findNode(cnode,"RespondList"); xmlNode* respNode = conf->findNode(cnode,"DeviceList");
if( respNode ) if( respNode )
{ {
UniXML_iterator it1(respNode); UniXML_iterator it1(respNode);
...@@ -1482,33 +1502,33 @@ void RTUExchange::initRespondList() ...@@ -1482,33 +1502,33 @@ void RTUExchange::initRespondList()
for(;it1.getCurrent(); it1.goNext() ) for(;it1.getCurrent(); it1.goNext() )
{ {
ModbusRTU::ModbusAddr a = ModbusRTU::str2mbAddr(it1.getProp("addr")); ModbusRTU::ModbusAddr a = ModbusRTU::str2mbAddr(it1.getProp("addr"));
initRespondInfo(rmap,a,it1); initDeviceInfo(rmap,a,it1);
} }
} }
else else
dlog[Debug::WARN] << myname << "(init): <RespondList> empty section..." << endl; dlog[Debug::WARN] << myname << "(init): <DeviceList> empty section..." << endl;
} }
else else
dlog[Debug::WARN] << myname << "(init): <RespondList> not found..." << endl; dlog[Debug::WARN] << myname << "(init): <DeviceList> not found..." << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool RTUExchange::initRespondInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML_iterator& it ) bool RTUExchange::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML_iterator& it )
{ {
RTUDeviceMap::iterator d = m.find(a); RTUDeviceMap::iterator d = m.find(a);
if( d == m.end() ) if( d == m.end() )
{ {
dlog[Debug::WARN] << myname << "(initRespondInfo): not found device for addr=" << ModbusRTU::addr2str(a) << endl; dlog[Debug::WARN] << myname << "(initDeviceInfo): not found device for addr=" << ModbusRTU::addr2str(a) << endl;
return false; return false;
} }
d->second->resp_id = conf->getSensorID(it.getProp("respondSensor")); d->second->resp_id = conf->getSensorID(it.getProp("respondSensor"));
if( d->second->resp_id == DefaultObjectId ) if( d->second->resp_id == DefaultObjectId )
{ {
dlog[Debug::CRIT] << myname << ": not found ID for noRespondSensor=" << it.getProp("respondSensor") << endl; dlog[Debug::CRIT] << myname << "(initDeviceInfo): not found ID for noRespondSensor=" << it.getProp("respondSensor") << endl;
return false; return false;
} }
dlog[Debug::INFO] << myname << "(initRespondList): add addr=" << ModbusRTU::addr2str(a) << endl; dlog[Debug::INFO] << myname << "(initDeviceInfo): add addr=" << ModbusRTU::addr2str(a) << endl;
int tout = atoi(it.getProp("timeout").c_str()); int tout = atoi(it.getProp("timeout").c_str());
if( tout > 0 ) if( tout > 0 )
d->second->resp_ptTimeout.setTiming(tout); d->second->resp_ptTimeout.setTiming(tout);
...@@ -1516,18 +1536,20 @@ bool RTUExchange::initRespondInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, Uni ...@@ -1516,18 +1536,20 @@ bool RTUExchange::initRespondInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, Uni
d->second->resp_ptTimeout.setTiming(UniSetTimer::WaitUpTime); d->second->resp_ptTimeout.setTiming(UniSetTimer::WaitUpTime);
d->second->resp_invert = atoi(it.getProp("invert").c_str()); d->second->resp_invert = atoi(it.getProp("invert").c_str());
/*
if( !it.getProp("default").empty() ) string s = it.getProp("speed");
if( !s.empty() )
{ {
d->second->resp_state = UniSetTypes::uni_atoi(it.getProp("default").c_str()); d->second->speed = ComPort::getSpeed(s);
d->second->resp_real = UniSetTypes::uni_atoi(it.getProp("default").c_str()); if( d->second->speed == ComPort::ComSpeed0 )
{
d->second->speed = defSpeed;
dlog[Debug::CRIT] << myname << "(initDeviceInfo): Unknown speed=" << s <<
" for addr=" << ModbusRTU::addr2str(a) << endl;
return false;
}
} }
*/
/*
d->second->resp_real = true;
d->second->resp_state = false;
d->second->resp_trTimeout.change(false);
*/
return true; return true;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -119,6 +119,7 @@ class RTUExchange: ...@@ -119,6 +119,7 @@ class RTUExchange:
struct RTUDevice struct RTUDevice
{ {
RTUDevice(): RTUDevice():
speed(ComPort::ComSpeed38400),
respnond(false), respnond(false),
mbaddr(0), mbaddr(0),
dtype(dtUnknown), dtype(dtUnknown),
...@@ -126,11 +127,14 @@ class RTUExchange: ...@@ -126,11 +127,14 @@ class RTUExchange:
resp_state(false), resp_state(false),
resp_invert(false), resp_invert(false),
resp_real(true), resp_real(true),
resp_init(false),
rtu(0) rtu(0)
{ {
resp_trTimeout.change(false); resp_trTimeout.change(false);
} }
ComPort::Speed speed;
bool respnond; bool respnond;
ModbusRTU::ModbusAddr mbaddr; /*!< */ ModbusRTU::ModbusAddr mbaddr; /*!< */
RegMap regmap; RegMap regmap;
...@@ -144,6 +148,7 @@ class RTUExchange: ...@@ -144,6 +148,7 @@ class RTUExchange:
bool resp_state; bool resp_state;
bool resp_invert; bool resp_invert;
bool resp_real; bool resp_real;
bool resp_init;
RTUStorage* rtu; RTUStorage* rtu;
...@@ -166,7 +171,7 @@ class RTUExchange: ...@@ -166,7 +171,7 @@ class RTUExchange:
ModbusRTUMaster* mb; ModbusRTUMaster* mb;
UniSetTypes::uniset_mutex mbMutex; UniSetTypes::uniset_mutex mbMutex;
std::string devname; std::string devname;
std::string speed; ComPort::Speed defSpeed;
int recv_timeout; int recv_timeout;
xmlNode* cnode; xmlNode* cnode;
...@@ -174,7 +179,7 @@ class RTUExchange: ...@@ -174,7 +179,7 @@ class RTUExchange:
std::string s_fvalue; std::string s_fvalue;
SMInterface* shm; SMInterface* shm;
void step(); void step();
void poll(); void poll();
bool pollRTU( RTUDevice* dev, RegMap::iterator& it ); bool pollRTU( RTUDevice* dev, RegMap::iterator& it );
...@@ -202,7 +207,7 @@ class RTUExchange: ...@@ -202,7 +207,7 @@ class RTUExchange:
void initIterators(); void initIterators();
bool initItem( UniXML_iterator& it ); bool initItem( UniXML_iterator& it );
bool readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec ); bool readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec );
void initRespondList(); void initDeviceList();
void initOffsetList(); void initOffsetList();
...@@ -216,7 +221,7 @@ class RTUExchange: ...@@ -216,7 +221,7 @@ class RTUExchange:
bool initRSProperty( RSProperty& p, UniXML_iterator& it ); bool initRSProperty( RSProperty& p, UniXML_iterator& it );
bool initRegInfo( RegInfo* r, UniXML_iterator& it, RTUDevice* dev ); bool initRegInfo( RegInfo* r, UniXML_iterator& it, RTUDevice* dev );
bool initRTUDevice( RTUDevice* d, UniXML_iterator& it ); bool initRTUDevice( RTUDevice* d, UniXML_iterator& it );
bool initRespondInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML_iterator& it ); bool initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML_iterator& it );
void rtuQueryOptimization( RTUDeviceMap& m ); void rtuQueryOptimization( RTUDeviceMap& m );
......
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