Commit ad03b191 authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusSlave): реализовал поддержку nbit для функци записи..(0x06,0x10,..)

parent 281ac286
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
Name: libuniset2 Name: libuniset2
Version: 2.0 Version: 2.0
Release: alt29 Release: alt30
Summary: UniSet - library for building distributed industrial control systems Summary: UniSet - library for building distributed industrial control systems
...@@ -409,6 +409,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -409,6 +409,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# .. # ..
%changelog %changelog
* Fri May 08 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt30
- ModbusSlave: added support nbit='' for 0x06 and 0x10 function (setbug #7337)
* Tue May 05 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt29 * Tue May 05 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt29
- SM: add reserv mechanism for initializing (setbug #7289) - SM: add reserv mechanism for initializing (setbug #7289)
- SM: fixed bug in 'heartbeat' - SM: fixed bug in 'heartbeat'
......
...@@ -950,6 +950,7 @@ bool MBSlave::initItem( UniXML::iterator& it ) ...@@ -950,6 +950,7 @@ bool MBSlave::initItem( UniXML::iterator& it )
} }
i->second.bitreg->bvec[nbit] = std::move(p); i->second.bitreg->bvec[nbit] = std::move(p);
dinfo << myname << "(initItem): add new bit: " << i->second.bitreg.get() << endl;
return true; return true;
} }
else else
...@@ -1221,10 +1222,9 @@ ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleO ...@@ -1221,10 +1222,9 @@ ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleO
ModbusRTU::mbErrCode MBSlave::much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, ModbusRTU::mbErrCode MBSlave::much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat,
int count ) int count )
{ {
dinfo << myname << "(much_real_write): read mbID=" dinfo << myname << "(much_real_write): write mbID="
<< ModbusRTU::dat2str(reg) << "(" << (int)reg << ")" << " count=" << count << endl; << ModbusRTU::dat2str(reg) << "(" << (int)reg << ")" << " count=" << count << endl;
int i = 0; int i = 0;
auto it = iomap.end(); auto it = iomap.end();
...@@ -1280,12 +1280,45 @@ ModbusRTU::mbErrCode MBSlave::real_write_it( IOMap::iterator& it, ModbusRTU::Mod ...@@ -1280,12 +1280,45 @@ ModbusRTU::mbErrCode MBSlave::real_write_it( IOMap::iterator& it, ModbusRTU::Mod
if( it == iomap.end() ) if( it == iomap.end() )
return ModbusRTU::erBadDataAddress; return ModbusRTU::erBadDataAddress;
ModbusRTU::ModbusData mbval = dat[i++]; IOProperty* p(&it->second);
try if( p->bitreg )
return real_bitreg_write_it(p->bitreg, dat[i++]);
return real_write_prop(p,dat,i,count);
}
// -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::real_bitreg_write_it( std::shared_ptr<BitRegProperty>& bp, const ModbusRTU::ModbusData val )
{
dinfo << myname << "(real_bitreg_write_it): write mbID="
<< ModbusRTU::dat2str(bp->mbreg) << "(" << (int)bp->mbreg << ") val=" << val << endl;
ModbusRTU::DataBits16 d(val);
for( int i = 0; i < ModbusRTU::BitsPerData; i++ )
{ {
IOProperty* p(&it->second); IOProperty* p(&(bp->bvec[i]));
if( p->si.id == DefaultObjectId )
continue;
ModbusRTU::ModbusData dat[]={d[i]};
dinfo << myname << "(real_bitreg_write_it): set " << ModbusRTU::dat2str(bp->mbreg) << "(" << (int)bp->mbreg << ")"
<< " bit[" << i << "]=" << (int)dat[0] << " sid=" << p->si.id << endl;
int k=0;
real_write_prop(p,dat,k,1);
}
return ModbusRTU::erNoError;
}
// -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusData* dat, int& i, int count )
{
ModbusRTU::ModbusData mbval = dat[i++];
try
{
if( p->amode == MBSlave::amRO ) if( p->amode == MBSlave::amRO )
return ModbusRTU::erBadDataAddress; return ModbusRTU::erBadDataAddress;
......
...@@ -449,6 +449,8 @@ class MBSlave: ...@@ -449,6 +449,8 @@ class MBSlave:
ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData* dat, int& i, int count ); ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData* dat, int& i, int count );
ModbusRTU::mbErrCode real_bitreg_write_it( std::shared_ptr<BitRegProperty>& bp, const ModbusRTU::ModbusData val );
ModbusRTU::mbErrCode real_write_prop( IOProperty* p, ModbusRTU::ModbusData* dat, int& i, int count );
MBSlave(); MBSlave();
bool initPause; bool initPause;
......
...@@ -153,10 +153,18 @@ ...@@ -153,10 +153,18 @@
<item id="2015" default="2222" accessmode="wo" mbs="1" mbreg="125" iotype="AI" name="TestAccessMode2" textname="Тестовый регистр для проверки access mode"/> <item id="2015" default="2222" accessmode="wo" mbs="1" mbreg="125" iotype="AI" name="TestAccessMode2" textname="Тестовый регистр для проверки access mode"/>
<item id="2016" default="1000" accessmode="rw" mbs="1" mbreg="126" iotype="AI" name="TestAccessMode3" textname="Тестовый регистр для проверки access mode"/> <item id="2016" default="1000" accessmode="rw" mbs="1" mbreg="126" iotype="AI" name="TestAccessMode3" textname="Тестовый регистр для проверки access mode"/>
<!-- nbit test --> <!-- nbit read test -->
<item id="2017" default="1" mbs="1" mbreg="127" nbit="0" iotype="AI" name="Test nbit 0" textname="Тестовый регистр для проверки nbit"/> <item id="2017" default="1" mbs="1" mbreg="127" nbit="0" iotype="AI" name="Test read nbit 0" textname="Тестовый регистр для проверки чтения nbit"/>
<item id="2018" default="1" mbs="1" mbreg="127" nbit="1" iotype="DI" name="Test nbit 1" textname="Тестовый регистр для проверки nbit"/> <item id="2018" default="1" mbs="1" mbreg="127" nbit="1" iotype="DI" name="Test read nbit 1" textname="Тестовый регистр для проверки чтения nbit"/>
<item id="2019" default="1" mbs="1" mbreg="127" nbit="5" iotype="AI" name="Test nbit 5" textname="Тестовый регистр для проверки nbit"/> <item id="2019" default="1" mbs="1" mbreg="127" nbit="5" iotype="AI" name="Test read nbit 5" textname="Тестовый регистр для проверки чтения nbit"/>
<!-- nbit write test -->
<item id="2020" mbs="1" mbreg="128" nbit="0" iotype="AI" name="Test write nbit 0" textname="Тестовый регистр для проверки записи nbit"/>
<item id="2021" mbs="1" mbreg="128" nbit="1" iotype="DI" name="Test write nbit 1" textname="Тестовый регистр для проверки записи nbit"/>
<item id="2022" mbs="1" mbreg="128" nbit="5" iotype="AI" name="Test write nbit 5" textname="Тестовый регистр для проверки записи nbit"/>
<item id="2023" mbs="1" mbreg="129" nbit="0" iotype="AI" name="Test write nbit 0 (reg2)" textname="Тестовый регистр для проверки записи nbit (reg 2)"/>
<item id="2024" mbs="1" mbreg="129" nbit="1" iotype="DI" name="Test write nbit 1 (reg2)" textname="Тестовый регистр для проверки записи nbit (reg 2)"/>
<item id="2025" mbs="1" mbreg="129" nbit="5" iotype="AI" name="Test write nbit 5 (reg2)" textname="Тестовый регистр для проверки записи nbit (reg 2)"/>
<item id="10000" iotype="DI" name="TestMode_S" textname="Тестовый датчик"/> <item id="10000" iotype="DI" name="TestMode_S" textname="Тестовый датчик"/>
......
...@@ -940,7 +940,7 @@ TEST_CASE("access mode", "[modbus][mbslvae][mbtcpslave]") ...@@ -940,7 +940,7 @@ TEST_CASE("access mode", "[modbus][mbslvae][mbtcpslave]")
} }
} }
// ------------------------------------------------------------- // -------------------------------------------------------------
TEST_CASE("Read(0x03,0x04): nbit", "[modbus][mbslave][mbtcpslave][nbit]") TEST_CASE("Read(0x03,0x04): nbit", "[modbus][mbslave][mbtcpslave][readnbit]")
{ {
using namespace VTypes; using namespace VTypes;
InitTest(); InitTest();
...@@ -968,4 +968,66 @@ TEST_CASE("Read(0x03,0x04): nbit", "[modbus][mbslave][mbtcpslave][nbit]") ...@@ -968,4 +968,66 @@ TEST_CASE("Read(0x03,0x04): nbit", "[modbus][mbslave][mbtcpslave][nbit]")
} }
// ------------------------------------------------------------- // -------------------------------------------------------------
TEST_CASE("Write(0x06,0x10): nbit", "[modbus][mbslave][mbtcpslave][writenbit]")
{
using namespace VTypes;
InitTest();
SECTION("Test: read nbit..")
{
ModbusRTU::ModbusData tREG = 128;
SECTION("Test: write06")
{
ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(slaveaddr, tREG,3);
REQUIRE( ret.start == tREG );
REQUIRE( ret.data == 3 );
REQUIRE( ui->getValue(2020) == 1 );
REQUIRE( ui->getValue(2021) == 1 );
REQUIRE( ui->getValue(2022) == 0 );
ret = mb->write06(slaveaddr, tREG,0);
REQUIRE( ret.start == tREG );
REQUIRE( ret.data == 0 );
REQUIRE( ui->getValue(2020) == 0 );
REQUIRE( ui->getValue(2021) == 0 );
REQUIRE( ui->getValue(2022) == 0 );
}
SECTION("Test: write10")
{
ModbusRTU::WriteOutputMessage msg(slaveaddr, tREG);
msg.addData(3);
msg.addData(3);
ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg);
REQUIRE( ret.start == tREG );
REQUIRE( ret.quant == 2 );
REQUIRE( ui->getValue(2020) == 1 );
REQUIRE( ui->getValue(2021) == 1 );
REQUIRE( ui->getValue(2022) == 0 );
REQUIRE( ui->getValue(2023) == 1 );
REQUIRE( ui->getValue(2024) == 1 );
REQUIRE( ui->getValue(2025) == 0 );
ModbusRTU::WriteOutputMessage msg2(slaveaddr, tREG);
msg2.addData(0);
msg2.addData(0);
ModbusRTU::WriteOutputRetMessage ret2 = mb->write10(msg2);
REQUIRE( ret2.start == tREG );
REQUIRE( ret2.quant == 2 );
REQUIRE( ui->getValue(2020) == 0 );
REQUIRE( ui->getValue(2021) == 0 );
REQUIRE( ui->getValue(2022) == 0 );
REQUIRE( ui->getValue(2023) == 0 );
REQUIRE( ui->getValue(2024) == 0 );
REQUIRE( ui->getValue(2025) == 0 );
}
}
}
// -------------------------------------------------------------
/*! \todo Доделать тесты на считывание с разными prop_prefix.. */ /*! \todo Доделать тесты на считывание с разными prop_prefix.. */
...@@ -12,5 +12,4 @@ cd - ...@@ -12,5 +12,4 @@ cd -
--mbs-name MBSlave1 --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 20048 --mbs-my-addr 0x01 \ --mbs-name MBSlave1 --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 20048 --mbs-my-addr 0x01 \
--mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 \ --mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 \
--mbs-filter-field mbs --mbs-filter-value 1 --mbs-filter-field mbs --mbs-filter-value 1
#--dlog-add-levels any
# --dlog-add-levels any
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