Commit bf45b890 authored by Pavel Vainerman's avatar Pavel Vainerman

(MBSlave):

- дореализовал обработку функции 0x01(readCoilStatus) - сделал обработку полей nbit (для функций 0x03,0x04) - различные небольшие правки
parent 7641f93c
......@@ -12,7 +12,7 @@
Name: libuniset2
Version: 2.0
Release: alt25
Release: alt26
Summary: UniSet - library for building distributed industrial control systems
......@@ -409,6 +409,11 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# ..
%changelog
* Thu Apr 09 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt26
- (ModbusSlave): added support nbit
- (ModbusSlave): added support 0x01 (readCoilStatus) function
- (ModbusSlave): minor fixes
* Tue Apr 07 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt25
- fixed bug in 'MBSlave' (thank`s Alexandr Hanadeev)
- add --xxx-set-prop-prefix for MBSlave
......
......@@ -171,7 +171,7 @@ void MBExchange::help_print( int argc, const char* const* argv )
{
cout << "--prefix-name name - ObjectId (имя) процесса. По умолчанию: MBExchange1" << endl;
cout << "--prefix-confnode name - Настроечная секция в конф. файле <name>. " << endl;
cout << "--prefix-polltime msec - Пауза между опросами. По умолчанию 200 мсек." << endl;
cout << "--prefix-polltime msec - Пауза между опросами. По умолчанию 100 мсек." << endl;
cout << "--prefix-recv-timeout msec - Таймаут на приём одного сообщения" << endl;
cout << "--prefix-timeout msec - Таймаут для определения отсутствия соединения" << endl;
cout << "--prefix-reopen-timeout msec - Таймаут для 'переоткрытия соединения' при отсутсвия соединения msec милисекунд. По умолчанию 10 сек." << endl;
......
......@@ -278,6 +278,8 @@ class MBSlave:
amWO
};
struct BitRegProperty;
struct IOProperty:
public IOBase
{
......@@ -287,6 +289,7 @@ class MBSlave:
int wnum; /*!< номер слова (для типов с размеров больше 2х байт */
int nbyte; /*!< номер байта, который надо "сохранить" из "пришедщего в запросе" слова. [1-2] */
bool rawdata; /*!< флаг, что в SM просто сохраняются 4-байта (актуально для типа F4)*/
std::shared_ptr<BitRegProperty> bitreg; /*!< указатель, как признак является ли данный регистр "сборным" из битовых */
IOProperty():
mbreg(0),
......@@ -300,6 +303,23 @@ class MBSlave:
friend std::ostream& operator<<( std::ostream& os, IOProperty& p );
};
struct BitRegProperty
{
typedef std::vector<IOProperty> BitSensorMap;
ModbusRTU::ModbusData mbreg; /*!< к какому регистру относятся биты */
BitSensorMap bvec;
BitRegProperty():mbreg(0),bvec(ModbusRTU::BitsPerData){}
/*! проверка привязан ли данный датчик, к какому-либо биту в этом слове */
bool check( const IOController_i::SensorInfo& si );
friend std::ostream& operator<<( std::ostream& os, BitRegProperty& p );
friend std::ostream& operator<<( std::ostream& os, BitRegProperty* p );
};
inline long getAskCount(){ return askCount; }
protected:
......@@ -403,6 +423,10 @@ class MBSlave:
ModbusRTU::mbErrCode much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
ModbusRTU::mbErrCode real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
ModbusRTU::mbErrCode real_bitreg_read_it( std::shared_ptr<BitRegProperty>& bp, ModbusRTU::ModbusData& val );
ModbusRTU::mbErrCode real_read_prop( IOProperty* p, ModbusRTU::ModbusData& val );
ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData* dat, int& i, int count );
MBSlave();
......
......@@ -153,6 +153,11 @@
<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"/>
<!-- nbit test -->
<item id="2017" default="1" mbs="1" mbreg="127" nbit="0" iotype="AI" name="Test 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="2019" default="1" mbs="1" mbreg="127" nbit="5" iotype="AI" name="Test nbit 5" textname="Тестовый регистр для проверки nbit"/>
<item id="10000" iotype="DI" name="TestMode_S" textname="Тестовый датчик"/>
</sensors>
......
......@@ -881,7 +881,7 @@ TEST_CASE("(0x66): file transfer")
}
#endif
// -------------------------------------------------------------
TEST_CASE("access mode","[modbus][mbslvae][mbtcpslave]")
{
SECTION("test 'RO' register")
......@@ -943,5 +943,33 @@ TEST_CASE("access mode","[modbus][mbslvae][mbtcpslave]")
REQUIRE( rret.data[0] == 555 );
}
}
// -------------------------------------------------------------
TEST_CASE("Read(0x03,0x04): nbit","[modbus][mbslave][mbtcpslave][nbit]")
{
using namespace VTypes;
InitTest();
SECTION("Test: read nbit..")
{
ModbusRTU::ModbusData tREG = 127;
SECTION("Test: read03")
{
ModbusRTU::ReadOutputRetMessage ret = mb->read03(slaveaddr,tREG,1);
ModbusRTU::DataBits16 d(ret.data[0]);
REQUIRE( d[0] == 1 );
REQUIRE( d[1] == 1 );
REQUIRE( d[5] == 1 );
}
SECTION("Test: read04")
{
ModbusRTU::ReadInputRetMessage ret = mb->read04(slaveaddr,tREG,1);
ModbusRTU::DataBits16 d(ret.data[0]);
REQUIRE( d[0] == 1 );
REQUIRE( d[1] == 1 );
REQUIRE( d[5] == 1 );
}
}
}
// -------------------------------------------------------------
/*! \todo Доделать тесты на считывание с разными prop_prefix.. */
......@@ -11,4 +11,6 @@ cd -
./uniset2-start.sh -f ./tests-with-sm $* -- --confile mbslave-test-configure.xml --e-startup-pause 10 \
--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-filter-field mbs --mbs-filter-value 1
--mbs-filter-field mbs --mbs-filter-value 1
# --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