Commit c58f3217 authored by Pavel Vainerman's avatar Pavel Vainerman

new version: add RespondList configuration

parent 46c0b770
...@@ -68,7 +68,13 @@ ...@@ -68,7 +68,13 @@
</MBSlave1> </MBSlave1>
<RTUExchange name="RTUExchange"/> <RTUExchange name="RTUExchange">
<RespondList>
<item addr="0x01" respondSensor="RespondRTU_S" timeout="5000"/>
<item addr="0x02" respondSensor="NoRespondRTU2_S" timeout="5000" invert="1"/>
</RespondList>
</RTUExchange>
<UDPExchange name="UDPExchange"/> <UDPExchange name="UDPExchange"/>
<UDPExchange2 name="UDPExchange2"/> <UDPExchange2 name="UDPExchange2"/>
...@@ -92,9 +98,9 @@ ...@@ -92,9 +98,9 @@
<!-- ************************ ********************** --> <!-- ************************ ********************** -->
<sensors name="Sensors"> <sensors name="Sensors">
<item name="Input1_S" textname=" 1" node="" iotype="DI" priority="Medium" default="1" /> <item name="Input1_S" textname=" 1" node="" iotype="DI" priority="Medium" default="1" />
<item name="Input2_S" textname=" 2" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x31" mbfunc="0x04" mbreg="0x02" rs="1" /> <item name="Input2_S" textname=" 2" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x01" mbfunc="0x04" mbreg="0x02" rs="1" />
<item name="Input3_S" textname=" 3" node="" iotype="DI" priority="Medium" mbtcp="1" mbaddr="0x31" mbfunc="0x04" mbreg="0x02"/> <item name="Input3_S" textname=" 3" node="" iotype="DI" priority="Medium" mbtcp="1" mbaddr="0x02" mbfunc="0x04" mbreg="0x02"/>
<item name="Input4_S" textname=" 4" node="" iotype="DI" priority="Medium" udp="1"/> <item name="Input4_S" textname=" 4" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x02" mbfunc="0x04" mbreg="0x02" rs="1" />
<item name="Input5_S" textname=" 5" node="" iotype="DI" priority="Medium" udp="2"/> <item name="Input5_S" textname=" 5" node="" iotype="DI" priority="Medium" udp="2"/>
<item name="Input6_S" textname=" 6" node="" iotype="DI" priority="Medium" udp="2"> <item name="Input6_S" textname=" 6" node="" iotype="DI" priority="Medium" udp="2">
<depends> <depends>
...@@ -112,6 +118,10 @@ ...@@ -112,6 +118,10 @@
</item> </item>
<item name="Threshold1_S" textname="" node="" iotype="DI" priority="Medium"/> <item name="Threshold1_S" textname="" node="" iotype="DI" priority="Medium"/>
<item name="TestMode_S" textname="test" node="" iotype="DI" priority="Medium"/> <item name="TestMode_S" textname="test" node="" iotype="DI" priority="Medium"/>
<item name="RespondRTU_S" textname="respond rtu" node="" iotype="DI"/>
<item name="NoRespondRTU2_S" textname="no respond rtu" node="" iotype="DI"/>
</sensors> </sensors>
<thresholds name="thresholds"> <thresholds name="thresholds">
......
...@@ -32,7 +32,6 @@ activated(false) ...@@ -32,7 +32,6 @@ activated(false)
if( cnode == NULL ) if( cnode == NULL )
throw UniSetTypes::SystemError("(RTUExchange): Not find conf-node for " + myname ); throw UniSetTypes::SystemError("(RTUExchange): Not find conf-node for " + myname );
shm = new SMInterface(shmId,&ui,objId,ic); shm = new SMInterface(shmId,&ui,objId,ic);
UniXML_iterator it(cnode); UniXML_iterator it(cnode);
...@@ -55,14 +54,6 @@ activated(false) ...@@ -55,14 +54,6 @@ activated(false)
int recv_timeout = atoi(conf->getArgParam("--rs-recv-timeout",it.getProp("recv_timeout")).c_str()); int recv_timeout = atoi(conf->getArgParam("--rs-recv-timeout",it.getProp("recv_timeout")).c_str());
sidNotRespond = conf->getSensorID(conf->getArgParam("--rs-notRespondSensor",it.getProp("notRespondSensor")));
// string saddr = conf->getArgParam("--rs-my-addr",it.getProp("addr"));
// ModbusRTU::ModbusAddr myaddr = ModbusRTU::str2mbAddr(saddr);
// if( saddr.empty() )
// myaddr = 0x01;
mbregFromID = atoi(conf->getArgParam("--mbs-reg-from-id",it.getProp("reg_from_id")).c_str()); mbregFromID = atoi(conf->getArgParam("--mbs-reg-from-id",it.getProp("reg_from_id")).c_str());
dlog[Debug::INFO] << myname << "(init): mbregFromID=" << mbregFromID << endl; dlog[Debug::INFO] << myname << "(init): mbregFromID=" << mbregFromID << endl;
...@@ -146,9 +137,36 @@ activated(false) ...@@ -146,9 +137,36 @@ activated(false)
if( msec <=0 ) if( msec <=0 )
msec = 3000; msec = 3000;
ptTimeout.setTiming(msec); xmlNode* respNode = conf->findNode(cnode,"RespondList");
if( respNode )
{
UniXML_iterator it1(respNode);
if( it1.goChildren() )
{
for(;it1.getCurrent(); it1.goNext() )
{
RespondInfo ri;
ModbusRTU::ModbusAddr a = ModbusRTU::str2mbAddr(it1.getProp("addr"));
ri.id = conf->getSensorID(it1.getProp("respondSensor"));
if( ri.id == DefaultObjectId )
{
dlog[Debug::CRIT] << myname << ": not found ID for noRespondSensor=" << it1.getProp("respondSensor") << endl;
continue;
}
int tout = atoi(it1.getProp("timeout").c_str());
if( tout > 0 )
ri.ptTimeout.setTiming(tout);
else
ri.ptTimeout.setTiming(UniSetTimer::WaitUpTime);
ri.invert = atoi(it1.getProp("invert").c_str());
respMap[a] = ri;
}
}
}
dlog[Debug::INFO] << myname << "(init): rs-timeout=" << msec << " msec" << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
RTUExchange::~RTUExchange() RTUExchange::~RTUExchange()
...@@ -308,17 +326,31 @@ void RTUExchange::step() ...@@ -308,17 +326,31 @@ void RTUExchange::step()
<< "(step): (hb) " << ex << std::endl; << "(step): (hb) " << ex << std::endl;
} }
} }
for( RespondMap::iterator it=respMap.begin(); it!=respMap.end(); ++it )
{
try
{
bool set = it->second.invert ? !it->second.state : it->second.state;
shm->localSaveState(it->second.dit,it->second.id,set,getId());
}
catch(Exception& ex)
{
dlog[Debug::CRIT] << myname
<< "(step): (respond) " << ex << std::endl;
}
}
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void RTUExchange::poll() void RTUExchange::poll()
{ {
bool respond_ok = true;
for( RTUMap::iterator it=rtulist.begin(); it!=rtulist.end(); ++it ) for( RTUMap::iterator it=rtulist.begin(); it!=rtulist.end(); ++it )
{ {
if( !activated ) if( !activated )
return; return;
bool respOK = true;
try try
{ {
cout << "poll RTU=(" << (int)it->second->getAddress() cout << "poll RTU=(" << (int)it->second->getAddress()
...@@ -334,8 +366,10 @@ void RTUExchange::poll() ...@@ -334,8 +366,10 @@ void RTUExchange::poll()
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
{ {
cout << " [ FAILED ] (" << ex << ")" << endl; cout << " [ FAILED ] (" << ex << ")" << endl;
respond_ok = false; respOK = false;
} }
setRespond(it->second->getAddress(),respOK);
} }
for( RSMap::iterator it=rsmap.begin(); it!=rsmap.end(); ++it ) for( RSMap::iterator it=rsmap.begin(); it!=rsmap.end(); ++it )
...@@ -415,11 +449,15 @@ void RTUExchange::poll() ...@@ -415,11 +449,15 @@ void RTUExchange::poll()
} }
} }
if( it->devtype != dtRTU188 )
setRespond(it->mbaddr,true);
continue; continue;
} }
catch(ModbusRTU::mbException& ex ) catch(ModbusRTU::mbException& ex )
{ {
dlog[Debug::LEVEL3] << myname << "(poll): " << ex << endl; dlog[Debug::LEVEL3] << myname << "(poll): " << ex << endl;
if( it->devtype != dtRTU188 )
setRespond(it->mbaddr,false);
} }
catch(IOController_i::NameNotFound &ex) catch(IOController_i::NameNotFound &ex)
{ {
...@@ -446,21 +484,6 @@ void RTUExchange::poll() ...@@ -446,21 +484,6 @@ void RTUExchange::poll()
{ {
dlog[Debug::LEVEL3] << myname << "(poll): catch ..." << endl; dlog[Debug::LEVEL3] << myname << "(poll): catch ..." << endl;
} }
respond_ok = false;
}
if( sidNotRespond!=DefaultObjectId )
{
if( trTimeout.hi( !respond_ok ) )
ptTimeout.reset();
else if( respond_ok )
ptTimeout.reset();
if( !respond_ok && ptTimeout.checkTime() )
shm->localSaveState(ditNotRespond,sidNotRespond,true,getId());
else
shm->localSaveState(ditNotRespond,sidNotRespond,false,getId());
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -1121,7 +1144,12 @@ void RTUExchange::initIterators() ...@@ -1121,7 +1144,12 @@ void RTUExchange::initIterators()
} }
shm->initAIterator(aitHeartBeat); shm->initAIterator(aitHeartBeat);
shm->initDIterator(ditNotRespond);
for( RespondMap::iterator it=respMap.begin(); it!=respMap.end(); ++it )
{
shm->initDIterator(it->second.dit);
it->second.ptTimeout.reset();
}
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void RTUExchange::help_print( int argc, char* argv[] ) void RTUExchange::help_print( int argc, char* argv[] )
...@@ -1231,3 +1259,26 @@ std::ostream& operator<<( std::ostream& os, RTUExchange::RSProperty& p ) ...@@ -1231,3 +1259,26 @@ std::ostream& operator<<( std::ostream& os, RTUExchange::RSProperty& p )
return os; return os;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void RTUExchange::setRespond( ModbusRTU::ModbusAddr addr, bool respond )
{
RespondMap::iterator it = respMap.find(addr);
if( it != respMap.end() )
{
if( it->second.trTimeout.change(respond) )
{
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(setRespond): ("
<< (int)addr << ")" << ModbusRTU::addr2str(addr)
<< " state=" << respond << endl;
if( respond )
it->second.state = true;
it->second.ptTimeout.reset();
}
if( it->second.state && !respond && it->second.ptTimeout.checkTime() )
it->second.state = false;
}
}
// -----------------------------------------------------------------------------
...@@ -100,6 +100,7 @@ class RTUExchange: ...@@ -100,6 +100,7 @@ class RTUExchange:
long pollRTU188( RSMap::iterator& p ); long pollRTU188( RSMap::iterator& p );
long pollMTR( RSMap::iterator& p ); long pollMTR( RSMap::iterator& p );
long pollRTU( RSMap::iterator& p ); long pollRTU( RSMap::iterator& p );
void setRespond(ModbusRTU::ModbusAddr addr, bool respond );
virtual void processingMessage( UniSetTypes::VoidMessage *msg ); virtual void processingMessage( UniSetTypes::VoidMessage *msg );
void sysCommand( UniSetTypes::SystemMessage *msg ); void sysCommand( UniSetTypes::SystemMessage *msg );
...@@ -153,11 +154,25 @@ class RTUExchange: ...@@ -153,11 +154,25 @@ class RTUExchange:
UniSetTypes::ObjectId test_id; UniSetTypes::ObjectId test_id;
UniSetTypes::uniset_mutex pollMutex; UniSetTypes::uniset_mutex pollMutex;
Trigger trTimeout;
PassiveTimer ptTimeout;
UniSetTypes::ObjectId sidNotRespond;
IOController::DIOStateList::iterator ditNotRespond;
struct RespondInfo
{
RespondInfo():
id(UniSetTypes::DefaultObjectId),
state(false),
invert(false)
{}
UniSetTypes::ObjectId id;
IOController::DIOStateList::iterator dit;
PassiveTimer ptTimeout;
Trigger trTimeout;
bool state;
bool invert;
};
typedef std::map<ModbusRTU::ModbusAddr,RespondInfo> RespondMap;
RespondMap respMap;
PassiveTimer aiTimer; PassiveTimer aiTimer;
int ai_polltime; int ai_polltime;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
uniset-start.sh -f ./uniset-rtuexchange --rs-name RTUExchange --confile test.xml \ uniset-start.sh -f ./uniset-rtuexchange --rs-name RTUExchange --confile test.xml \
--rs-filter-field rs --rs-filter-value 1 \ --rs-filter-field rs --rs-filter-value 1 \
--rs-dev /dev/cbsideB0 --rs-reg-from-id 1 \ --rs-dev /dev/cbsideA0 --rs-reg-from-id 1 \
--dlog-add-levels info,crit,warn --dlog-add-levels info,crit,warn
#level3
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