Commit 67899026 authored by Pavel Vainerman's avatar Pavel Vainerman

backported to p8 as 2.7-alt15.M80P.16 (with rpmbph script)

parents 95a8e54d c1f75ad9
......@@ -170,8 +170,8 @@ uniset::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::getSMTestID() const
<xsl:for-each select="//sensors/item/consumers/consumer">
<xsl:if test="normalize-space(@name)=$OID">
if( <xsl:value-of select="../../@name"/> != DefaultObjectId )
return <xsl:value-of select="../../@name"/>;
if( <xsl:value-of select="../../@name"/> != DefaultObjectId )
return <xsl:value-of select="../../@name"/>;
</xsl:if>
</xsl:for-each>
......@@ -282,12 +282,12 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool _force )
<xsl:choose>
<xsl:when test="normalize-space(@vartype)='out'">
<xsl:if test="normalize-space(../../@force)=''">
if( _force || prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> != <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> )
if( _force || prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> != <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> )
</xsl:if>
{
<xsl:call-template name="setdata"/>
prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>;
}
{
<xsl:call-template name="setdata"/>
prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>;
}
</xsl:when>
</xsl:choose>
</xsl:if>
......@@ -350,17 +350,17 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool _force )
</xsl:template>
<xsl:template name="gensetdata">
try
{
si.id = <xsl:value-of select="../../@name"/>;
si.node = node_<xsl:value-of select="../../@name"/>;
ui->setValue( si,<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>, getId() );
}
catch( const uniset::Exception&amp; ex )
{
mycrit &lt;&lt; myname &lt;&lt; "(setdata): " &lt;&lt; ex &lt;&lt; endl;
throw;
}
try
{
si.id = <xsl:value-of select="../../@name"/>;
si.node = node_<xsl:value-of select="../../@name"/>;
ui->setValue( si,<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>, getId() );
}
catch( const uniset::Exception&amp; ex )
{
mycrit &lt;&lt; myname &lt;&lt; "(setdata): " &lt;&lt; ex &lt;&lt; endl;
throw;
}
</xsl:template>
<xsl:template name="setdata_val">
......@@ -382,18 +382,18 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool _force )
<xsl:param name="onlymsg"></xsl:param>
<xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID">
<xsl:if test="normalize-space($onlymsg)=''">
if( prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> != <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> )
</xsl:if>
{
// приходится искуственно использовать третий параметр,
// что-бы компилятор выбрал
// правильный(для аналоговых) конструктор у SensorMessage
IOController_i::CalibrateInfo _ci;
SensorMessage _sm( <xsl:value-of select="../../@name"/>, (long)<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>, _ci);
_sm.sensor_type = UniversalIO::AI;
sensorInfo(&amp;_sm);
}
<xsl:if test="normalize-space($onlymsg)=''">
if( prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> != <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> )
</xsl:if>
{
// приходится искуственно использовать третий параметр,
// что-бы компилятор выбрал
// правильный(для аналоговых) конструктор у SensorMessage
IOController_i::CalibrateInfo _ci;
SensorMessage _sm( <xsl:value-of select="../../@name"/>, (long)<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>, _ci);
_sm.sensor_type = UniversalIO::AI;
sensorInfo(&amp;_sm);
}
</xsl:if>
</xsl:if>
</xsl:template>
......
......@@ -323,21 +323,21 @@ uniset::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::getSMTestID() const
<xsl:param name="onlymsg"></xsl:param>
<xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID">
<xsl:if test="normalize-space($onlymsg)=''">
if( prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> != <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> )
</xsl:if>
{
<xsl:if test="normalize-space($onlymsg)=''">
// cout &lt;&lt; myname &lt;&lt; ": (AO) change value <xsl:value-of select="../../@name"/> set "
// &lt;&lt; <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> &lt;&lt; endl;
</xsl:if>
// приходится искуственно использовать третий параметр,
// что-бы компилятор выбрал
// правильный(для аналоговых) конструктор у SensorMessage
SensorMessage _sm( <xsl:value-of select="../../@name"/>, (long)<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>);
_sm.sensor_type = UniversalIO::AI;
sensorInfo(&amp;_sm);
}
<xsl:if test="normalize-space($onlymsg)=''">
if( prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> != <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> )
</xsl:if>
{
<xsl:if test="normalize-space($onlymsg)=''">
// cout &lt;&lt; myname &lt;&lt; ": (AO) change value <xsl:value-of select="../../@name"/> set "
// &lt;&lt; <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> &lt;&lt; endl;
</xsl:if>
// приходится искуственно использовать третий параметр,
// что-бы компилятор выбрал
// правильный(для аналоговых) конструктор у SensorMessage
SensorMessage _sm( <xsl:value-of select="../../@name"/>, (long)<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>);
_sm.sensor_type = UniversalIO::AI;
sensorInfo(&amp;_sm);
}
</xsl:if>
</xsl:if>
</xsl:template>
......
......@@ -121,15 +121,15 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::setValue( uniset::ObjectId _sid, lo
return;
<xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@vartype)='out'">
if( _sid == <xsl:value-of select="@name"/> )
{
mylog8 &lt;&lt; myname &lt;&lt; "(setValue): <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = " &lt;&lt; _val &lt;&lt; endl;
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = _val;
<xsl:call-template name="setdata"/>
return;
}
</xsl:if>
<xsl:if test="normalize-space(@vartype)='out'">
if( _sid == <xsl:value-of select="@name"/> )
{
mylog8 &lt;&lt; myname &lt;&lt; "(setValue): <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = " &lt;&lt; _val &lt;&lt; endl;
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = _val;
<xsl:call-template name="setdata"/>
return;
}
</xsl:if>
</xsl:for-each>
ui->setValue(_sid,_val);
......@@ -289,20 +289,20 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOComm
</xsl:template>
<xsl:template name="setdata">
if( <xsl:value-of select="@name"/> != DefaultObjectId )
if( <xsl:value-of select="@name"/> != DefaultObjectId )
{
try
{
try
{
si.id = <xsl:value-of select="@name"/>;
si.node = node_<xsl:value-of select="@name"/>;
ui->setValue( si, <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>, getId() );
}
catch( uniset::Exception&amp; ex )
{
mycrit &lt;&lt; myname &lt;&lt; "(setdata): " &lt;&lt; ex &lt;&lt; endl;
throw;
}
si.id = <xsl:value-of select="@name"/>;
si.node = node_<xsl:value-of select="@name"/>;
ui->setValue( si, <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>, getId() );
}
catch( uniset::Exception&amp; ex )
{
mycrit &lt;&lt; myname &lt;&lt; "(setdata): " &lt;&lt; ex &lt;&lt; endl;
throw;
}
}
</xsl:template>
<xsl:template name="setdata_value">
......
......@@ -124,14 +124,14 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::setValue( uniset::ObjectId sid, lon
return;
<xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@vartype)='out'">
if( sid == <xsl:value-of select="@name"/> )
{
mylog8 &lt;&lt; "(setValue): <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = " &lt;&lt; val &lt;&lt; endl;
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = val;
return;
}
</xsl:if>
<xsl:if test="normalize-space(@vartype)='out'">
if( sid == <xsl:value-of select="@name"/> )
{
mylog8 &lt;&lt; "(setValue): <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = " &lt;&lt; val &lt;&lt; endl;
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = val;
return;
}
</xsl:if>
</xsl:for-each>
ui->setValue(sid,val);
......
......@@ -1372,9 +1372,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updatePreviousValues() noexcept
void <xsl:value-of select="$CLASSNAME"/>_SK::checkSensors()
{
<xsl:for-each select="//smap/item">
<xsl:choose>
<xsl:when test="normalize-space(@vartype)='in'"><xsl:call-template name="check_changes"/></xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="normalize-space(@vartype)='in'"><xsl:call-template name="check_changes"/></xsl:when>
</xsl:choose>
</xsl:for-each>
}
// -----------------------------------------------------------------------------
......@@ -1821,9 +1821,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::checkSensors()
{
// Опрашиваем все входы...
<xsl:for-each select="//sensors/item/consumers/consumer">
<xsl:choose>
<xsl:when test="normalize-space(@vartype)='in'"><xsl:call-template name="check_changes"/></xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="normalize-space(@vartype)='in'"><xsl:call-template name="check_changes"/></xsl:when>
</xsl:choose>
</xsl:for-each>
}
// -----------------------------------------------------------------------------
......@@ -2002,16 +2002,16 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::strval( uniset::ObjectId id,
<xsl:template name="check_changes">
<xsl:param name="onlymsg"></xsl:param>
<xsl:if test="normalize-space($onlymsg)=''">
if( prev_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> != <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> )
</xsl:if>
{
<xsl:if test="normalize-space($onlymsg)=''">
</xsl:if>
SensorMessage _sm( <xsl:value-of select="@name"/>, (long)<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> );
_sm.sensor_type = UniversalIO::AI;
sensorInfo(&amp;_sm);
}
<xsl:if test="normalize-space($onlymsg)=''">
if( prev_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> != <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> )
</xsl:if>
{
<xsl:if test="normalize-space($onlymsg)=''">
</xsl:if>
SensorMessage _sm( <xsl:value-of select="@name"/>, (long)<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> );
_sm.sensor_type = UniversalIO::AI;
sensorInfo(&amp;_sm);
}
</xsl:template>
</xsl:stylesheet>
......@@ -26,7 +26,7 @@
Name: libuniset2
Version: 2.7
Release: alt14.M80P.15
Release: alt15.M80P.16
Summary: UniSet - library for building distributed industrial control systems
License: LGPL
......@@ -546,9 +546,15 @@ rm -f %buildroot%_docdir/%oname/html/*.md5
# history of current unpublished changes
%changelog
* Tue Sep 04 2018 Pavel Vainerman <pv@altlinux.ru> 2.7-alt14.M80P.15
* Thu Oct 11 2018 Pavel Vainerman <pv@altlinux.ru> 2.7-alt15.M80P.16
- backport to ALTLinux p8 (by rpmbph script)
* Thu Oct 11 2018 Pavel Vainerman <pv@altlinux.ru> 2.7-alt16
- (codegen): reformat
- (Modbus): modify genRegID(), update test, used 'using' instead 'typedef'
- (UNet): set default prefix for log setup (default: "--unet-log")
- (UNet): increased the maximum allowed number of analog values for node (2000)
* Tue Sep 04 2018 Pavel Vainerman <pv@altlinux.ru> 2.7-alt15
- (mtr): fix bug for read from 'serial device'
- (UNet): added "undefined_value" property
......
......@@ -87,8 +87,8 @@ namespace uniset
// с другой стороны в текущей реализации
// в сеть посылается фактическое количество данных, а не sizeof(UDPPacket).
// При текущих настройках sizeof(UDPPacket) = 32654 (!)
static const size_t MaxACount = 1500;
// При текущих настройках sizeof(UDPPacket) = 72679 (!)
static const size_t MaxACount = 2000;
static const size_t MaxDCount = 5000;
static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(unsigned char);
......
......@@ -164,7 +164,7 @@ UNetExchange::UNetExchange(uniset::ObjectId objId, uniset::ObjectId shmId, const
}
unetinfo << myname << "(init): init sender.. my node " << n_it.getProp("name") << endl;
sender = make_shared<UNetSender>(h, p, shm, false, s_field, s_fvalue, prefix);
sender = make_shared<UNetSender>(h, p, shm, false, s_field, s_fvalue, "unet", prefix);
sender->setSendPause(sendpause);
sender->setCheckConnectionPause(checkConnectionPause);
loga->add(sender->getLog());
......@@ -326,7 +326,7 @@ UNetExchange::UNetExchange(uniset::ObjectId objId, uniset::ObjectId shmId, const
unetinfo << myname << "(init): (node='" << n << "') add basic receiver "
<< h << ":" << p << endl;
auto r = make_shared<UNetReceiver>(h, p, shm);
auto r = make_shared<UNetReceiver>(h, p, shm, false, prefix);
loga->add(r->getLog());
......@@ -358,7 +358,7 @@ UNetExchange::UNetExchange(uniset::ObjectId objId, uniset::ObjectId shmId, const
unetinfo << myname << "(init): (node='" << n << "') add reserv receiver "
<< h2 << ":" << p2 << endl;
r2 = make_shared<UNetReceiver>(h2, p2, shm);
r2 = make_shared<UNetReceiver>(h2, p2, shm, false, prefix);
loga->add(r2->getLog());
......
......@@ -40,7 +40,10 @@ bool UNetReceiver::PacketCompare::operator()(const UniSetUDP::UDPMessage& lhs,
}
*/
// ------------------------------------------------------------------------------------------
UNetReceiver::UNetReceiver(const std::string& s_host, int _port, const std::shared_ptr<SMInterface>& smi, bool nocheckConnection ):
UNetReceiver::UNetReceiver(const std::string& s_host, int _port
, const std::shared_ptr<SMInterface>& smi
, bool nocheckConnection
, const std::string& prefix ):
shm(smi),
recvpause(10),
updatepause(100),
......@@ -71,11 +74,14 @@ UNetReceiver::UNetReceiver(const std::string& s_host, int _port, const std::shar
addr = s_host.c_str();
ostringstream logname;
logname << prefix << "-R-" << s_host << ":" << setw(4) << port;
unetlog = make_shared<DebugStream>();
unetlog->setLogName(myname);
unetlog->setLogName(logname.str());
auto conf = uniset_conf();
conf->initLogStream(unetlog, myname);
conf->initLogStream(unetlog, prefix + "-log");
upThread = unisetstd::make_unique< ThreadCreator<UNetReceiver> >(this, &UNetReceiver::updateThread);
......
......@@ -101,7 +101,9 @@ namespace uniset
public std::enable_shared_from_this<UNetReceiver>
{
public:
UNetReceiver( const std::string& host, int port, const std::shared_ptr<SMInterface>& smi, bool nocheckConnection = false );
UNetReceiver( const std::string& host, int port, const std::shared_ptr<SMInterface>& smi
, bool nocheckConnection = false
, const std::string& prefix = "unet" );
virtual ~UNetReceiver();
void start();
......
......@@ -31,10 +31,12 @@ namespace uniset
// -----------------------------------------------------------------------------
UNetSender::UNetSender(const std::string& _host, const int _port, const std::shared_ptr<SMInterface>& smi,
bool nocheckConnection, const std::string& s_f, const std::string& s_val,
const std::string& s_prefix, size_t maxDCount, size_t maxACount ):
const std::string& s_prefix,
const std::string& prefix,
size_t maxDCount, size_t maxACount ):
s_field(s_f),
s_fvalue(s_val),
prefix(s_prefix),
prop_prefix(s_prefix),
shm(smi),
port(_port),
s_host(_host),
......@@ -55,11 +57,14 @@ namespace uniset
myname = s.str();
}
ostringstream logname;
logname << prefix << "-S-" << s_host << "-" << port;
unetlog = make_shared<DebugStream>();
unetlog->setLogName(myname);
unetlog->setLogName(logname.str());
auto conf = uniset_conf();
conf->initLogStream(unetlog, myname);
conf->initLogStream(unetlog, prefix + "-log");
unetinfo << myname << "(init): read filter-field='" << s_field
<< "' filter-value='" << s_fvalue << "'" << endl;
......@@ -407,7 +412,7 @@ namespace uniset
return false;
}
int priority = it.getPIntProp(prefix + "_sendfactor", 0);
int priority = it.getPIntProp(prop_prefix + "_sendfactor", 0);
auto& pk = mypacks[priority];
......
......@@ -69,9 +69,14 @@ namespace uniset
class UNetSender
{
public:
UNetSender( const std::string& host, const int port, const std::shared_ptr<SMInterface>& smi, bool nocheckConnection = false,
const std::string& s_field = "", const std::string& s_fvalue = "", const std::string& prefix = "unet",
size_t maxDCount = UniSetUDP::MaxDCount, size_t maxACount = UniSetUDP::MaxACount );
UNetSender( const std::string& host, const int port, const std::shared_ptr<SMInterface>& smi
, bool nocheckConnection = false
, const std::string& s_field = ""
, const std::string& s_fvalue = ""
, const std::string& prop_prefix = "unet"
, const std::string& prefix = "unet"
, size_t maxDCount = UniSetUDP::MaxDCount
, size_t maxACount = UniSetUDP::MaxACount );
virtual ~UNetSender();
......@@ -175,7 +180,7 @@ namespace uniset
std::string s_field = { "" };
std::string s_fvalue = { "" };
std::string prefix = { "" };
std::string prop_prefix = { "" };
const std::shared_ptr<SMInterface> shm;
std::shared_ptr<DebugStream> unetlog;
......
......@@ -3,6 +3,6 @@
uniset2-start.sh -f ./uniset2-unetexchange --unet-name UNetExchange --unet-run-logserver \
--confile test.xml --smemory-id SharedMemory \
--unet-filter-field rs --unet-filter-value 2 --unet-maxdifferense 40 --unet-sendpause 1000 \
--dlog-add-levels info,crit,warn --unet-log-add-levels info,crit,warn,any $*
--dlog-add-levels info,crit,warn --unet-log-add-levels info,crit,warn,any --unet-S-localhost-3000-add-levels any $*
#--unet-nodes-confnode specnet
......@@ -79,7 +79,7 @@ namespace uniset
};
typedef unsigned long RegID;
using RegID = size_t;
/*! Получение уникального ID (hash?) на основе номера функции и регистра
* Требования к данной функции:
......@@ -87,7 +87,7 @@ namespace uniset
* 2. одинаковые регистры, но разные функции должны давать разный ID
* 3. регистры идущие подряд, должны давать ID идущие тоже подряд
*/
RegID genRegID( const ModbusRTU::ModbusData r, const int fn );
RegID genRegID( const ModbusRTU::ModbusData r, const uint8_t fn );
// определение размера данных в зависимости от типа сообщения
// возвращает -1 - если динамический размер сообщения или размер неизвестен
......@@ -134,7 +134,7 @@ namespace uniset
*/
};
const unsigned char MBErrMask = 0x80;
const uint8_t MBErrMask = 0x80;
// ---------------------------------------------------------------------
uint16_t SWAPSHORT( uint16_t x );
// ---------------------------------------------------------------------
......@@ -1217,7 +1217,7 @@ namespace uniset
std::string val;
};
typedef std::list<RDIObjectInfo> RDIObjectList;
using RDIObjectList = std::list<RDIObjectInfo>;
/*! Ответ для 0x2B/0x0E */
struct MEIMessageRetRDI:
......
......@@ -3651,16 +3651,17 @@ namespace uniset
return s.str();
}
// ----------------------------------------------------------------------
ModbusRTU::RegID ModbusRTU::genRegID( const ModbusRTU::ModbusData mbreg, const int fn )
ModbusRTU::RegID ModbusRTU::genRegID( const ModbusRTU::ModbusData mbreg, const uint8_t fn )
{
// диапазоны:
// mbreg: 0..65535
// fn: 0...255
int max = numeric_limits<ModbusRTU::ModbusData>::max(); // по идее 65535
int fn_max = numeric_limits<ModbusRTU::ModbusByte>::max(); // по идее 255
size_t reg_max = numeric_limits<ModbusRTU::ModbusData>::max(); // по идее 65535
// fn необходимо привести к диапазону 0..max
return max + mbreg + max + uniset::lcalibrate(fn, 0, fn_max, 0, max, false);
// задача функции сдвинуть диапазон за рабочий диапазон для регистров (65535)
// а так же обеспечить, чтобы для каждого нового номера функции был свой диапазон
// не пересекающийся с другими
return reg_max + mbreg + (reg_max * fn) + 1;
}
// ----------------------------------------------------------------------
size_t ModbusRTU::numBytes( const size_t nbits )
......
......@@ -125,23 +125,25 @@ TEST_CASE("numBytes function", "[modbus][numbytes]" )
REQUIRE( ModbusRTU::numBytes(257) == 33 );
}
// ---------------------------------------------------------------
#if 0
#warning VERY LONG TIME TEST
TEST_CASE("genRegID", "[modbus][genRegID]" )
{
int max_reg = numeric_limits<ModbusRTU::ModbusData>::max();
int max_fn = numeric_limits<ModbusRTU::ModbusByte>::max();
size_t max_reg = numeric_limits<ModbusRTU::ModbusData>::max();
size_t max_fn = numeric_limits<ModbusRTU::ModbusByte>::max();
ModbusRTU::RegID prevID = ModbusRTU::genRegID(0, 0);
for( int f = 1; f < max_fn; f++ )
for( size_t f = 1; f < max_fn; f++ )
{
ModbusRTU::RegID minID = ModbusRTU::genRegID(0, f);
REQUIRE( minID > prevID );
for( int r = 1; r < max_reg; r++ )
// для каждого нового номера функции должен быть свой диапазон
// не пересекающийся с другими
REQUIRE( minID > (prevID + max_reg - 1) );
prevID = minID;
for( size_t r = 1; r < max_reg; r++ )
REQUIRE( ModbusRTU::genRegID(r, f) == minID + r );
}
}
#endif
// ---------------------------------------------------------------
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