Commit b9c92a58 authored by Pavel Vainerman's avatar Pavel Vainerman

(Modbus): рефакторинг кода и тестов, корректировка под 64bit

parent de872cfc
...@@ -505,6 +505,7 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -505,6 +505,7 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%exclude %_pkgconfigdir/libUniSet2.pc %exclude %_pkgconfigdir/libUniSet2.pc
# history of current unpublished changes # history of current unpublished changes
# Modbus: refactoring code and test (for 64bit)
%changelog %changelog
* Mon Dec 12 2016 Pavel Vainerman <pv@altlinux.ru> 2.6-alt6 * Mon Dec 12 2016 Pavel Vainerman <pv@altlinux.ru> 2.6-alt6
......
...@@ -30,6 +30,22 @@ namespace uniset ...@@ -30,6 +30,22 @@ namespace uniset
using namespace std; using namespace std;
using namespace uniset::extensions; using namespace uniset::extensions;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// вспомогательная структура для предотвращения утечки памяти
struct DataGuard
{
DataGuard( size_t sz )
{
data = new ModbusRTU::ModbusData[sz];
}
~DataGuard()
{
delete[] data;
}
ModbusRTU::ModbusData* data;
};
// -----------------------------------------------------------------------------
MBExchange::MBExchange(uniset::ObjectId objId, uniset::ObjectId shmId, MBExchange::MBExchange(uniset::ObjectId objId, uniset::ObjectId shmId,
const std::shared_ptr<SharedMemory>& _ic, const std::string& prefix ): const std::shared_ptr<SharedMemory>& _ic, const std::string& prefix ):
UniSetObject(objId), UniSetObject(objId),
...@@ -715,7 +731,7 @@ namespace uniset ...@@ -715,7 +731,7 @@ namespace uniset
return true; return true;
auto dev = p->dev; auto dev = p->dev;
unsigned int q_count = p->p.rnum; size_t q_count = p->p.rnum;
if( mblog->is_level3() ) if( mblog->is_level3() )
{ {
...@@ -754,38 +770,36 @@ namespace uniset ...@@ -754,38 +770,36 @@ namespace uniset
case ModbusRTU::fnReadInputStatus: case ModbusRTU::fnReadInputStatus:
{ {
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr, p->mbreg, q_count); ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr, p->mbreg, q_count);
ModbusRTU::ModbusData* dat = new ModbusRTU::ModbusData[q_count]; DataGuard d(q_count);
unsigned int m = 0; size_t m = 0;
for( unsigned int i = 0; i < ret.bcnt; i++ ) for( size_t i = 0; i < ret.bcnt; i++ )
{ {
ModbusRTU::DataBits b(ret.data[i]); ModbusRTU::DataBits b(ret.data[i]);
for( unsigned int k = 0; k < ModbusRTU::BitsPerByte && m < q_count; k++, m++ ) for( size_t k = 0; k < ModbusRTU::BitsPerByte && m < q_count; k++, m++ )
dat[m] = b[k]; d.data[m] = b[k];
} }
p->initOK = initSMValue(dat, q_count, &(p->p)); p->initOK = initSMValue(d.data, q_count, &(p->p));
delete[] dat;
} }
break; break;
case ModbusRTU::fnReadCoilStatus: case ModbusRTU::fnReadCoilStatus:
{ {
ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr, p->mbreg, q_count); ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr, p->mbreg, q_count);
ModbusRTU::ModbusData* dat = new ModbusRTU::ModbusData[q_count]; DataGuard d(q_count);
unsigned int m = 0; size_t m = 0;
for( unsigned int i = 0; i < ret.bcnt; i++ ) for( size_t i = 0; i < ret.bcnt; i++ )
{ {
ModbusRTU::DataBits b(ret.data[i]); ModbusRTU::DataBits b(ret.data[i]);
for( unsigned int k = 0; k < ModbusRTU::BitsPerByte && m < q_count; k++, m++ ) for( size_t k = 0; k < ModbusRTU::BitsPerByte && m < q_count; k++, m++ )
dat[m] = b[k]; d.data[m] = b[k];
} }
p->initOK = initSMValue(dat, q_count, &(p->p)); p->initOK = initSMValue(d.data, q_count, &(p->p));
delete[] dat;
} }
break; break;
...@@ -833,7 +847,7 @@ namespace uniset ...@@ -833,7 +847,7 @@ namespace uniset
IOBase::processingAsDI( p, data[0], shm, true ); IOBase::processingAsDI( p, data[0], shm, true );
} }
else else
IOBase::processingAsAI( p, (signed short)(data[0]), shm, true ); IOBase::processingAsAI( p, (int16_t)(data[0]), shm, true );
return true; return true;
} }
...@@ -851,7 +865,7 @@ namespace uniset ...@@ -851,7 +865,7 @@ namespace uniset
IOBase::processingAsDI( p, data[0], shm, true ); IOBase::processingAsDI( p, data[0], shm, true );
} }
else else
IOBase::processingAsAI( p, (signed short)(data[0]), shm, true ); IOBase::processingAsAI( p, (int16_t)(data[0]), shm, true );
return true; return true;
} }
...@@ -863,7 +877,7 @@ namespace uniset ...@@ -863,7 +877,7 @@ namespace uniset
IOBase::processingAsDI( p, data[0], shm, true ); IOBase::processingAsDI( p, data[0], shm, true );
} }
else else
IOBase::processingAsAI( p, (unsigned short)data[0], shm, true ); IOBase::processingAsAI( p, (uint16_t)data[0], shm, true );
return true; return true;
} }
...@@ -898,22 +912,22 @@ namespace uniset ...@@ -898,22 +912,22 @@ namespace uniset
else if( p->vType == VTypes::vtI2 ) else if( p->vType == VTypes::vtI2 )
{ {
VTypes::I2 i2(data, VTypes::I2::wsize()); VTypes::I2 i2(data, VTypes::I2::wsize());
IOBase::processingAsAI( p, (int)i2, shm, true ); IOBase::processingAsAI( p, (int32_t)i2, shm, true );
} }
else if( p->vType == VTypes::vtI2r ) else if( p->vType == VTypes::vtI2r )
{ {
VTypes::I2r i2(data, VTypes::I2::wsize()); VTypes::I2r i2(data, VTypes::I2::wsize());
IOBase::processingAsAI( p, (int)i2, shm, true ); IOBase::processingAsAI( p, (int32_t)i2, shm, true );
} }
else if( p->vType == VTypes::vtU2 ) else if( p->vType == VTypes::vtU2 )
{ {
VTypes::U2 u2(data, VTypes::U2::wsize()); VTypes::U2 u2(data, VTypes::U2::wsize());
IOBase::processingAsAI( p, (unsigned int)u2, shm, true ); IOBase::processingAsAI( p, (uint32_t)u2, shm, true );
} }
else if( p->vType == VTypes::vtU2r ) else if( p->vType == VTypes::vtU2r )
{ {
VTypes::U2r u2(data, VTypes::U2::wsize()); VTypes::U2r u2(data, VTypes::U2::wsize());
IOBase::processingAsAI( p, (unsigned int)u2, shm, true ); IOBase::processingAsAI( p, (uint32_t)u2, shm, true );
} }
return true; return true;
...@@ -996,7 +1010,7 @@ namespace uniset ...@@ -996,7 +1010,7 @@ namespace uniset
{ {
ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr, p->mbreg, p->q_count); ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr, p->mbreg, p->q_count);
for( unsigned int i = 0; i < p->q_count; i++, it++ ) for( size_t i = 0; i < p->q_count; i++, it++ )
{ {
it->second->mbval = ret.data[i]; it->second->mbval = ret.data[i];
it->second->mb_initOK = true; it->second->mb_initOK = true;
...@@ -1010,7 +1024,7 @@ namespace uniset ...@@ -1010,7 +1024,7 @@ namespace uniset
{ {
ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr, p->mbreg, p->q_count); ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr, p->mbreg, p->q_count);
for( unsigned int i = 0; i < p->q_count; i++, it++ ) for( size_t i = 0; i < p->q_count; i++, it++ )
{ {
it->second->mbval = ret.data[i]; it->second->mbval = ret.data[i];
it->second->mb_initOK = true; it->second->mb_initOK = true;
...@@ -1023,13 +1037,13 @@ namespace uniset ...@@ -1023,13 +1037,13 @@ namespace uniset
case ModbusRTU::fnReadInputStatus: case ModbusRTU::fnReadInputStatus:
{ {
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr, p->mbreg, p->q_count); ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr, p->mbreg, p->q_count);
unsigned int m = 0; size_t m = 0;
for( uint i = 0; i < ret.bcnt; i++ ) for( uint i = 0; i < ret.bcnt; i++ )
{ {
ModbusRTU::DataBits b(ret.data[i]); ModbusRTU::DataBits b(ret.data[i]);
for( unsigned int k = 0; k < ModbusRTU::BitsPerByte && m < p->q_count; k++, it++, m++ ) for( size_t k = 0; k < ModbusRTU::BitsPerByte && m < p->q_count; k++, it++, m++ )
{ {
it->second->mbval = b[k]; it->second->mbval = b[k];
it->second->mb_initOK = true; it->second->mb_initOK = true;
...@@ -1043,13 +1057,13 @@ namespace uniset ...@@ -1043,13 +1057,13 @@ namespace uniset
case ModbusRTU::fnReadCoilStatus: case ModbusRTU::fnReadCoilStatus:
{ {
ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr, p->mbreg, p->q_count); ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr, p->mbreg, p->q_count);
unsigned int m = 0; size_t m = 0;
for( auto i = 0; i < ret.bcnt; i++ ) for( auto i = 0; i < ret.bcnt; i++ )
{ {
ModbusRTU::DataBits b(ret.data[i]); ModbusRTU::DataBits b(ret.data[i]);
for( unsigned int k = 0; k < ModbusRTU::BitsPerByte && m < p->q_count; k++, it++, m++ ) for( size_t k = 0; k < ModbusRTU::BitsPerByte && m < p->q_count; k++, it++, m++ )
{ {
it->second->mbval = b[k] ? 1 : 0; it->second->mbval = b[k] ? 1 : 0;
it->second->mb_initOK = true; it->second->mb_initOK = true;
...@@ -1102,7 +1116,7 @@ namespace uniset ...@@ -1102,7 +1116,7 @@ namespace uniset
ModbusRTU::WriteOutputMessage msg(dev->mbaddr, p->mbreg); ModbusRTU::WriteOutputMessage msg(dev->mbaddr, p->mbreg);
for( unsigned int i = 0; i < p->q_count; i++, it++ ) for( size_t i = 0; i < p->q_count; i++, it++ )
msg.addData(it->second->mbval); msg.addData(it->second->mbval);
it--; it--;
...@@ -1144,7 +1158,7 @@ namespace uniset ...@@ -1144,7 +1158,7 @@ namespace uniset
ModbusRTU::ForceCoilsMessage msg(dev->mbaddr, p->mbreg); ModbusRTU::ForceCoilsMessage msg(dev->mbaddr, p->mbreg);
for( unsigned i = 0; i < p->q_count; i++, it++ ) for( size_t i = 0; i < p->q_count; i++, it++ )
msg.addBit( (it->second->mbval ? true : false) ); msg.addBit( (it->second->mbval ? true : false) );
it--; it--;
...@@ -1400,10 +1414,10 @@ namespace uniset ...@@ -1400,10 +1414,10 @@ namespace uniset
if( p->stype == UniversalIO::DI || if( p->stype == UniversalIO::DI ||
p->stype == UniversalIO::DO ) p->stype == UniversalIO::DO )
{ {
r->mbval = (unsigned short)IOBase::processingAsDO( p, shm, force_out ); r->mbval = (uint16_t)IOBase::processingAsDO( p, shm, force_out );
} }
else else
r->mbval = (unsigned short)IOBase::processingAsAO( p, shm, force_out ); r->mbval = (uint16_t)IOBase::processingAsAO( p, shm, force_out );
r->sm_initOK = true; r->sm_initOK = true;
} }
...@@ -1417,7 +1431,7 @@ namespace uniset ...@@ -1417,7 +1431,7 @@ namespace uniset
} }
else else
{ {
IOBase::processingAsAI( p, (unsigned short)r->mbval, shm, force ); IOBase::processingAsAI( p, (uint16_t)r->mbval, shm, force );
} }
} }
...@@ -1481,26 +1495,24 @@ namespace uniset ...@@ -1481,26 +1495,24 @@ namespace uniset
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::F2::wsize()]; DataGuard d(VTypes::F2::wsize());
for( size_t k = 0; k < VTypes::F2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F2::wsize(); k++, i++ )
data[k] = i->second->mbval; d.data[k] = i->second->mbval;
float f = 0; float f = 0;
if( p->vType == VTypes::vtF2 ) if( p->vType == VTypes::vtF2 )
{ {
VTypes::F2 f1(data, VTypes::F2::wsize()); VTypes::F2 f1(d.data, VTypes::F2::wsize());
f = (float)f1; f = (float)f1;
} }
else if( p->vType == VTypes::vtF2r ) else if( p->vType == VTypes::vtF2r )
{ {
VTypes::F2r f1(data, VTypes::F2r::wsize()); VTypes::F2r f1(d.data, VTypes::F2r::wsize());
f = (float)f1; f = (float)f1;
} }
delete[] data;
IOBase::processingFasAI( p, f, shm, force ); IOBase::processingFasAI( p, f, shm, force );
} }
} }
...@@ -1523,13 +1535,12 @@ namespace uniset ...@@ -1523,13 +1535,12 @@ namespace uniset
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::F4::wsize()]; DataGuard d(VTypes::F4::wsize());
for( size_t k = 0; k < VTypes::F4::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F4::wsize(); k++, i++ )
data[k] = i->second->mbval; d.data[k] = i->second->mbval;
VTypes::F4 f(data, VTypes::F4::wsize()); VTypes::F4 f(d.data, VTypes::F4::wsize());
delete[] data;
IOBase::processingFasAI( p, (float)f, shm, force ); IOBase::processingFasAI( p, (float)f, shm, force );
} }
...@@ -1546,14 +1557,14 @@ namespace uniset ...@@ -1546,14 +1557,14 @@ namespace uniset
if( p->vType == VTypes::vtI2 ) if( p->vType == VTypes::vtI2 )
{ {
VTypes::I2 i2(v); VTypes::I2 i2( (int32_t)v );
for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ )
i->second->mbval = i2.raw.v[k]; i->second->mbval = i2.raw.v[k];
} }
else if( p->vType == VTypes::vtI2r ) else if( p->vType == VTypes::vtI2r )
{ {
VTypes::I2r i2(v); VTypes::I2r i2( (int32_t)v );
for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ )
i->second->mbval = i2.raw.v[k]; i->second->mbval = i2.raw.v[k];
...@@ -1564,25 +1575,24 @@ namespace uniset ...@@ -1564,25 +1575,24 @@ namespace uniset
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::I2::wsize()]; DataGuard d(VTypes::I2::wsize());
for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ )
data[k] = i->second->mbval; d.data[k] = i->second->mbval;
int v = 0; int v = 0;
if( p->vType == VTypes::vtI2 ) if( p->vType == VTypes::vtI2 )
{ {
VTypes::I2 i2(data, VTypes::I2::wsize()); VTypes::I2 i2(d.data, VTypes::I2::wsize());
v = (int)i2; v = (int)i2;
} }
else if( p->vType == VTypes::vtI2r ) else if( p->vType == VTypes::vtI2r )
{ {
VTypes::I2r i2(data, VTypes::I2::wsize()); VTypes::I2r i2(d.data, VTypes::I2::wsize());
v = (int)i2; v = (int)i2;
} }
delete[] data;
IOBase::processingAsAI( p, v, shm, force ); IOBase::processingAsAI( p, v, shm, force );
} }
} }
...@@ -1616,25 +1626,24 @@ namespace uniset ...@@ -1616,25 +1626,24 @@ namespace uniset
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::U2::wsize()]; DataGuard d(VTypes::U2::wsize());
for( size_t k = 0; k < VTypes::U2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::U2::wsize(); k++, i++ )
data[k] = i->second->mbval; d.data[k] = i->second->mbval;
unsigned int v = 0; uint32_t v = 0;
if( p->vType == VTypes::vtU2 ) if( p->vType == VTypes::vtU2 )
{ {
VTypes::U2 u2(data, VTypes::U2::wsize()); VTypes::U2 u2(d.data, VTypes::U2::wsize());
v = (unsigned int)u2; v = (uint32_t)u2;
} }
else if( p->vType == VTypes::vtU2r ) else if( p->vType == VTypes::vtU2r )
{ {
VTypes::U2r u2(data, VTypes::U2::wsize()); VTypes::U2r u2(d.data, VTypes::U2::wsize());
v = (unsigned int)u2; v = (uint32_t)u2;
} }
delete[] data;
IOBase::processingAsAI( p, v, shm, force ); IOBase::processingAsAI( p, v, shm, force );
} }
} }
...@@ -1727,18 +1736,17 @@ namespace uniset ...@@ -1727,18 +1736,17 @@ namespace uniset
{ {
MTR::T3 t(IOBase::processingAsAO( &(*it), shm, force_out )); MTR::T3 t(IOBase::processingAsAO( &(*it), shm, force_out ));
for( unsigned int k = 0; k < MTR::T3::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::T3::wsize(); k++, i++ )
i->second->mbval = t.raw.v[k]; i->second->mbval = t.raw.v[k];
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[MTR::T3::wsize()]; DataGuard d(MTR::T3::wsize());
for( unsigned int k = 0; k < MTR::T3::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::T3::wsize(); k++, i++ )
data[k] = i->second->mbval; d.data[k] = i->second->mbval;
MTR::T3 t(data, MTR::T3::wsize()); MTR::T3 t(d.data, MTR::T3::wsize());
delete[] data;
IOBase::processingAsAI( &(*it), (long)t, shm, force ); IOBase::processingAsAI( &(*it), (long)t, shm, force );
} }
...@@ -1768,18 +1776,17 @@ namespace uniset ...@@ -1768,18 +1776,17 @@ namespace uniset
{ {
MTR::T5 t(IOBase::processingAsAO( &(*it), shm, force_out )); MTR::T5 t(IOBase::processingAsAO( &(*it), shm, force_out ));
for( unsigned int k = 0; k < MTR::T5::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::T5::wsize(); k++, i++ )
i->second->mbval = t.raw.v[k]; i->second->mbval = t.raw.v[k];
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[MTR::T5::wsize()]; DataGuard d(MTR::T5::wsize());
for( unsigned int k = 0; k < MTR::T5::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::T5::wsize(); k++, i++ )
data[k] = i->second->mbval; d.data[k] = i->second->mbval;
MTR::T5 t(data, MTR::T5::wsize()); MTR::T5 t(d.data, MTR::T5::wsize());
delete[] data;
IOBase::processingFasAI( &(*it), (float)t.val, shm, force ); IOBase::processingFasAI( &(*it), (float)t.val, shm, force );
} }
...@@ -1795,18 +1802,17 @@ namespace uniset ...@@ -1795,18 +1802,17 @@ namespace uniset
{ {
MTR::T6 t(IOBase::processingAsAO( &(*it), shm, force_out )); MTR::T6 t(IOBase::processingAsAO( &(*it), shm, force_out ));
for( unsigned int k = 0; k < MTR::T6::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::T6::wsize(); k++, i++ )
i->second->mbval = t.raw.v[k]; i->second->mbval = t.raw.v[k];
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[MTR::T6::wsize()]; DataGuard d(MTR::T6::wsize());
for( unsigned int k = 0; k < MTR::T6::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::T6::wsize(); k++, i++ )
data[k] = i->second->mbval; d.data[k] = i->second->mbval;
MTR::T6 t(data, MTR::T6::wsize()); MTR::T6 t(d.data, MTR::T6::wsize());
delete[] data;
IOBase::processingFasAI( &(*it), (float)t.val, shm, force ); IOBase::processingFasAI( &(*it), (float)t.val, shm, force );
} }
...@@ -1822,18 +1828,17 @@ namespace uniset ...@@ -1822,18 +1828,17 @@ namespace uniset
{ {
MTR::T7 t(IOBase::processingAsAO( &(*it), shm, force_out )); MTR::T7 t(IOBase::processingAsAO( &(*it), shm, force_out ));
for( unsigned int k = 0; k < MTR::T7::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::T7::wsize(); k++, i++ )
i->second->mbval = t.raw.v[k]; i->second->mbval = t.raw.v[k];
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[MTR::T7::wsize()]; DataGuard d(MTR::T7::wsize());
for( unsigned int k = 0; k < MTR::T7::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::T7::wsize(); k++, i++ )
data[k] = i->second->mbval; d.data[k] = i->second->mbval;
MTR::T7 t(data, MTR::T7::wsize()); MTR::T7 t(d.data, MTR::T7::wsize());
delete[] data;
IOBase::processingFasAI( &(*it), (float)t.val, shm, force ); IOBase::processingFasAI( &(*it), (float)t.val, shm, force );
} }
...@@ -1882,19 +1887,17 @@ namespace uniset ...@@ -1882,19 +1887,17 @@ namespace uniset
float f = IOBase::processingFasAO( &(*it), shm, force_out ); float f = IOBase::processingFasAO( &(*it), shm, force_out );
MTR::F1 f1(f); MTR::F1 f1(f);
for( unsigned int k = 0; k < MTR::F1::wsize(); k++, i++ ) for( size_t k = 0; k < MTR::F1::wsize(); k++, i++ )
i->second->mbval = f1.raw.v[k]; i->second->mbval = f1.raw.v[k];
} }
else else
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[MTR::F1::wsize()]; DataGuard d(MTR::F1::wsize());
for( unsigned int k = 0; k < MTR::F1::wsize(); k++, i++ )
data[k] = i->second->mbval;
MTR::F1 t(data, MTR::F1::wsize()); for( size_t k = 0; k < MTR::F1::wsize(); k++, i++ )
delete[] data; d.data[k] = i->second->mbval;
MTR::F1 t(d.data, MTR::F1::wsize());
IOBase::processingFasAI( &(*it), (float)t, shm, force ); IOBase::processingFasAI( &(*it), (float)t, shm, force );
} }
......
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#include <sstream> #include <sstream>
#include <limits>
#include <Poco/Net/NetException.h> #include <Poco/Net/NetException.h>
#include "UniSetTypes.h" #include "UniSetTypes.h"
#include "MBTCPTestServer.h" #include "MBTCPTestServer.h"
...@@ -23,7 +24,7 @@ MBTCPTestServer::MBTCPTestServer( const std::unordered_set<ModbusAddr>& _vaddr, ...@@ -23,7 +24,7 @@ MBTCPTestServer::MBTCPTestServer( const std::unordered_set<ModbusAddr>& _vaddr,
sslot(NULL), sslot(NULL),
vaddr(_vaddr), vaddr(_vaddr),
verbose(verb), verbose(verb),
replyVal(-1), replyVal(std::numeric_limits<uint32_t>::max()),
forceSingleCoilCmd(false), forceSingleCoilCmd(false),
lastWriteOutputSingleRegister(0), lastWriteOutputSingleRegister(0),
lastForceCoilsQ(0, 0), lastForceCoilsQ(0, 0),
...@@ -122,7 +123,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query, ...@@ -122,7 +123,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
if( query.count <= 1 ) if( query.count <= 1 )
{ {
if( replyVal != -1 ) if( replyVal != std::numeric_limits<uint32_t>::max() )
reply.addData(replyVal); reply.addData(replyVal);
else else
reply.addData(d); reply.addData(d);
...@@ -136,7 +137,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query, ...@@ -136,7 +137,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
for( ; num < query.count; num++, reg++ ) for( ; num < query.count; num++, reg++ )
{ {
if( replyVal != -1 ) if( replyVal != std::numeric_limits<uint32_t>::max() )
reply.addData(replyVal); reply.addData(replyVal);
else else
reply.addData(d); reply.addData(d);
...@@ -167,7 +168,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readInputStatus( ReadInputStatusMessage& q ...@@ -167,7 +168,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readInputStatus( ReadInputStatusMessage& q
d.b[3] = 1; d.b[3] = 1;
d.b[7] = 1; d.b[7] = 1;
if( replyVal == -1 ) if( replyVal == std::numeric_limits<uint32_t>::max() )
{ {
size_t bnum = 0; size_t bnum = 0;
size_t i = 0; size_t i = 0;
...@@ -207,7 +208,7 @@ mbErrCode MBTCPTestServer::readInputRegisters( ReadInputMessage& query, ...@@ -207,7 +208,7 @@ mbErrCode MBTCPTestServer::readInputRegisters( ReadInputMessage& query,
if( query.count <= 1 ) if( query.count <= 1 )
{ {
if( replyVal != -1 ) if( replyVal != std::numeric_limits<uint32_t>::max() )
reply.addData(replyVal); reply.addData(replyVal);
else else
reply.addData(query.start); reply.addData(query.start);
...@@ -221,7 +222,7 @@ mbErrCode MBTCPTestServer::readInputRegisters( ReadInputMessage& query, ...@@ -221,7 +222,7 @@ mbErrCode MBTCPTestServer::readInputRegisters( ReadInputMessage& query,
for( ; num < query.count; num++, reg++ ) for( ; num < query.count; num++, reg++ )
{ {
if( replyVal != -1 ) if( replyVal != std::numeric_limits<uint32_t>::max() )
reply.addData(replyVal); reply.addData(replyVal);
else else
reply.addData(reg); reply.addData(reg);
...@@ -252,7 +253,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readOutputRegisters( ...@@ -252,7 +253,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readOutputRegisters(
if( query.count <= 1 ) if( query.count <= 1 )
{ {
if( replyVal != -1 ) if( replyVal != std::numeric_limits<uint32_t>::max() )
reply.addData(replyVal); reply.addData(replyVal);
else else
reply.addData(query.start); reply.addData(query.start);
...@@ -266,7 +267,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readOutputRegisters( ...@@ -266,7 +267,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readOutputRegisters(
for( ; num < query.count; num++, reg++ ) for( ; num < query.count; num++, reg++ )
{ {
if( replyVal != -1 ) if( replyVal != std::numeric_limits<uint32_t>::max() )
reply.addData(replyVal); reply.addData(replyVal);
else else
reply.addData(reg); reply.addData(reg);
......
...@@ -19,7 +19,7 @@ class MBTCPTestServer ...@@ -19,7 +19,7 @@ class MBTCPTestServer
verbose = state; verbose = state;
} }
inline void setReply( long val ) inline void setReply( uint32_t val )
{ {
replyVal = val; replyVal = val;
} }
...@@ -47,7 +47,7 @@ class MBTCPTestServer ...@@ -47,7 +47,7 @@ class MBTCPTestServer
{ {
return forceSingleCoilCmd; return forceSingleCoilCmd;
} }
inline int getLastWriteOutputSingleRegister() inline int16_t getLastWriteOutputSingleRegister()
{ {
return lastWriteOutputSingleRegister; return lastWriteOutputSingleRegister;
} }
...@@ -131,9 +131,9 @@ class MBTCPTestServer ...@@ -131,9 +131,9 @@ class MBTCPTestServer
std::unordered_set<uniset::ModbusRTU::ModbusAddr> vaddr; /*!< адреса данного узла */ std::unordered_set<uniset::ModbusRTU::ModbusAddr> vaddr; /*!< адреса данного узла */
bool verbose; bool verbose;
long replyVal; uint32_t replyVal;
bool forceSingleCoilCmd; bool forceSingleCoilCmd;
int lastWriteOutputSingleRegister; int16_t lastWriteOutputSingleRegister;
uniset::ModbusRTU::ForceCoilsMessage lastForceCoilsQ; uniset::ModbusRTU::ForceCoilsMessage lastForceCoilsQ;
uniset::ModbusRTU::WriteOutputMessage lastWriteOutputQ; uniset::ModbusRTU::WriteOutputMessage lastWriteOutputQ;
float f2_test_value = {0.0}; float f2_test_value = {0.0};
......
...@@ -222,12 +222,12 @@ TEST_CASE("MBTCPMaster: 0x03 (read register outputs or memories or read word out ...@@ -222,12 +222,12 @@ TEST_CASE("MBTCPMaster: 0x03 (read register outputs or memories or read word out
REQUIRE( ui->getValue(1004) == -10 ); REQUIRE( ui->getValue(1004) == -10 );
REQUIRE( ui->getValue(1005) == -10 ); REQUIRE( ui->getValue(1005) == -10 );
REQUIRE( ui->getValue(1006) == -10 ); REQUIRE( ui->getValue(1006) == -10 );
mbs->setReply(0); mbs->setReply(1);
msleep(polltime + 200); msleep(polltime + 200);
REQUIRE( ui->getValue(1003) == 0 ); REQUIRE( ui->getValue(1003) == 1 );
REQUIRE( ui->getValue(1004) == 0 ); REQUIRE( ui->getValue(1004) == 1 );
REQUIRE( ui->getValue(1005) == 0 ); REQUIRE( ui->getValue(1005) == 1 );
REQUIRE( ui->getValue(1006) == 0 ); REQUIRE( ui->getValue(1006) == 1 );
mbs->setReply(65535); mbs->setReply(65535);
msleep(polltime + 200); msleep(polltime + 200);
REQUIRE( ui->getValue(1003) == -1 ); REQUIRE( ui->getValue(1003) == -1 );
...@@ -236,10 +236,14 @@ TEST_CASE("MBTCPMaster: 0x03 (read register outputs or memories or read word out ...@@ -236,10 +236,14 @@ TEST_CASE("MBTCPMaster: 0x03 (read register outputs or memories or read word out
REQUIRE( ui->getValue(1006) == -1 ); REQUIRE( ui->getValue(1006) == -1 );
REQUIRE( ui->getValue(1007) == 65535 ); // unsigned REQUIRE( ui->getValue(1007) == 65535 ); // unsigned
mbs->setReply(0xffff); mbs->setReply( std::numeric_limits<uint16_t>::max() );
msleep(polltime + 200);
REQUIRE( (uint16_t)ui->getValue(1009) == std::numeric_limits<uint16_t>::max() ); // U2
mbs->setReply( std::numeric_limits<int16_t>::max() );
msleep(polltime + 200); msleep(polltime + 200);
REQUIRE( ui->getValue(1008) == 0xffffffff ); // I2 REQUIRE( (int16_t)ui->getValue(1008) == std::numeric_limits<int16_t>::max() ); // I2
REQUIRE( ui->getValue(1009) == 0xffffffff ); // U2
mbs->setReply(0xff); mbs->setReply(0xff);
msleep(polltime + 200); msleep(polltime + 200);
REQUIRE( ui->getValue(1008) == 0x00ff00ff ); // I2 REQUIRE( ui->getValue(1008) == 0x00ff00ff ); // I2
...@@ -281,10 +285,14 @@ TEST_CASE("MBTCPMaster: 0x04 (read input registers or memories or read word outp ...@@ -281,10 +285,14 @@ TEST_CASE("MBTCPMaster: 0x04 (read input registers or memories or read word outp
REQUIRE( ui->getValue(1013) == -1 ); REQUIRE( ui->getValue(1013) == -1 );
REQUIRE( ui->getValue(1014) == 65535 ); // unsigned REQUIRE( ui->getValue(1014) == 65535 ); // unsigned
mbs->setReply(0xffff); mbs->setReply( std::numeric_limits<uint16_t>::max() );
msleep(polltime + 200); msleep(polltime + 200);
REQUIRE( ui->getValue(1015) == 0xffffffff ); // I2 REQUIRE( (uint16_t)ui->getValue(1009) == std::numeric_limits<uint16_t>::max() ); // U2
REQUIRE( ui->getValue(1016) == 0xffffffff ); // U2
mbs->setReply( std::numeric_limits<int16_t>::max() );
msleep(polltime + 200);
REQUIRE( (int16_t)ui->getValue(1008) == std::numeric_limits<int16_t>::max() ); // I2
mbs->setReply(0xff); mbs->setReply(0xff);
msleep(polltime + 200); msleep(polltime + 200);
REQUIRE( ui->getValue(1015) == 0x00ff00ff ); // I2 REQUIRE( ui->getValue(1015) == 0x00ff00ff ); // I2
...@@ -457,23 +465,23 @@ TEST_CASE("MBTCPMaster: 0x10 (write register outputs or memories)", "[modbus][0x ...@@ -457,23 +465,23 @@ TEST_CASE("MBTCPMaster: 0x10 (write register outputs or memories)", "[modbus][0x
REQUIRE( q.addr == slaveADDR ); REQUIRE( q.addr == slaveADDR );
REQUIRE( q.start == 31 ); REQUIRE( q.start == 31 );
REQUIRE( q.quant == 6 ); REQUIRE( q.quant == 6 );
REQUIRE( q.data[0] == (unsigned short)(-100) ); REQUIRE( q.data[0] == (uint16_t)(-100) );
REQUIRE( q.data[2] == (unsigned short)(-10) ); REQUIRE( q.data[2] == (uint16_t)(-10) );
REQUIRE( q.data[3] == (unsigned short)(-32767) ); REQUIRE( q.data[3] == (uint16_t)(-32767) );
} }
SECTION("I2") SECTION("I2")
{ {
ui->setValue(1023, 0xffffffff); ui->setValue(1023, std::numeric_limits<uint32_t>::max());
REQUIRE( ui->getValue(1023) == 0xffffffff ); REQUIRE( (uint32_t)ui->getValue(1023) == std::numeric_limits<uint32_t>::max() );
msleep(polltime + 200); msleep(polltime + 200);
ModbusRTU::WriteOutputMessage q = mbs->getLastWriteOutput(); ModbusRTU::WriteOutputMessage q = mbs->getLastWriteOutput();
REQUIRE( q.addr == slaveADDR ); REQUIRE( q.addr == slaveADDR );
REQUIRE( q.start == 31 ); REQUIRE( q.start == 31 );
REQUIRE( q.quant == 6 ); REQUIRE( q.quant == 6 );
REQUIRE( q.data[4] == 0xffff ); REQUIRE( q.data[4] == std::numeric_limits<uint16_t>::max() );
REQUIRE( q.data[5] == 0xffff ); REQUIRE( q.data[5] == std::numeric_limits<uint16_t>::max() );
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -127,6 +127,8 @@ TEST_CASE("MBTCPMultiMaster: rotate channel", "[modbus][mbmaster][mbtcpmultimast ...@@ -127,6 +127,8 @@ TEST_CASE("MBTCPMultiMaster: rotate channel", "[modbus][mbmaster][mbtcpmultimast
InitTest(); InitTest();
CHECK( ui->isExist(mbID) ); CHECK( ui->isExist(mbID) );
mbs1->setReply(0);
msleep(polltime + 1000);
REQUIRE( ui->getValue(1003) == 0 ); REQUIRE( ui->getValue(1003) == 0 );
mbs1->setReply(100); mbs1->setReply(100);
mbs2->setReply(10); mbs2->setReply(10);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#define _RTUTypes_H_ #define _RTUTypes_H_
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <string> #include <string>
#include <stdint.h>
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <ostream> #include <ostream>
...@@ -61,7 +62,7 @@ namespace uniset ...@@ -61,7 +62,7 @@ namespace uniset
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
unsigned short v[f2Size]; uint16_t v[f2Size];
float val; // float val; //
} F2mem; } F2mem;
// ------------------------------------------ // ------------------------------------------
...@@ -147,7 +148,7 @@ namespace uniset ...@@ -147,7 +148,7 @@ namespace uniset
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
unsigned short v[f4Size]; uint16_t v[f4Size];
float val; // float val; //
} F4mem; } F4mem;
// ------------------------------------------ // ------------------------------------------
...@@ -202,8 +203,8 @@ namespace uniset ...@@ -202,8 +203,8 @@ namespace uniset
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
unsigned short w; uint16_t w;
unsigned char b[bsize]; uint8_t b[bsize];
} Bytemem; } Bytemem;
// ------------------------------------------ // ------------------------------------------
// конструкторы на разные случаи... // конструкторы на разные случаи...
...@@ -212,15 +213,11 @@ namespace uniset ...@@ -212,15 +213,11 @@ namespace uniset
raw.w = 0; raw.w = 0;
} }
Byte( unsigned char b1, unsigned char b2 ) noexcept Byte( uint8_t b1, uint8_t b2 ) noexcept
{ {
raw.b[0] = b1; raw.b[0] = b1;
raw.b[1] = b2; raw.b[1] = b2;
} }
Byte( const long& val ) noexcept
{
raw.w = val;
}
Byte( const ModbusRTU::ModbusData dat ) noexcept Byte( const ModbusRTU::ModbusData dat ) noexcept
{ {
...@@ -240,16 +237,12 @@ namespace uniset ...@@ -240,16 +237,12 @@ namespace uniset
return vtByte; return vtByte;
} }
// ------------------------------------------ // ------------------------------------------
operator long() operator uint16_t()
{
return lroundf(raw.w);
}
operator unsigned short()
{ {
return raw.w; return raw.w;
} }
unsigned char operator[]( const int i ) uint8_t operator[]( const size_t i )
{ {
return raw.b[i]; return raw.b[i];
} }
...@@ -293,7 +286,7 @@ namespace uniset ...@@ -293,7 +286,7 @@ namespace uniset
return raw; return raw;
} }
unsigned short raw; uint16_t raw;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
class Signed class Signed
...@@ -332,7 +325,7 @@ namespace uniset ...@@ -332,7 +325,7 @@ namespace uniset
return raw; return raw;
} }
signed short raw; int16_t raw;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
class I2 class I2
...@@ -344,8 +337,8 @@ namespace uniset ...@@ -344,8 +337,8 @@ namespace uniset
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
unsigned short v[i2Size]; uint16_t v[i2Size];
int val; // int32_t val; //
} I2mem; } I2mem;
// ------------------------------------------ // ------------------------------------------
// конструкторы на разные случаи... // конструкторы на разные случаи...
...@@ -354,7 +347,7 @@ namespace uniset ...@@ -354,7 +347,7 @@ namespace uniset
memset(raw.v, 0, sizeof(raw.v)); memset(raw.v, 0, sizeof(raw.v));
} }
I2( int v ) noexcept I2( int32_t v ) noexcept
{ {
raw.val = v; raw.val = v;
} }
...@@ -377,7 +370,7 @@ namespace uniset ...@@ -377,7 +370,7 @@ namespace uniset
return vtI2; return vtI2;
} }
// ------------------------------------------ // ------------------------------------------
operator int() operator int32_t()
{ {
return raw.val; return raw.val;
} }
...@@ -394,7 +387,7 @@ namespace uniset ...@@ -394,7 +387,7 @@ namespace uniset
raw_backorder.val = 0; raw_backorder.val = 0;
} }
I2r( const int v ) noexcept: I2(v) I2r( const int32_t v ) noexcept: I2(v)
{ {
raw_backorder = raw; raw_backorder = raw;
std::swap(raw_backorder.v[0], raw_backorder.v[1]); std::swap(raw_backorder.v[0], raw_backorder.v[1]);
...@@ -421,8 +414,8 @@ namespace uniset ...@@ -421,8 +414,8 @@ namespace uniset
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
unsigned short v[u2Size]; uint16_t v[u2Size];
unsigned int val; // uint32_t val; //
} U2mem; } U2mem;
// ------------------------------------------ // ------------------------------------------
// конструкторы на разные случаи... // конструкторы на разные случаи...
...@@ -431,7 +424,7 @@ namespace uniset ...@@ -431,7 +424,7 @@ namespace uniset
memset(raw.v, 0, sizeof(raw.v)); memset(raw.v, 0, sizeof(raw.v));
} }
U2( unsigned int v ) noexcept U2( uint32_t v ) noexcept
{ {
raw.val = v; raw.val = v;
} }
...@@ -454,11 +447,21 @@ namespace uniset ...@@ -454,11 +447,21 @@ namespace uniset
return vtU2; return vtU2;
} }
// ------------------------------------------ // ------------------------------------------
operator unsigned int() operator uint32_t()
{
return raw.val;
}
operator long()
{ {
return raw.val; return raw.val;
} }
operator unsigned long()
{
return (uint32_t)raw.val;
}
U2mem raw; U2mem raw;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -471,7 +474,7 @@ namespace uniset ...@@ -471,7 +474,7 @@ namespace uniset
raw_backorder.val = 0; raw_backorder.val = 0;
} }
U2r( int v ) noexcept: U2(v) U2r( int32_t v ) noexcept: U2(v)
{ {
raw_backorder = raw; raw_backorder = raw;
std::swap(raw_backorder.v[0], raw_backorder.v[1]); std::swap(raw_backorder.v[0], raw_backorder.v[1]);
......
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