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

(ModbusMaster): немного поменял схему выставления датчика связи

parent 061dab12
...@@ -490,7 +490,7 @@ std::ostream& operator<<( std::ostream& os, MBExchange::RTUDevice& d ) ...@@ -490,7 +490,7 @@ std::ostream& operator<<( std::ostream& os, MBExchange::RTUDevice& d )
os << "addr=" << ModbusRTU::addr2str(d.mbaddr) os << "addr=" << ModbusRTU::addr2str(d.mbaddr)
<< " type=" << d.dtype << " type=" << d.dtype
<< " respond_id=" << d.resp_id << " respond_id=" << d.resp_id
<< " respond_timeout=" << d.resp_Delay.getOffDelay() << " respond_timeout=" << d.resp_Delay.getOnDelay()
<< " respond_state=" << d.resp_state << " respond_state=" << d.resp_state
<< " respond_invert=" << d.resp_invert << " respond_invert=" << d.resp_invert
<< endl; << endl;
...@@ -2669,7 +2669,7 @@ bool MBExchange::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXM ...@@ -2669,7 +2669,7 @@ bool MBExchange::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXM
dinfo << myname << "(initDeviceInfo): add addr=" << ModbusRTU::addr2str(a) << endl; dinfo << myname << "(initDeviceInfo): add addr=" << ModbusRTU::addr2str(a) << endl;
int tout = it.getPIntProp("timeout", default_timeout ); int tout = it.getPIntProp("timeout", default_timeout );
d->second->resp_Delay.set(0, tout); // ставим время на отпускание.. см. checkRespond() d->second->resp_Delay.set(tout,false);
d->second->resp_invert = it.getIntProp("invert"); d->second->resp_invert = it.getIntProp("invert");
return true; return true;
} }
...@@ -3051,10 +3051,19 @@ bool MBExchange::RTUDevice::checkRespond() ...@@ -3051,10 +3051,19 @@ bool MBExchange::RTUDevice::checkRespond()
{ {
bool prev = resp_state; bool prev = resp_state;
resp_state = resp_Delay.check( prev_numreply != numreply ); resp_state = !resp_Delay.check( prev_numreply == numreply );
prev_numreply.store(numreply); prev_numreply.store(numreply);
dlog4 << "(checkRespond): addr=" << ModbusRTU::addr2str(mbaddr)
<< " respond_id=" << resp_id
<< " state=" << resp_state
<< " current=" << resp_Delay.getCurrent()
<< " [ timeout=" << resp_Delay.getOnDelay()
<< " numreply=" << numreply
<< " prev_numreply=" << prev_numreply
<< " ]"
<< endl;
return (prev != resp_state); return (prev != resp_state);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -3064,20 +3073,23 @@ void MBExchange::updateRespondSensors() ...@@ -3064,20 +3073,23 @@ void MBExchange::updateRespondSensors()
{ {
RTUDevice* d(it1.second); RTUDevice* d(it1.second);
dlog4 << myname << ": check respond addr=" << ModbusRTU::addr2str(d->mbaddr) if( d->resp_id != DefaultObjectId && d->checkRespond() )
<< " respond_id=" << d->resp_id
<< " state=" << d->resp_state
<< " [timeout=" << d->resp_Delay.getOffDelay()
<< " numreply=" << d->numreply
<< " prev_numreply=" << d->prev_numreply
<< " ]"
<< endl;
if( d->checkRespond() && d->resp_id != DefaultObjectId )
{ {
try try
{ {
bool set = d->resp_invert ? !d->resp_state : d->resp_state; bool set = d->resp_invert ? !d->resp_state : d->resp_state;
dlog4 << myname << ": SAVE NEW respond state=" << set
<< " for addr=" << ModbusRTU::addr2str(d->mbaddr)
<< " respond_id=" << d->resp_id
<< " state=" << d->resp_state
<< " [ invert=" << d->resp_invert
<< " timeout=" << d->resp_Delay.getOnDelay()
<< " numreply=" << d->numreply
<< " prev_numreply=" << d->prev_numreply
<< " ]"
<< endl;
shm->localSetValue(d->resp_it, d->resp_id, ( set ? 1 : 0 ), getId()); shm->localSetValue(d->resp_it, d->resp_id, ( set ? 1 : 0 ), getId());
} }
catch( const Exception& ex ) catch( const Exception& ex )
......
...@@ -132,6 +132,11 @@ class DelayTimer ...@@ -132,6 +132,11 @@ class DelayTimer
return offDelay; return offDelay;
} }
inline timeout_t getCurrent()
{
return pt.getCurrent();
}
protected: protected:
PassiveTimer pt; PassiveTimer pt;
bool prevState; bool prevState;
......
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