Commit c58f3217 authored by Pavel Vainerman's avatar Pavel Vainerman

new version: add RespondList configuration

parent 46c0b770
......@@ -68,7 +68,13 @@
</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"/>
<UDPExchange2 name="UDPExchange2"/>
......@@ -92,9 +98,9 @@
<!-- ************************ ********************** -->
<sensors name="Sensors">
<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="Input3_S" textname=" 3" node="" iotype="DI" priority="Medium" mbtcp="1" mbaddr="0x31" mbfunc="0x04" mbreg="0x02"/>
<item name="Input4_S" textname=" 4" node="" iotype="DI" priority="Medium" udp="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="0x02" mbfunc="0x04" mbreg="0x02"/>
<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="Input6_S" textname=" 6" node="" iotype="DI" priority="Medium" udp="2">
<depends>
......@@ -112,6 +118,10 @@
</item>
<item name="Threshold1_S" textname="" 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>
<thresholds name="thresholds">
......
......@@ -32,7 +32,6 @@ activated(false)
if( cnode == NULL )
throw UniSetTypes::SystemError("(RTUExchange): Not find conf-node for " + myname );
shm = new SMInterface(shmId,&ui,objId,ic);
UniXML_iterator it(cnode);
......@@ -55,14 +54,6 @@ activated(false)
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());
dlog[Debug::INFO] << myname << "(init): mbregFromID=" << mbregFromID << endl;
......@@ -146,9 +137,36 @@ activated(false)
if( msec <=0 )
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()
......@@ -308,17 +326,31 @@ void RTUExchange::step()
<< "(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()
{
bool respond_ok = true;
for( RTUMap::iterator it=rtulist.begin(); it!=rtulist.end(); ++it )
{
if( !activated )
return;
bool respOK = true;
try
{
cout << "poll RTU=(" << (int)it->second->getAddress()
......@@ -334,8 +366,10 @@ void RTUExchange::poll()
catch( ModbusRTU::mbException& ex )
{
cout << " [ FAILED ] (" << ex << ")" << endl;
respond_ok = false;
respOK = false;
}
setRespond(it->second->getAddress(),respOK);
}
for( RSMap::iterator it=rsmap.begin(); it!=rsmap.end(); ++it )
......@@ -415,11 +449,15 @@ void RTUExchange::poll()
}
}
if( it->devtype != dtRTU188 )
setRespond(it->mbaddr,true);
continue;
}
catch(ModbusRTU::mbException& ex )
{
dlog[Debug::LEVEL3] << myname << "(poll): " << ex << endl;
if( it->devtype != dtRTU188 )
setRespond(it->mbaddr,false);
}
catch(IOController_i::NameNotFound &ex)
{
......@@ -446,21 +484,6 @@ void RTUExchange::poll()
{
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()
}
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[] )
......@@ -1231,3 +1259,26 @@ std::ostream& operator<<( std::ostream& os, RTUExchange::RSProperty& p )
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:
long pollRTU188( RSMap::iterator& p );
long pollMTR( RSMap::iterator& p );
long pollRTU( RSMap::iterator& p );
void setRespond(ModbusRTU::ModbusAddr addr, bool respond );
virtual void processingMessage( UniSetTypes::VoidMessage *msg );
void sysCommand( UniSetTypes::SystemMessage *msg );
......@@ -153,11 +154,25 @@ class RTUExchange:
UniSetTypes::ObjectId test_id;
UniSetTypes::uniset_mutex pollMutex;
Trigger trTimeout;
struct RespondInfo
{
RespondInfo():
id(UniSetTypes::DefaultObjectId),
state(false),
invert(false)
{}
UniSetTypes::ObjectId id;
IOController::DIOStateList::iterator dit;
PassiveTimer ptTimeout;
UniSetTypes::ObjectId sidNotRespond;
IOController::DIOStateList::iterator ditNotRespond;
Trigger trTimeout;
bool state;
bool invert;
};
typedef std::map<ModbusRTU::ModbusAddr,RespondInfo> RespondMap;
RespondMap respMap;
PassiveTimer aiTimer;
int ai_polltime;
......
......@@ -2,6 +2,7 @@
uniset-start.sh -f ./uniset-rtuexchange --rs-name RTUExchange --confile test.xml \
--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
#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