Commit ff594bc2 authored by Pavel Vainerman's avatar Pavel Vainerman

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

parent e70f60af
......@@ -14,8 +14,7 @@
Name: libuniset2
Version: 2.2
Release: alt29.2
Release: alt30
Summary: UniSet - library for building distributed industrial control systems
License: LGPL
......@@ -487,6 +486,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# ..
%changelog
* Tue Mar 22 2016 Pavel Vainerman <pv@altlinux.ru> 2.2-alt30
- minor fixes in DealyTimer and MBExchange (not respond logic)
* Sun Mar 20 2016 Pavel Vainerman <pv@etersoft.ru> 2.2-alt29.2
- rebuild
......
......@@ -554,7 +554,7 @@ std::ostream& operator<<( std::ostream& os, MBExchange::RTUDevice& d )
os << "addr=" << ModbusRTU::addr2str(d.mbaddr)
<< " type=" << d.dtype
<< " respond_id=" << d.resp_id
<< " respond_timeout=" << d.resp_Delay.getOnDelay()
<< " respond_timeout=" << d.resp_Delay.getOffDelay()
<< " respond_state=" << d.resp_state
<< " respond_invert=" << d.resp_invert
<< endl;
......@@ -2768,7 +2768,7 @@ bool MBExchange::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXM
mbinfo << myname << "(initDeviceInfo): add addr=" << ModbusRTU::addr2str(a) << endl;
int tout = it.getPIntProp("timeout", default_timeout );
d->second->resp_Delay.set(tout, false);
d->second->resp_Delay.set(0, tout);
d->second->resp_invert = it.getIntProp("invert");
d->second->resp_force = it.getIntProp("force");
......@@ -3174,13 +3174,14 @@ bool MBExchange::poll()
bool MBExchange::RTUDevice::checkRespond( std::shared_ptr<DebugStream>& mblog )
{
bool prev = resp_state;
resp_state = !resp_Delay.check( prev_numreply == numreply ) && numreply != 0;
resp_state = resp_Delay.check( prev_numreply != numreply ) && numreply != 0;
mblog4 << "(checkRespond): addr=" << ModbusRTU::addr2str(mbaddr)
<< " respond_id=" << resp_id
<< " state=" << resp_state
<< " current=" << resp_Delay.getCurrent()
<< " [ timeout=" << resp_Delay.getOnDelay()
<< " delay_check=" << resp_Delay.get()
<< " [ timeout=" << resp_Delay.getOffDelay()
<< " numreply=" << numreply
<< " prev_numreply=" << prev_numreply
<< " resp_ptInit=" << resp_ptInit.checkTime()
......@@ -3309,7 +3310,7 @@ std::string MBExchange::RTUDevice::getShortInfo() const
<< " (resp_id=" << resp_id << " resp_force=" << resp_force
<< " resp_invert=" << resp_invert
<< " numreply=" << numreply
<< " timeout=" << resp_Delay.getOnDelay()
<< " timeout=" << resp_Delay.getOffDelay()
<< " type=" << dtype
<< " ask_every_reg=" << ask_every_reg
<< ")" << endl;
......
......@@ -95,23 +95,33 @@ class DelayTimer
if( state != st )
{
waiting_on = false;
waiting_off = false;
if( st )
{
if( onDelay <=0 )
{
pt.setTiming(0);
state = st;
return st;
}
pt.setTiming(onDelay);
waiting_on = true;
}
else
{
if( offDelay <=0 )
{
pt.setTiming(0);
state = st;
return st;
}
pt.setTiming(offDelay);
waiting_off = true;
}
// на случае если таймеры = 0..
if( pt.checkTime() )
{
state = st;
return st;
}
}
return state;
......
......@@ -155,6 +155,15 @@ TEST_CASE("[DelayTimer]: zero time", "[DelayTimer]" )
msleep(40);
CHECK_FALSE( dt.check(false) );
CHECK( dt.check(true) );
msleep(40);
CHECK( dt.check(true) );
msleep(40);
CHECK( dt.check(true) );
CHECK( dt.check(false) );
msleep(80);
CHECK( dt.check(false) );
msleep(40);
CHECK_FALSE( dt.check(false) );
}
SECTION( "offdelay=0" )
......@@ -170,6 +179,13 @@ TEST_CASE("[DelayTimer]: zero time", "[DelayTimer]" )
msleep(40);
CHECK( dt.check(true) );
CHECK_FALSE( dt.check(false) );
msleep(40);
CHECK_FALSE( dt.check(false) );
CHECK_FALSE( dt.check(true) );
msleep(80);
CHECK_FALSE( dt.check(true) );
msleep(40);
CHECK( dt.check(true) );
}
}
// -----------------------------------------------------------------------------
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