Commit 112329df authored by Pavel Vainerman's avatar Pavel Vainerman

(Modbus): modify genRegID(), update test, used 'using' instead 'typedef'

parent c4cb490d
......@@ -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 необходимо сдвинуть регистр max * fn;
return max + mbreg + max * fn;
// задача функции сдвинуть диапазон за рабочий диапазон для регистров (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