Commit 3d6414dc authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusExchange): добавил поддержку нового свойства "pollfactor",

позволяющего задать частоту опроса конкретного регистра.
parent 532f9e24
......@@ -13,7 +13,7 @@
Name: libuniset2
Version: 2.1
Release: alt14
Release: alt15
Summary: UniSet - library for building distributed industrial control systems
......@@ -456,6 +456,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# ..
%changelog
* Wed Aug 12 2015 Pavel Vainerman <pv@altlinux.ru> 2.1-alt15
- (Modbus): add new property "pollfactor" (see docs)
* Sun Aug 09 2015 Pavel Vainerman <pv@altlinux.ru> 2.1-alt14
- (UTCPStream): add new function "setKeepAliveParams"
......
......@@ -244,10 +244,10 @@
<item id="33" iotype="DI" name="Message1" priority="Medium" textname="Текст сообщения 1"/>
<item id="34" iotype="AI" name="MB1_Mode_AS" priority="Medium" textname="ModbusExchange Mode"/>
<item id="50" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="0" mbtype="rtu" name="Input50_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="51" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" ntit="1" mbtype="rtu" name="Input51_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="52" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="1" mbtype="rtu" name="Input52_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="53" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" nbit="2" mbtype="rtu" name="Input53_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="50" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="0" mbtype="rtu" name="Input50_S" pollfactor="4" priority="Medium" rs="5" textname="Команда 2"/>
<item id="51" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" ntit="1" mbtype="rtu" name="Input51_S" pollfactor="4" priority="Medium" rs="5" textname="Команда 2"/>
<item id="52" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="1" mbtype="rtu" name="Input52_S" pollfactor="2" priority="Medium" rs="5" textname="Команда 2"/>
<item id="53" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" nbit="2" mbtype="rtu" name="Input53_S" pollfactor="2" priority="Medium" rs="5" textname="Команда 2"/>
<item id="67" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbtype="rtu" name="Input67_S" priority="Medium" rs="5" textname="Bad reg test"/>
<item id="54" iotype="AI" name="AI54_S" textname="AI sensor 54" rrd="1" rrd1_ds="GAUGE:20:U:U"/>
<item id="55" iotype="AI" name="AI55_S" textname="AI sensor 55" rrd="1" rrd1_ds="GAUGE:20:U:U"/>
......
......@@ -941,6 +941,9 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return false;
}
if( p->pollfactor>1 && ncycle%p->pollfactor!=0 )
return false;
if( mblog->is_level3() )
{
mblog3 << myname << "(pollRTU): poll "
......@@ -951,6 +954,7 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<< " mb_initOK=" << p->mb_initOK
<< " sm_initOK=" << p->sm_initOK
<< " mbval=" << p->mbval
<< " pollfactor=" << p->pollfactor
<< endl;
if( p->q_count > maxQueryCount /* ModbusRTU::MAXDATALEN */ )
......@@ -2176,6 +2180,8 @@ bool MBExchange::initRegInfo( RegInfo* r, UniXML::iterator& it, MBExchange::RTU
{
r->dev = dev;
r->mbval = IOBase::initIntProp(it, "default", prop_prefix, false);
r->pollfactor = IOBase::initIntProp(it, "pollfactor", prop_prefix, false,0);
if( dev->dtype == MBExchange::dtRTU )
{
......@@ -3013,6 +3019,7 @@ bool MBExchange::poll()
if( !checkProcActive() )
return false;
ncycle++;
bool allNotRespond = true;
for( auto it1 = rmap.begin(); it1 != rmap.end(); ++it1 )
......
......@@ -151,6 +151,11 @@ class MBExchange:
// Флаг sm_init означает, что писать в устройство нельзя, т.к. значение в "карте регистров"
// ещё не инициализировано из SM
bool sm_initOK; /*!< инициализировалось ли значение из SM */
/*! приоритет опроса, 0,1 - высший,
* 1...n - задаёт "часоту" опроса. Т.е. каждые 1...n циклов
*/
int pollfactor = { 0 };
};
friend std::ostream& operator<<( std::ostream& os, RegInfo& r );
......@@ -379,6 +384,8 @@ class MBExchange:
VMonitor vmon;
unsigned long ncycle = { 0 }; /*!< текущий номер цикла опроса */
private:
MBExchange();
......
......@@ -148,6 +148,7 @@
- \b tcp_nbyte - [1|2] номер байта. Используется если tcp_vtype="byte".
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
- \b tcp_pollfactor - [0...n] Частота опроса. n задаёт "часоту" опроса. т.е. опрос каждые 1...n циклов
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
- \b tcp_preinit - [0|1] считать регистр перед использованием (при запуске процесса)
......
......@@ -170,6 +170,7 @@
- \b tcp_nbyte - [1|2] номер байта. Используется если tcp_vtype="byte".
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
- \b tcp_pollfactor - [0...n] Частота опроса. n задаёт "часоту" опроса. т.е. опрос каждые 1...n циклов (зависит от общего polltime)
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
- \b tcp_preinit - [0|1] считать регистр перед использованием (при запуске процесса)
......@@ -182,6 +183,8 @@
регистры в устройство писатся не будут. Чтобы отключить это поведение, можно указать параметр
- \b tcp_sm_initOK - [0|1] Игнорировать начальную инициализацию из SM (сразу писать в устройство)
При этом будет записывыться значение "default".
\warning Регистр должен быть уникальным. И может повторятся только если указан параметр \a nbit или \a nbyte.
......
......@@ -200,6 +200,7 @@ bool RTUExchange::poll()
if( !checkProcActive() )
return false;
ncycle++;
bool allNotRespond = true;
ComPort::Speed s = mbrtu->getSpeed();
......
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