Commit e94544b9 authored by Pavel Vainerman's avatar Pavel Vainerman

ModbusSlave: fixed bug,

DelayTimer: add tests, make style
parent 4881c356
...@@ -103,8 +103,8 @@ int main( int argc, char** argv ) ...@@ -103,8 +103,8 @@ int main( int argc, char** argv )
struct DataInfo struct DataInfo
{ {
DValue d={0}; DValue d = {0};
char type={'i'}; // i - integer, f - float, r - revert float char type = {'i'}; // i - integer, f - float, r - revert float
}; };
vector<DataInfo> data; vector<DataInfo> data;
...@@ -208,10 +208,10 @@ int main( int argc, char** argv ) ...@@ -208,10 +208,10 @@ int main( int argc, char** argv )
reg = ModbusRTU::str2mbData(argv[optind]); reg = ModbusRTU::str2mbData(argv[optind]);
for( int o=optind + 1; o<argc; o++ ) for( int o = optind + 1; o < argc; o++ )
{ {
DataInfo dval; DataInfo dval;
char* arg= checkArg(o, argc, argv); char* arg = checkArg(o, argc, argv);
if( arg == 0 ) if( arg == 0 )
break; break;
...@@ -247,6 +247,7 @@ int main( int argc, char** argv ) ...@@ -247,6 +247,7 @@ int main( int argc, char** argv )
data.push_back(dval); data.push_back(dval);
val = dval.d.v; val = dval.d.v;
} }
break; break;
case 'i': case 'i':
...@@ -535,7 +536,8 @@ int main( int argc, char** argv ) ...@@ -535,7 +536,8 @@ int main( int argc, char** argv )
cout << "write10: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) cout << "write10: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< " reg=" << ModbusRTU::dat2str(reg) << " reg=" << ModbusRTU::dat2str(reg)
<< " data[" << data.size() << "]{ "; << " data[" << data.size() << "]{ ";
for( const auto& v: data )
for( const auto& v : data )
{ {
if( v.type == 'f' ) if( v.type == 'f' )
cout << v.d.f << "f "; cout << v.d.f << "f ";
...@@ -548,14 +550,15 @@ int main( int argc, char** argv ) ...@@ -548,14 +550,15 @@ int main( int argc, char** argv )
ModbusRTU::WriteOutputMessage msg(slaveaddr, reg); ModbusRTU::WriteOutputMessage msg(slaveaddr, reg);
for( const auto& v: data ) for( const auto& v : data )
{ {
if( v.type == 'f' || v.type == 'r' ) if( v.type == 'f' || v.type == 'r' )
{ {
ModbusRTU::ModbusData d[2]; ModbusRTU::ModbusData d[2];
memcpy(&d,&(v.d.f),std::min(sizeof(d),sizeof(v.d.f))); memcpy(&d, &(v.d.f), std::min(sizeof(d), sizeof(v.d.f)));
if( v.type == 'r' ) if( v.type == 'r' )
std::swap(d[0],d[1]); std::swap(d[0], d[1]);
msg.addData(d[0]); msg.addData(d[0]);
msg.addData(d[1]); msg.addData(d[1]);
......
...@@ -2669,7 +2669,7 @@ bool MBExchange::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXM ...@@ -2669,7 +2669,7 @@ bool MBExchange::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXM
dinfo << myname << "(initDeviceInfo): add addr=" << ModbusRTU::addr2str(a) << endl; dinfo << myname << "(initDeviceInfo): add addr=" << ModbusRTU::addr2str(a) << endl;
int tout = it.getPIntProp("timeout", default_timeout ); int tout = it.getPIntProp("timeout", default_timeout );
d->second->resp_Delay.set(tout,false); d->second->resp_Delay.set(tout, false);
d->second->resp_invert = it.getIntProp("invert"); d->second->resp_invert = it.getIntProp("invert");
return true; return true;
} }
......
...@@ -584,7 +584,7 @@ TEST_CASE("MBTCPMaster: 0x10 (F2)", "[modbus][0x10][F2][mbmaster][mbtcpmaster]") ...@@ -584,7 +584,7 @@ TEST_CASE("MBTCPMaster: 0x10 (F2)", "[modbus][0x10][F2][mbmaster][mbtcpmaster]")
REQUIRE( q.start == 41 ); REQUIRE( q.start == 41 );
REQUIRE( q.quant == 2 ); REQUIRE( q.quant == 2 );
VTypes::F2 f2(q.data,VTypes::F2::wsize()); VTypes::F2 f2(q.data, VTypes::F2::wsize());
float f = f2; float f = f2;
REQUIRE( f == 100 ); REQUIRE( f == 100 );
} }
...@@ -603,7 +603,7 @@ TEST_CASE("MBTCPMaster: 0x10 (F4)", "[modbus][0x10][F4][mbmaster][mbtcpmaster]") ...@@ -603,7 +603,7 @@ TEST_CASE("MBTCPMaster: 0x10 (F4)", "[modbus][0x10][F4][mbmaster][mbtcpmaster]")
REQUIRE( q.start == 45 ); REQUIRE( q.start == 45 );
REQUIRE( q.quant == 4 ); REQUIRE( q.quant == 4 );
VTypes::F4 f4(q.data,VTypes::F4::wsize()); VTypes::F4 f4(q.data, VTypes::F4::wsize());
float f = f4; float f = f4;
REQUIRE( f == v ); REQUIRE( f == v );
} }
......
...@@ -85,7 +85,7 @@ MBSlave::MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, cons ...@@ -85,7 +85,7 @@ MBSlave::MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, cons
mbregFromID = conf->getArgInt("--" + prefix + "-reg-from-id", it.getProp("reg_from_id")); mbregFromID = conf->getArgInt("--" + prefix + "-reg-from-id", it.getProp("reg_from_id"));
checkMBFunc = conf->getArgInt("--" + prefix + "-check-mbfunc", it.getProp("check_mbfunc")); checkMBFunc = conf->getArgInt("--" + prefix + "-check-mbfunc", it.getProp("check_mbfunc"));
noMBFuncOptimize= conf->getArgInt("--" + prefix + "-no-mbfunc-optimization", it.getProp("no_mbfunc_optimization")); noMBFuncOptimize = conf->getArgInt("--" + prefix + "-no-mbfunc-optimization", it.getProp("no_mbfunc_optimization"));
dinfo << myname << "(init): mbregFromID=" << mbregFromID dinfo << myname << "(init): mbregFromID=" << mbregFromID
<< " checkMBFunc=" << checkMBFunc << " checkMBFunc=" << checkMBFunc
<< " default_mbfunc=" << default_mbfunc << " default_mbfunc=" << default_mbfunc
...@@ -1090,6 +1090,7 @@ int MBSlave::getOptimizeWriteFunction( const int fn ) ...@@ -1090,6 +1090,7 @@ int MBSlave::getOptimizeWriteFunction( const int fn )
if( fn == ModbusRTU::fnWriteOutputSingleRegister ) // 0x06 --> 0x10 if( fn == ModbusRTU::fnWriteOutputSingleRegister ) // 0x06 --> 0x10
return ModbusRTU::fnWriteOutputRegisters; return ModbusRTU::fnWriteOutputRegisters;
if( fn == ModbusRTU::fnForceSingleCoil ) // 0x05 --> 0x0F if( fn == ModbusRTU::fnForceSingleCoil ) // 0x05 --> 0x0F
return ModbusRTU::fnForceMultipleCoils; return ModbusRTU::fnForceMultipleCoils;
...@@ -1309,7 +1310,7 @@ ModbusRTU::mbErrCode MBSlave::much_real_write( const ModbusRTU::ModbusData reg, ...@@ -1309,7 +1310,7 @@ ModbusRTU::mbErrCode MBSlave::much_real_write( const ModbusRTU::ModbusData reg,
// ведь запросить могут начиная с "несуществующего регистра" // ведь запросить могут начиная с "несуществующего регистра"
for( ; i < count; i++ ) for( ; i < count; i++ )
{ {
it = iomap.find(regID+i); it = iomap.find(regID + i);
if( it != iomap.end() ) if( it != iomap.end() )
{ {
...@@ -1323,6 +1324,7 @@ ModbusRTU::mbErrCode MBSlave::much_real_write( const ModbusRTU::ModbusData reg, ...@@ -1323,6 +1324,7 @@ ModbusRTU::mbErrCode MBSlave::much_real_write( const ModbusRTU::ModbusData reg,
int prev_i = i; int prev_i = i;
int sub = 0; int sub = 0;
for( ; (it != iomap.end()) && (i < count); ) for( ; (it != iomap.end()) && (i < count); )
{ {
if( it->first == regID ) if( it->first == regID )
...@@ -1331,7 +1333,7 @@ ModbusRTU::mbErrCode MBSlave::much_real_write( const ModbusRTU::ModbusData reg, ...@@ -1331,7 +1333,7 @@ ModbusRTU::mbErrCode MBSlave::much_real_write( const ModbusRTU::ModbusData reg,
real_write_it(it, dat, i, count); real_write_it(it, dat, i, count);
sub = (i-prev_i); sub = (i - prev_i);
// если при обработке i не сдвигали.. // если при обработке i не сдвигали..
// значит сами делаем ++ // значит сами делаем ++
...@@ -1341,9 +1343,14 @@ ModbusRTU::mbErrCode MBSlave::much_real_write( const ModbusRTU::ModbusData reg, ...@@ -1341,9 +1343,14 @@ ModbusRTU::mbErrCode MBSlave::much_real_write( const ModbusRTU::ModbusData reg,
i++; i++;
} }
std::advance(it,sub); std::advance(it, sub);
regID += sub; regID += sub;
} }
else
{
regID++;
i++;
}
} }
return ModbusRTU::erNoError; return ModbusRTU::erNoError;
......
...@@ -1052,9 +1052,10 @@ TEST_CASE("read03(04) 10 registers", "[modbus][mbslave][mbtcpslave][readmore]") ...@@ -1052,9 +1052,10 @@ TEST_CASE("read03(04) 10 registers", "[modbus][mbslave][mbtcpslave][readmore]")
SECTION("Test: read03 num=10") SECTION("Test: read03 num=10")
{ {
ModbusRTU::ReadOutputRetMessage ret = mb->read03(slaveaddr, tREG, num); ModbusRTU::ReadOutputRetMessage ret = mb->read03(slaveaddr, tREG, num);
for( int i=0; i<num; i++ )
for( int i = 0; i < num; i++ )
{ {
REQUIRE( ret.data[i] == (i+1) ); REQUIRE( ret.data[i] == (i + 1) );
} }
} }
...@@ -1067,9 +1068,10 @@ TEST_CASE("read03(04) 10 registers", "[modbus][mbslave][mbtcpslave][readmore]") ...@@ -1067,9 +1068,10 @@ TEST_CASE("read03(04) 10 registers", "[modbus][mbslave][mbtcpslave][readmore]")
SECTION("Test: read04") SECTION("Test: read04")
{ {
ModbusRTU::ReadInputRetMessage ret = mb->read04(slaveaddr, tREG, num); ModbusRTU::ReadInputRetMessage ret = mb->read04(slaveaddr, tREG, num);
for( int i=0; i<num; i++ )
for( int i = 0; i < num; i++ )
{ {
REQUIRE( ret.data[i] == (i+1) ); REQUIRE( ret.data[i] == (i + 1) );
} }
} }
...@@ -1092,16 +1094,17 @@ TEST_CASE("write10: 10 registers", "[modbus][mbslave][mbtcpslave][writemore]") ...@@ -1092,16 +1094,17 @@ TEST_CASE("write10: 10 registers", "[modbus][mbslave][mbtcpslave][writemore]")
int num = 10; int num = 10;
ModbusRTU::WriteOutputMessage msg(slaveaddr, tREG); ModbusRTU::WriteOutputMessage msg(slaveaddr, tREG);
for( int i=1; i<=num; i++ )
for( int i = 1; i <= num; i++ )
msg.addData(i); msg.addData(i);
ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg); ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg);
REQUIRE( ret.start == tREG ); REQUIRE( ret.start == tREG );
REQUIRE( ret.quant == num ); REQUIRE( ret.quant == num );
for( int i=0; i<num; i++ ) for( int i = 0; i < num; i++ )
{ {
REQUIRE( (signed short)ui->getValue(id+i) == (i+1) ); REQUIRE( (signed short)ui->getValue(id + i) == (i + 1) );
} }
} }
// ------------------------------------------------------------- // -------------------------------------------------------------
......
...@@ -420,17 +420,14 @@ float IOBase::processingFasAO( IOBase* it, const std::shared_ptr<SMInterface>& s ...@@ -420,17 +420,14 @@ float IOBase::processingFasAO( IOBase* it, const std::shared_ptr<SMInterface>& s
float fval = val; float fval = val;
if( it->stype == UniversalIO::AO || if( it->stype == UniversalIO::AO || it->stype == UniversalIO::AI )
it->stype == UniversalIO::AI )
{ {
IOController_i::CalibrateInfo* cal( &(it->cal) ); IOController_i::CalibrateInfo* cal( &(it->cal) );
if( cal->maxRaw != cal->minRaw ) // задана калибровка if( cal->maxRaw != cal->minRaw ) // задана калибровка
{ {
// Калибруем в обратную сторону!!! // Калибруем в обратную сторону!!!
fval = UniSetTypes::fcalibrate(fval, fval = UniSetTypes::fcalibrate(fval, cal->minCal, cal->maxCal, cal->minRaw, cal->maxRaw, it->calcrop );
cal->minCal, cal->maxCal, cal->minRaw, cal->maxRaw, it->calcrop );
} }
if( !it->noprecision && it->cal.precision > 0 ) if( !it->noprecision && it->cal.precision > 0 )
......
...@@ -139,3 +139,37 @@ TEST_CASE("[DelayTimer]: debounce", "[DelayTimer]" ) ...@@ -139,3 +139,37 @@ TEST_CASE("[DelayTimer]: debounce", "[DelayTimer]" )
CHECK_FALSE( dt.check(false) ); CHECK_FALSE( dt.check(false) );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
TEST_CASE("[DelayTimer]: zero time", "[DelayTimer]" )
{
SECTION( "ondelay=0" )
{
DelayTimer dt(0, 100);
CHECK_FALSE( dt.get() );
CHECK_FALSE( dt.check(false) );
CHECK( dt.check(true) );
CHECK( dt.check(false) );
CHECK( dt.check(true) );
CHECK( dt.check(false) );
msleep(80);
CHECK( dt.check(false) );
msleep(40);
CHECK_FALSE( dt.check(false) );
CHECK( dt.check(true) );
}
SECTION( "offdelay=0" )
{
DelayTimer dt(100, 0);
CHECK_FALSE( dt.get() );
CHECK_FALSE( dt.check(false) );
CHECK_FALSE( dt.check(true) );
CHECK_FALSE( dt.check(false) );
CHECK_FALSE( dt.check(true) );
msleep(80);
CHECK_FALSE( dt.check(true) );
msleep(40);
CHECK( dt.check(true) );
CHECK_FALSE( dt.check(false) );
}
}
// -----------------------------------------------------------------------------
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