Commit 9c85ac7e authored by Pavel Vainerman's avatar Pavel Vainerman

(MBSlave): добавил обработку vtByte и тесты.

parent bc1b1c3c
...@@ -847,11 +847,31 @@ bool MBSlave::initItem( UniXML_iterator& it ) ...@@ -847,11 +847,31 @@ bool MBSlave::initItem( UniXML_iterator& it )
if( v == VTypes::vtUnknown ) if( v == VTypes::vtUnknown )
{ {
dcrit << myname << "(initItem): Unknown rtuVType=" << vt << " for " dcrit << myname << "(initItem): Unknown rtuVType=" << vt << " for "
<< IOBase::initProp(it,"name",prop_prefix,false) << it.getProp("name")
<< endl; << endl;
return false; return false;
} }
else if( v == VTypes::vtByte )
{
p.nbyte = IOBase::initIntProp(it,"nbyte",prop_prefix,false);
if( p.nbyte <=0 )
{
dcrit << myname << "(initItem): Unknown nbyte='' for "
<< it.getProp("name")
<< endl;
return false;
}
else if( p.nbyte > 2 )
{
dcrit << myname << "(initItem): BAD nbyte='" << p.nbyte << "' for "
<< it.getProp("name")
<< ". Must be [1,2]."
<< endl;
return false;
}
}
p.vtype = v; p.vtype = v;
p.wnum = 0; p.wnum = 0;
for( auto i=0; i<VTypes::wsize(p.vtype); i++ ) for( auto i=0; i<VTypes::wsize(p.vtype); i++ )
...@@ -1207,12 +1227,10 @@ ModbusRTU::mbErrCode MBSlave::real_write_it( IOMap::iterator& it, ModbusRTU::Mod ...@@ -1207,12 +1227,10 @@ ModbusRTU::mbErrCode MBSlave::real_write_it( IOMap::iterator& it, ModbusRTU::Mod
delete[] d; delete[] d;
IOBase::processingFasAI( p, (float)f4, shm, force ); IOBase::processingFasAI( p, (float)f4, shm, force );
} }
/*
else if( p->vtype == VTypes::vtByte ) else if( p->vtype == VTypes::vtByte )
{ {
VTypes::Byte b(r->mbval); VTypes::Byte b(mbval);
IOBase::processingAsAI( p, b.raw.b[p->nbyte-1], shm, force ); IOBase::processingAsAI( p, b.raw.b[p->nbyte-1], shm, force );
return;
} }
/* /*
if( p->stype == UniversalIO::DI || if( p->stype == UniversalIO::DI ||
...@@ -1227,7 +1245,6 @@ ModbusRTU::mbErrCode MBSlave::real_write_it( IOMap::iterator& it, ModbusRTU::Mod ...@@ -1227,7 +1245,6 @@ ModbusRTU::mbErrCode MBSlave::real_write_it( IOMap::iterator& it, ModbusRTU::Mod
IOBase::processingAsAI( p, val, shm, force ); IOBase::processingAsAI( p, val, shm, force );
} }
*/ */
i++;
pingOK = true; pingOK = true;
return ModbusRTU::erNoError; return ModbusRTU::erNoError;
} }
......
...@@ -50,6 +50,7 @@ class MBSlave: ...@@ -50,6 +50,7 @@ class MBSlave:
AccessMode amode; AccessMode amode;
VTypes::VType vtype; /*!< type of value */ VTypes::VType vtype; /*!< type of value */
int wnum; /*!< номер слова (для типов с размеров больше 2х байт */ int wnum; /*!< номер слова (для типов с размеров больше 2х байт */
int nbyte; /*!< номер байта, который надо "сохранить" из "пришедщего в запросе" слова. [1-2] */
bool rawdata; /*!< флаг, что в SM просто сохраняются 4-байта (актуально для типа F4)*/ bool rawdata; /*!< флаг, что в SM просто сохраняются 4-байта (актуально для типа F4)*/
IOProperty(): IOProperty():
...@@ -57,6 +58,7 @@ class MBSlave: ...@@ -57,6 +58,7 @@ class MBSlave:
amode(amRW), amode(amRW),
vtype(VTypes::vtUnknown), vtype(VTypes::vtUnknown),
wnum(0), wnum(0),
nbyte(0),
rawdata(false) rawdata(false)
{} {}
......
...@@ -140,7 +140,7 @@ ...@@ -140,7 +140,7 @@
<item default="4294967295" id="2003" mbs="1" mbreg="104" iotype="AI" vtype="U2" name="TestVtype3" textname="Тестовый регистр для проверки vtype"/> <item default="4294967295" id="2003" mbs="1" mbreg="104" iotype="AI" vtype="U2" name="TestVtype3" textname="Тестовый регистр для проверки vtype"/>
<item default="4294967295" id="2004" mbs="1" mbreg="106" iotype="AI" vtype="U2r" name="TestVtype4" textname="Тестовый регистр для проверки vtype"/> <item default="4294967295" id="2004" mbs="1" mbreg="106" iotype="AI" vtype="U2r" name="TestVtype4" textname="Тестовый регистр для проверки vtype"/>
<item default="200" id="2005" mbs="1" mbreg="108" iotype="AI" vtype="byte" nbyte="1" name="TestVtype5" textname="Тестовый регистр для проверки vtype"/> <item default="200" id="2005" mbs="1" mbreg="108" iotype="AI" vtype="byte" nbyte="1" name="TestVtype5" textname="Тестовый регистр для проверки vtype"/>
<item default="200" id="2006" mbs="1" mbreg="108" iotype="AI" vtype="byte" nbyte="2" name="TestVtype6" textname="Тестовый регистр для проверки vtype"/> <item default="200" id="2006" mbs="1" mbreg="109" iotype="AI" vtype="byte" nbyte="2" name="TestVtype6" textname="Тестовый регистр для проверки vtype"/>
<item id="2007" default="250" precision="2" mbs="1" mbreg="110" iotype="AI" vtype="F2" name="TestVtype7" textname="Тестовый регистр для проверки vtype"/> <item id="2007" default="250" precision="2" mbs="1" mbreg="110" iotype="AI" vtype="F2" name="TestVtype7" textname="Тестовый регистр для проверки vtype"/>
<item id="2008" default="250" precision="2" mbs="1" mbreg="112" iotype="AI" vtype="F2r" name="TestVtype8" textname="Тестовый регистр для проверки vtype"/> <item id="2008" default="250" precision="2" mbs="1" mbreg="112" iotype="AI" vtype="F2r" name="TestVtype8" textname="Тестовый регистр для проверки vtype"/>
<item id="2009" default="250000" precision="5" mbs="1" mbreg="114" iotype="AI" vtype="F4" name="TestVtype9" textname="Тестовый регистр для проверки vtype"/> <item id="2009" default="250000" precision="5" mbs="1" mbreg="114" iotype="AI" vtype="F4" name="TestVtype9" textname="Тестовый регистр для проверки vtype"/>
......
...@@ -574,6 +574,38 @@ TEST_CASE("Read(0x03,0x04): vtypes..","[modbus][mbslave][mbtcpslave]") ...@@ -574,6 +574,38 @@ TEST_CASE("Read(0x03,0x04): vtypes..","[modbus][mbslave][mbtcpslave]")
REQUIRE( (float)f4 == 2.5 ); REQUIRE( (float)f4 == 2.5 );
} }
} }
SECTION("Test: read vtype 'Byte N1'")
{
ModbusRTU::ModbusData tREG = 108;
SECTION("Test: read03")
{
ModbusRTU::ReadOutputRetMessage ret = mb->read03(slaveaddr,tREG,Byte::wsize());
Byte b(ret.data[0]);
REQUIRE( (unsigned short)b == 200 );
}
SECTION("Test: read04")
{
ModbusRTU::ReadInputRetMessage ret = mb->read04(slaveaddr,tREG,Byte::wsize());
Byte b(ret.data[0]);
REQUIRE( (unsigned short)b == 200 );
}
}
SECTION("Test: read vtype 'Byte N2'")
{
ModbusRTU::ModbusData tREG = 109;
SECTION("Test: read03")
{
ModbusRTU::ReadOutputRetMessage ret = mb->read03(slaveaddr,tREG,Byte::wsize());
Byte b(ret.data[0]);
REQUIRE( (unsigned short)b == 200 );
}
SECTION("Test: read04")
{
ModbusRTU::ReadInputRetMessage ret = mb->read04(slaveaddr,tREG,Byte::wsize());
Byte b(ret.data[0]);
REQUIRE( (unsigned short)b == 200 );
}
}
} }
// ------------------------------------------------------------- // -------------------------------------------------------------
...@@ -716,6 +748,32 @@ static void test_write10_F4prec( const float& val ) ...@@ -716,6 +748,32 @@ static void test_write10_F4prec( const float& val )
REQUIRE( fval == val ); REQUIRE( fval == val );
} }
static void test_write10_byte1( unsigned char val )
{
using namespace VTypes;
ModbusRTU::ModbusData tREG = 108;
ModbusRTU::WriteOutputMessage msg(slaveaddr,tREG);
Byte tmp(val,0);
msg.addData( (unsigned short)tmp );
ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg);
REQUIRE( ret.start == tREG );
REQUIRE( ret.quant == Byte::wsize() );
REQUIRE( ui->getValue(2005) == (long)val );
}
static void test_write10_byte2( unsigned char val )
{
using namespace VTypes;
ModbusRTU::ModbusData tREG = 109;
ModbusRTU::WriteOutputMessage msg(slaveaddr,tREG);
Byte tmp(0,val);
msg.addData( (unsigned short)tmp );
ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg);
REQUIRE( ret.start == tREG );
REQUIRE( ret.quant == Byte::wsize() );
REQUIRE( ui->getValue(2006) == (long)val );
}
TEST_CASE("Write(0x10): vtypes..","[modbus][mbslave][mbtcpslave]") TEST_CASE("Write(0x10): vtypes..","[modbus][mbslave][mbtcpslave]")
{ {
...@@ -770,6 +828,22 @@ TEST_CASE("Write(0x10): vtypes..","[modbus][mbslave][mbtcpslave]") ...@@ -770,6 +828,22 @@ TEST_CASE("Write(0x10): vtypes..","[modbus][mbslave][mbtcpslave]")
test_write10_F4prec(0); test_write10_F4prec(0);
test_write10_F4prec(-15.00001); test_write10_F4prec(-15.00001);
} }
SECTION("Test: write vtype 'Byte N1'")
{
test_write10_byte1(numeric_limits<unsigned char>::max());
test_write10_byte1(0);
test_write10_byte1(numeric_limits<unsigned char>::min());
test_write10_byte1(numeric_limits<char>::max());
test_write10_byte1(numeric_limits<char>::min());
}
SECTION("Test: write vtype 'Byte N2'")
{
test_write10_byte2(numeric_limits<unsigned char>::max());
test_write10_byte2(0);
test_write10_byte2(numeric_limits<unsigned char>::min());
test_write10_byte2(numeric_limits<char>::max());
test_write10_byte2(numeric_limits<char>::min());
}
} }
#if 0 #if 0
...@@ -863,4 +937,4 @@ TEST_CASE("access mode","[modbus][mbslvae][mbtcpslave]") ...@@ -863,4 +937,4 @@ TEST_CASE("access mode","[modbus][mbslvae][mbtcpslave]")
ModbusRTU::ReadInputRetMessage rret = mb->read04(slaveaddr,tREG,1); ModbusRTU::ReadInputRetMessage rret = mb->read04(slaveaddr,tREG,1);
REQUIRE( rret.data[0] == 555 ); REQUIRE( rret.data[0] == 555 );
} }
} }
\ No newline at end of file
...@@ -168,6 +168,7 @@ namespace VTypes ...@@ -168,6 +168,7 @@ namespace VTypes
static VType type(){ return vtByte; } static VType type(){ return vtByte; }
// ------------------------------------------ // ------------------------------------------
operator long(){ return lroundf(raw.w); } operator long(){ return lroundf(raw.w); }
operator unsigned short(){ return raw.w; }
unsigned char operator[]( const int i ){ return raw.b[i]; } unsigned char operator[]( const int i ){ return raw.b[i]; }
......
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