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 ...@@ -79,7 +79,7 @@ namespace uniset
}; };
typedef unsigned long RegID; using RegID = size_t;
/*! Получение уникального ID (hash?) на основе номера функции и регистра /*! Получение уникального ID (hash?) на основе номера функции и регистра
* Требования к данной функции: * Требования к данной функции:
...@@ -87,7 +87,7 @@ namespace uniset ...@@ -87,7 +87,7 @@ namespace uniset
* 2. одинаковые регистры, но разные функции должны давать разный ID * 2. одинаковые регистры, но разные функции должны давать разный ID
* 3. регистры идущие подряд, должны давать ID идущие тоже подряд * 3. регистры идущие подряд, должны давать ID идущие тоже подряд
*/ */
RegID genRegID( const ModbusRTU::ModbusData r, const int fn ); RegID genRegID( const ModbusRTU::ModbusData r, const uint8_t fn );
// определение размера данных в зависимости от типа сообщения // определение размера данных в зависимости от типа сообщения
// возвращает -1 - если динамический размер сообщения или размер неизвестен // возвращает -1 - если динамический размер сообщения или размер неизвестен
...@@ -134,7 +134,7 @@ namespace uniset ...@@ -134,7 +134,7 @@ namespace uniset
*/ */
}; };
const unsigned char MBErrMask = 0x80; const uint8_t MBErrMask = 0x80;
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
uint16_t SWAPSHORT( uint16_t x ); uint16_t SWAPSHORT( uint16_t x );
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
...@@ -1217,7 +1217,7 @@ namespace uniset ...@@ -1217,7 +1217,7 @@ namespace uniset
std::string val; std::string val;
}; };
typedef std::list<RDIObjectInfo> RDIObjectList; using RDIObjectList = std::list<RDIObjectInfo>;
/*! Ответ для 0x2B/0x0E */ /*! Ответ для 0x2B/0x0E */
struct MEIMessageRetRDI: struct MEIMessageRetRDI:
......
...@@ -3651,16 +3651,17 @@ namespace uniset ...@@ -3651,16 +3651,17 @@ namespace uniset
return s.str(); 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 // mbreg: 0..65535
// fn: 0...255 // fn: 0...255
int max = numeric_limits<ModbusRTU::ModbusData>::max(); // по идее 65535 size_t reg_max = numeric_limits<ModbusRTU::ModbusData>::max(); // по идее 65535
int fn_max = numeric_limits<ModbusRTU::ModbusByte>::max(); // по идее 255
// для fn необходимо сдвинуть регистр max * fn; // задача функции сдвинуть диапазон за рабочий диапазон для регистров (65535)
return max + mbreg + max * fn; // а так же обеспечить, чтобы для каждого нового номера функции был свой диапазон
// не пересекающийся с другими
return reg_max + mbreg + (reg_max * fn) + 1;
} }
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
size_t ModbusRTU::numBytes( const size_t nbits ) size_t ModbusRTU::numBytes( const size_t nbits )
......
...@@ -125,23 +125,25 @@ TEST_CASE("numBytes function", "[modbus][numbytes]" ) ...@@ -125,23 +125,25 @@ TEST_CASE("numBytes function", "[modbus][numbytes]" )
REQUIRE( ModbusRTU::numBytes(257) == 33 ); REQUIRE( ModbusRTU::numBytes(257) == 33 );
} }
// --------------------------------------------------------------- // ---------------------------------------------------------------
#if 0
#warning VERY LONG TIME TEST
TEST_CASE("genRegID", "[modbus][genRegID]" ) TEST_CASE("genRegID", "[modbus][genRegID]" )
{ {
int max_reg = numeric_limits<ModbusRTU::ModbusData>::max(); size_t max_reg = numeric_limits<ModbusRTU::ModbusData>::max();
int max_fn = numeric_limits<ModbusRTU::ModbusByte>::max(); size_t max_fn = numeric_limits<ModbusRTU::ModbusByte>::max();
ModbusRTU::RegID prevID = ModbusRTU::genRegID(0, 0); 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); 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 ); 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