Commit 207347d9 authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusMaster): добавил возможность задавать mbtype и mbaddr по умолчанию

(--prefix-default-mbtype.. --prefix-default-mbaddr), для оптимизации настройки обмена в configure.xml (ModbusMaster): написал тесты почти всех основных функций, заложил основу для оставшихся.
parent 12f6058d
......@@ -84,6 +84,9 @@ pollActivated(false)
force = conf->getArgInt("--" + prefix + "-force",it.getProp("force"));
force_out = conf->getArgInt("--" + prefix + "-force-out",it.getProp("force_out"));
defaultMBtype = conf->getArg2Param("--" + prefix + "-default-mbtype",it.getProp("default_mbtype"),"rtu");
defaultMBaddr = conf->getArg2Param("--" + prefix + "-default-mbaddr",it.getProp("default_mbaddr"),"");
// ********** HEARTBEAT *************
string heart = conf->getArgParam("--" + prefix + "-heartbeat-id",it.getProp("heartbeat_id"));
if( !heart.empty() )
......@@ -158,6 +161,8 @@ void MBExchange::help_print( int argc, const char* const* argv )
cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl;
cout << "--prefix-exchange-mode-id - Идентификатор (AI) датчика, позволяющего управлять работой процесса" << endl;
cout << "--prefix-set-prop-prefix val - Использовать для свойств указанный или пустой префикс." << endl;
cout << "--prefix-default-mbtype [rtu|rtu188|mtr] - У датчиков которых не задан 'mbtype' использовать данный. По умолчанию: 'rtu'" << endl;
cout << "--prefix-default-mbadd addr - У датчиков которых не задан 'mbaddr' использовать данный. По умолчанию: ''" << endl;
}
// -----------------------------------------------------------------------------
MBExchange::~MBExchange()
......@@ -1783,7 +1788,10 @@ MBExchange::RTUDevice* MBExchange::addDev( RTUDeviceMap& mp, ModbusRTU::ModbusAd
auto it = mp.find(a);
if( it != mp.end() )
{
DeviceType dtype = getDeviceType(xmlit.getProp(prop_prefix + "mbtype"));
string s_dtype(xmlit.getProp(prop_prefix + "mbtype"));
if( s_dtype.empty() )
s_dtype=defaultMBtype;
DeviceType dtype = getDeviceType(s_dtype);
if( it->second->dtype != dtype )
{
dcrit << myname << "(addDev): OTHER mbtype=" << dtype << " for " << xmlit.getProp("name")
......@@ -2016,6 +2024,9 @@ bool MBExchange::initRegInfo( RegInfo* r, UniXML::iterator& it, MBExchange::RTU
bool MBExchange::initRTUDevice( RTUDevice* d, UniXML::iterator& it )
{
string mbtype(IOBase::initProp(it,"mbtype",prop_prefix,false));
if(mbtype.empty())
mbtype = defaultMBtype;
d->dtype = getDeviceType(mbtype);
if( d->dtype == dtUnknown )
......@@ -2028,6 +2039,9 @@ bool MBExchange::initRTUDevice( RTUDevice* d, UniXML::iterator& it )
string addr( IOBase::initProp(it,"mbaddr",prop_prefix,false) );
if( addr.empty() )
addr = defaultMBaddr;
if( addr.empty() )
{
dcrit << myname << "(initRTUDevice): Unknown mbaddr for " << it.getProp("name") << endl;
return false;
......@@ -2052,6 +2066,9 @@ bool MBExchange::initItem( UniXML::iterator& it )
string addr( IOBase::initProp(it,"mbaddr",prop_prefix,false) );
if( addr.empty() )
addr = defaultMBaddr;
if( addr.empty() )
{
dcrit << myname << "(initItem): Unknown mbaddr(" << IOBase::initProp(it,"mbaddr",prop_prefix,false) << ")='" << addr << "' for " << it.getProp("name") << endl;
return false;
......
......@@ -342,6 +342,9 @@ class MBExchange:
typedef std::list<IOBase> ThresholdList;
ThresholdList thrlist;
std::string defaultMBtype;
std::string defaultMBaddr;
private:
MBExchange();
......
......@@ -2,7 +2,7 @@ if HAVE_TESTS
noinst_PROGRAMS = tests-with-sm
tests_with_sm_SOURCES = tests_with_sm.cc test_mbtcpmaster.cc test_mbtcpmultimaster.cc
tests_with_sm_SOURCES = tests_with_sm.cc test_mbtcpmaster.cc test_mbtcpmultimaster.cc MBTCPTestServer.cc
tests_with_sm_LDADD = $(top_builddir)/lib/libUniSet2.la $(top_builddir)/extensions/lib/libUniSet2Extensions.la \
$(top_builddir)/extensions/ModbusMaster/libUniSet2MBTCPMaster.la \
$(top_builddir)/extensions/SharedMemory/libUniSet2SharedMemory.la \
......
......@@ -26,64 +26,12 @@
<dlog name="dlog"/>
<settings>
<SharedMemory name="SharedMemory" shmID="SharedMemory">
<History savetime="200">
<item filter="a1" fuse_id="AlarmFuse1_S" fuse_invert="1" id="1" size="30"/>
<item filter="a2" fuse_id="AlarmFuse2_AS" fuse_value="2" id="2" size="30"/>
</History>
</SharedMemory>
<MBSlave1 addr="0x31" aftersend-pause="0" device="/dev/ttyS0" name="MBSlave1" poll_time="200" reply_timeout="60" speed="9600">
<filelist>
<!-- Список файлов разрешённых для передачи по modbus
directory - каталог где лежит файл. Можно не задавать
'ConfDir' - берётся из настроек (см. начало этого файла)
'DataDir' - берётся из настроек (см. начало этого файла)
'xxx' - прямое указание каталога
-->
<item directory="ConfDir" id="1" name="configure.xml"/>
<item directory="ConfDir" id="2" name="VERSION"/>
<item directory="/tmp/" id="3" name="configure.xml.gz"/>
<item directory="ConfDir" id="4" name="SERIAL"/>
</filelist>
<MEI>
<!-- ВНИМАНИЕ: должен заполняться в соответсвии со стандартом. ObjectID и DeviceID не случайны.. -->
<device id="0x01">
<object id="0" comm="VendorName">
<string value="etersoft"/>
</object>
<object id="1" comm="ProductCode">
<string value="uniset"/>
</object>
<object id="2" comm="MajorMinorRevision">
<string value="1.6"/>
</object>
</device>
<device id="0x02">
<object id="3" comm="VendorURL">
<string value="http://www.etersoft.ru"/>
</object>
<object id="4" comm="ProductName">
<string value="uniset"/>
</object>
<object id="5" comm="ModelName">
<string value="uniset:MBSlave"/>
</object>
<object id="6" comm="UserApplicationName">
<string value="MBSlave1"/>
</object>
</device>
<device id="0x03">
<object id="128" comm="private objects">
<string id="129" value="etersoft"/>
<string id="130" value="uniset"/>
<string id="131" value="1.6"/>
<string id="132" value="http://www.etersoft.ru"/>
<string id="133" value="MBSlave1"/>
</object>
</device>
</MEI>
</MBSlave1>
<SharedMemory name="SharedMemory" shmID="SharedMemory"/>
<MBTCPMaster1 name="MBTCPMaster1">
<DeviceList>
<item addr="0x01" invert="1" respondSensor="Slave_Not_Respond_S" timeout="1000"/>
</DeviceList>
</MBTCPMaster1>
</settings>
<ObjectsMap idfromfile="1">
<!--
......@@ -100,58 +48,54 @@
<!-- ************************ Датчики ********************** -->
<sensors name="Sensors">
<item default="1" id="1000" mbs="1" mbreg="1" iotype="DI" name="TestReadCoil1_S" textname="Тестовый регистр для ReadCoil"/>
<item default="1" id="1001" mbs="1" mbreg="2" iotype="DI" name="TestReadCoil2_S" textname="Тестовый регистр для ReadCoil"/>
<item id="1002" mbs="1" mbreg="3" iotype="DI" name="TestReadCoil3_S" textname="Тестовый регистр для ReadCoil"/>
<item default="10" id="1003" mbs="1" mbreg="10" iotype="AI" name="TestRead03_1" textname="Тестовый регистр для 0x03"/>
<item default="11" id="1004" mbs="1" mbreg="11" iotype="AI" name="TestRead03_2" textname="Тестовый регистр для 0x03"/>
<item default="-10" id="1005" mbs="1" mbreg="12" iotype="AI" name="TestRead03_3" textname="Тестовый регистр для 0x03"/>
<item default="-10000" id="1006" mbs="1" mbreg="13" iotype="AI" name="TestRead03_4" textname="Тестовый регистр для 0x03"/>
<item id="1007" mbs="1" mbreg="14" iotype="AI" name="TestRead05" textname="Тестовый регистр для 0x05"/>
<item id="1008" mbs="1" mbreg="15" iotype="AI" name="TestRead06" textname="Тестовый регистр для 0x06"/>
<item id="1009" mbs="1" mbreg="16" nbit="0" iotype="DI" name="TestForceCoil0_S" textname="Тестовый регистр для force coil"/>
<item id="1010" mbs="1" mbreg="16" nbit="1" iotype="DI" name="TestForceCoil1_S" textname="Тестовый регистр для force coil"/>
<item id="1011" mbs="1" mbreg="16" nbit="2" iotype="DI" name="TestForceCoil2_S" textname="Тестовый регистр для force coil"/>
<item id="1012" mbs="1" mbreg="16" nbit="3" iotype="DI" name="TestForceCoil3_S" textname="Тестовый регистр для force coil"/>
<item id="1013" mbs="1" mbreg="16" nbit="4" iotype="DI" name="TestForceCoil4_S" textname="Тестовый регистр для force coil"/>
<item id="1014" mbs="1" mbreg="16" nbit="5" iotype="DI" name="TestForceCoil5_S" textname="Тестовый регистр для force coil"/>
<item id="1015" mbs="1" mbreg="16" nbit="6" iotype="DI" name="TestForceCoil6_S" textname="Тестовый регистр для force coil"/>
<item id="1016" mbs="1" mbreg="16" nbit="7" iotype="DI" name="TestForceCoil7_S" textname="Тестовый регистр для force coil"/>
<item id="1017" mbs="1" mbreg="17" nbit="0" iotype="DI" name="TestForceCoil8_S" textname="Тестовый регистр для force coil"/>
<item id="1018" mbs="1" mbreg="17" nbit="1" iotype="DI" name="TestForceCoil9_S" textname="Тестовый регистр для force coil"/>
<item id="1019" mbs="1" mbreg="17" nbit="2" iotype="DI" name="TestForceCoil10_S" textname="Тестовый регистр для force coil"/>
<item id="1020" mbs="1" mbreg="17" nbit="3" iotype="DI" name="TestForceCoil11_S" textname="Тестовый регистр для force coil"/>
<item id="1021" mbs="1" mbreg="17" nbit="4" iotype="DI" name="TestForceCoil12_S" textname="Тестовый регистр для force coil"/>
<item id="1022" mbs="1" mbreg="17" nbit="5" iotype="DI" name="TestForceCoil13_S" textname="Тестовый регистр для force coil"/>
<item id="1023" mbs="1" mbreg="17" nbit="6" iotype="DI" name="TestForceCoil14_S" textname="Тестовый регистр для force coil"/>
<item id="1024" mbs="1" mbreg="17" nbit="7" iotype="DI" name="TestForceCoil15_S" textname="Тестовый регистр для force coil"/>
<item id="1025" mbs="1" mbreg="18" iotype="AI" name="TestWrite10_S" textname="Тестовый регистр для 0x10"/>
<item id="1026" mbs="1" mbreg="19" iotype="AI" name="TestWrite10_S" textname="Тестовый регистр для 0x10"/>
<item id="1027" mbs="1" mbreg="20" iotype="DI" name="TestWrite10_S" textname="Тестовый регистр для 0x10"/>
<item id="1028" iotype="DI" name="TestWrite10_S" textname="Тестовый регистр для 0x10 (несуществующий)"/>
<!-- vtypes test -->
<item default="-100000" id="2001" mbs="1" mbreg="100" iotype="AI" vtype="I2" name="TestVtype1" textname="Тестовый регистр для проверки vtype"/>
<item default="-100000" id="2002" mbs="1" mbreg="102" iotype="AI" vtype="I2r" name="TestVtype2" 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="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="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="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 default="-100" id="2011" mbs="1" mbreg="118" iotype="AI" vtype="signed" name="TestVtype11" textname="Тестовый регистр для проверки vtype"/>
<item default="65534" id="2012" mbs="1" mbreg="119" iotype="AI" vtype="unsigned" name="TestVtype12" textname="Тестовый регистр для проверки vtype"/>
<item id="2013" rawdata="1" mbs="1" mbreg="120" iotype="AI" vtype="F4" name="TestVtype9" textname="Тестовый регистр для проверки vtype"/>
<!-- access mode test -->
<item id="2014" default="1002" accessmode="ro" mbs="1" mbreg="124" iotype="AI" name="TestAccessMode1" 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="10" iotype="DI" name="Slave_Not_Respond_S" textname="Наличие связи со Slave"/>
<item id="1000" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="1" mbfunc="0x01" iotype="DI" name="TestReadCoil1_S" textname="Тестовый регистр для ReadCoil"/>
<item id="1001" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="2" mbfunc="0x01" iotype="DI" name="TestReadCoil2_S" textname="Тестовый регистр для ReadCoil"/>
<item id="1002" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="3" mbfunc="0x01" iotype="DI" name="TestReadCoil3_S" textname="Тестовый регистр для ReadCoil"/>
<item id="1040" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="4" mbfunc="0x02" iotype="DI" name="TestInputStatus1_S" textname="Тестовый регистр для InputStatus"/>
<item id="1041" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="5" mbfunc="0x02" iotype="DI" name="TestInputStatus2_S" textname="Тестовый регистр для InputStatus"/>
<item id="1042" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="6" mbfunc="0x02" iotype="DI" name="TestInputStatus3_S" textname="Тестовый регистр для InputStatus"/>
<item id="1003" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="10" mbfunc="0x03" iotype="AI" name="TestRead03_1" textname="Тестовый регистр для 0x03"/>
<!-- сдесь делаем 'дырку' в регистрах и проверяем, что всё-нормально читается.. -->
<item id="1004" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="12" mbfunc="0x03" iotype="AI" name="TestRead03_2" textname="Тестовый регистр для 0x03"/>
<item id="1005" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="13" mbfunc="0x03" iotype="AI" name="TestRead03_3" textname="Тестовый регистр для 0x03"/>
<item id="1006" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="14" mbfunc="0x03" iotype="AI" name="TestRead03_4" textname="Тестовый регистр для 0x03"/>
<item id="1007" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="15" mbfunc="0x03" vtype="unsigned" iotype="AI" name="TestRead03_5" textname="Тестовый регистр для 0x03"/>
<item id="1008" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="16" mbfunc="0x03" vtype="I2" iotype="AI" name="TestRead03_6" textname="Тестовый регистр для 0x03"/>
<item id="1009" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="18" mbfunc="0x03" vtype="U2" iotype="AI" name="TestRead03_7" textname="Тестовый регистр для 0x03"/>
<item id="1010" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="20" mbfunc="0x04" iotype="AI" name="TestRead04_1" textname="Тестовый регистр для 0x04"/>
<!-- сдесь делаем 'дырку' в регистрах и проверяем, что всё-нормально читается.. -->
<item id="1011" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="21" mbfunc="0x04" iotype="AI" name="TestRead04_2" textname="Тестовый регистр для 0x04"/>
<item id="1012" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="22" mbfunc="0x04" iotype="AI" name="TestRead04_3" textname="Тестовый регистр для 0x04"/>
<item id="1013" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="23" mbfunc="0x04" iotype="AI" name="TestRead04_4" textname="Тестовый регистр для 0x04"/>
<item id="1014" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="24" mbfunc="0x04" vtype="unsigned" iotype="AI" name="TestRead04_5" textname="Тестовый регистр для 0x04"/>
<item id="1015" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="25" mbfunc="0x04" vtype="I2" iotype="AI" name="TestRead04_6" textname="Тестовый регистр для 0x04"/>
<item id="1016" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="27" mbfunc="0x04" vtype="U2" iotype="AI" name="TestRead04_7" textname="Тестовый регистр для 0x04"/>
<item id="1017" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="29" mbfunc="0x05" iotype="DO" name="TestWrite05_1" textname="Тестовый регистр для 0x05"/>
<item id="1018" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="30" mbfunc="0x06" iotype="AO" name="TestWrite06_1" textname="Тестовый регистр для 0x06"/>
<item id="1019" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="31" mbfunc="0x10" iotype="AO" name="TestWrite10_1" textname="Тестовый регистр для 0x10"/>
<item id="1020" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="32" mbfunc="0x10" iotype="AO" name="TestWrite10_2" textname="Тестовый регистр для 0x10"/>
<!-- делаем дырку в регистрах, специально для проверки.. -->
<item id="1021" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="34" mbfunc="0x10" iotype="AO" name="TestWrite10_3" textname="Тестовый регистр для 0x10"/>
<item id="1022" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="35" mbfunc="0x10" iotype="AO" name="TestWrite10_4" textname="Тестовый регистр для 0x10"/>
<item id="1023" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="36" mbfunc="0x10" vtype="I2" iotype="AO" name="TestWrite10_5" textname="Тестовый регистр для 0x10"/>
<item id="1024" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="38" mbfunc="0x0F" iotype="DO" name="TestWrite0F_1" textname="Тестовый регистр для 0x0F"/>
<item id="1025" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="39" mbfunc="0x0F" iotype="DO" name="TestWrite0F_2" textname="Тестовый регистр для 0x0F"/>
<item id="1026" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="40" mbfunc="0x0F" iotype="DO" name="TestWrite0F_3" textname="Тестовый регистр для 0x0F"/>
<item id="10000" iotype="DI" name="TestMode_S" textname="Тестовый датчик"/>
......@@ -166,7 +110,7 @@
<!-- ******************* Идентификаторы объектов ***************** -->
<objects name="UniObjects">
<item id="6000" name="TestProc"/>
<item id="6004" name="MBSlave1"/>
<item id="6004" name="MBTCPMaster1"/>
</objects>
</ObjectsMap>
<messages idfromfile="1" name="messages"/>
......
#include <catch.hpp>
// -----------------------------------------------------------------------------
#include <time.h>
#include <memory>
#include <limits>
#include "UniSetTypes.h"
#include "MBTCPTestServer.h"
#include "MBTCPMultiMaster.h"
// -----------------------------------------------------------------------------
using namespace std;
......@@ -11,27 +13,314 @@ using namespace UniSetTypes;
static ModbusRTU::ModbusAddr slaveaddr = 0x01; // conf->getArgInt("--mbs-my-addr");
static int port = 20048; // conf->getArgInt("--mbs-inet-port");
static string addr("127.0.0.1"); // conf->getArgParam("--mbs-inet-addr");
static ObjectId slaveID = 6004; // conf->getObjectID( conf->getArgParam("--mbs-name"));
static ModbusTCPMaster* mb = nullptr;
static UInterface* ui = nullptr;
static ModbusRTU::ModbusAddr slaveADDR = 0x01;
static shared_ptr<MBTCPTestServer> mbs;
static shared_ptr<UInterface> ui;
static ObjectId mbID = 6004; // MBTCPMaster1
static int polltime=300; // conf->getArgInt("--mbtcp-polltime");
static ObjectId slaveNotRespond = 10; // Slave_Not_Respond_S
// -----------------------------------------------------------------------------
static void InitTest()
{
auto conf = uniset_conf();
CHECK( conf!=nullptr );
if( ui == nullptr )
if( !ui )
{
ui = new UInterface();
ui = make_shared<UInterface>();
// UI понадобиться для проверки записанных в SM значений.
CHECK( ui->getObjectIndex() != nullptr );
CHECK( ui->getConf() == conf );
CHECK( ui->waitReady(slaveID,5000) );
CHECK( ui->waitReady(slaveNotRespond,8000) );
}
if( !mbs )
{
mbs = make_shared<MBTCPTestServer>(slaveADDR,addr,port,false);
CHECK( mbs!= nullptr );
mbs->runThread();
for( int i=0; !mbs->isRunning() && i<10; i++ )
msleep(200);
CHECK( mbs->isRunning() );
msleep(2000);
CHECK( ui->getValue(slaveNotRespond) == 0 );
}
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x01 (read coil status)","[modbus][0x01][mbmaster][mbtcpmaster]")
{
InitTest();
CHECK( ui->isExist(mbID) );
mbs->setReply(65535);
msleep(polltime+100);
REQUIRE( ui->getValue(1000) == 1 );
REQUIRE( ui->getValue(1001) == 1 );
REQUIRE( ui->getValue(1002) == 1 );
TEST_CASE("MBTCPMaster","[modbus][mbmaster][mbtcpmaster]")
mbs->setReply(0);
msleep(polltime+100);
REQUIRE( ui->getValue(1000) == 0 );
REQUIRE( ui->getValue(1001) == 0 );
REQUIRE( ui->getValue(1002) == 0 );
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x02 (read input status)","[modbus][0x02][mbmaster][mbtcpmaster]")
{
FAIL("Tests for MBTCPMaster not yet");
InitTest();
CHECK( ui->isExist(mbID) );
mbs->setReply(65535);
msleep(polltime+100);
REQUIRE( ui->getValue(1040) == 1 );
REQUIRE( ui->getValue(1041) == 1 );
REQUIRE( ui->getValue(1042) == 1 );
mbs->setReply(0);
msleep(polltime+100);
REQUIRE( ui->getValue(1040) == 0 );
REQUIRE( ui->getValue(1041) == 0 );
REQUIRE( ui->getValue(1042) == 0 );
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x03 (read register outputs or memories or read word outputs or memories)","[modbus][0x03][mbmaster][mbtcpmaster]")
{
InitTest();
CHECK( ui->isExist(mbID) );
mbs->setReply(10);
msleep(polltime+100);
REQUIRE( ui->getValue(1003) == 10 );
REQUIRE( ui->getValue(1004) == 10 );
REQUIRE( ui->getValue(1005) == 10 );
REQUIRE( ui->getValue(1006) == 10 );
mbs->setReply(-10);
msleep(polltime+100);
REQUIRE( ui->getValue(1003) == -10 );
REQUIRE( ui->getValue(1004) == -10 );
REQUIRE( ui->getValue(1005) == -10 );
REQUIRE( ui->getValue(1006) == -10 );
mbs->setReply(0);
msleep(polltime+100);
REQUIRE( ui->getValue(1003) == 0 );
REQUIRE( ui->getValue(1004) == 0 );
REQUIRE( ui->getValue(1005) == 0 );
REQUIRE( ui->getValue(1006) == 0 );
mbs->setReply(65535);
msleep(polltime+100);
REQUIRE( ui->getValue(1003) == -1 );
REQUIRE( ui->getValue(1004) == -1 );
REQUIRE( ui->getValue(1005) == -1 );
REQUIRE( ui->getValue(1006) == -1 );
REQUIRE( ui->getValue(1007) == 65535 ); // unsigned
mbs->setReply(0xffff);
msleep(polltime+100);
REQUIRE( ui->getValue(1008) == 0xffffffff ); // I2
REQUIRE( ui->getValue(1009) == 0xffffffff ); // U2
mbs->setReply(0xff);
msleep(polltime+100);
REQUIRE( ui->getValue(1008) == 0x00ff00ff ); // I2
REQUIRE( ui->getValue(1009) == 0x00ff00ff ); // U2
// т.к. для VTypes есть отдельный тест, то смысла проверять отдельно типы нету.
// потому-что по протоколу приходит просто поток байт (регистров), а уже дальше проиходит преобразование
// при помощи vtype.. т.е. вроде как ModbusMaster уже не причём..
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x04 (read input registers or memories or read word outputs or memories)","[modbus][0x04][mbmaster][mbtcpmaster]")
{
InitTest();
CHECK( ui->isExist(mbID) );
mbs->setReply(10);
msleep(polltime+100);
REQUIRE( ui->getValue(1010) == 10 );
REQUIRE( ui->getValue(1011) == 10 );
REQUIRE( ui->getValue(1012) == 10 );
REQUIRE( ui->getValue(1013) == 10 );
mbs->setReply(-10);
msleep(polltime+100);
REQUIRE( ui->getValue(1010) == -10 );
REQUIRE( ui->getValue(1011) == -10 );
REQUIRE( ui->getValue(1012) == -10 );
REQUIRE( ui->getValue(1013) == -10 );
mbs->setReply(0);
msleep(polltime+100);
REQUIRE( ui->getValue(1010) == 0 );
REQUIRE( ui->getValue(1011) == 0 );
REQUIRE( ui->getValue(1012) == 0 );
REQUIRE( ui->getValue(1013) == 0 );
mbs->setReply(65535);
msleep(polltime+100);
REQUIRE( ui->getValue(1010) == -1 );
REQUIRE( ui->getValue(1011) == -1 );
REQUIRE( ui->getValue(1012) == -1 );
REQUIRE( ui->getValue(1013) == -1 );
REQUIRE( ui->getValue(1014) == 65535 ); // unsigned
mbs->setReply(0xffff);
msleep(polltime+100);
REQUIRE( ui->getValue(1015) == 0xffffffff ); // I2
REQUIRE( ui->getValue(1016) == 0xffffffff ); // U2
mbs->setReply(0xff);
msleep(polltime+100);
REQUIRE( ui->getValue(1015) == 0x00ff00ff ); // I2
REQUIRE( ui->getValue(1016) == 0x00ff00ff ); // U2
// т.к. для VTypes есть отдельный тест, то смысла проверять отдельно типы нету.
// потому-что по протоколу приходит просто поток байт (регистров), а уже дальше проиходит преобразование
// при помощи vtype.. т.е. вроде как ModbusMaster уже не причём..
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x05 (forces a single coil to either ON or OFF)","[modbus][0x05][mbmaster][mbtcpmaster]")
{
InitTest();
CHECK( ui->isExist(mbID) );
ui->setValue(1017,0);
REQUIRE( ui->getValue(1017) == 0 );
msleep(polltime+100);
CHECK_FALSE( mbs->getForceSingleCoilCmd() );
ui->setValue(1017,1);
REQUIRE( ui->getValue(1017) == 1 );
msleep(polltime+100);
CHECK( mbs->getForceSingleCoilCmd() );
ui->setValue(1017,0);
REQUIRE( ui->getValue(1017) == 0 );
msleep(polltime+100);
CHECK_FALSE( mbs->getForceSingleCoilCmd() );
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x06 (write register outputs or memories)","[modbus][0x06][mbmaster][mbtcpmaster]")
{
InitTest();
CHECK( ui->isExist(mbID) );
ui->setValue(1018,0);
REQUIRE( ui->getValue(1018) == 0 );
msleep(polltime+100);
REQUIRE( mbs->getLastWriteOutputSingleRegister() == 0 );
ui->setValue(1018,100);
REQUIRE( ui->getValue(1018) == 100 );
msleep(polltime+100);
REQUIRE( mbs->getLastWriteOutputSingleRegister() == 100 );
ui->setValue(1018,-100);
REQUIRE( ui->getValue(1018) == -100 );
msleep(polltime+100);
REQUIRE( mbs->getLastWriteOutputSingleRegister() == -100 );
ui->setValue(1018,0);
REQUIRE( ui->getValue(1018) == 0 );
msleep(polltime+100);
REQUIRE( mbs->getLastWriteOutputSingleRegister() == 0 );
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x0F (force multiple coils)","[modbus][0x0F][mbmaster][mbtcpmaster]")
{
InitTest();
// три бита..
{
ui->setValue(1024,0);
ui->setValue(1025,0);
ui->setValue(1026,0);
REQUIRE( ui->getValue(1024) == 0 );
REQUIRE( ui->getValue(1025) == 0 );
REQUIRE( ui->getValue(1026) == 0 );
msleep(polltime+100);
ModbusRTU::ForceCoilsMessage q = mbs->getLastForceCoilsQ();
REQUIRE( q.start == 38 );
REQUIRE( q.quant == 3 );
REQUIRE( q.data[0] == 0 );
}
{
ui->setValue(1025,1);
REQUIRE( ui->getValue(1025) == 1 );
msleep(polltime+100);
ModbusRTU::ForceCoilsMessage q = mbs->getLastForceCoilsQ();
REQUIRE( q.start == 38 );
REQUIRE( q.quant == 3 );
REQUIRE( q.data[0] == 2 );
}
{
ui->setValue(1024,1);
REQUIRE( ui->getValue(1024) == 1 );
msleep(polltime+100);
ModbusRTU::ForceCoilsMessage q = mbs->getLastForceCoilsQ();
REQUIRE( q.start == 38 );
REQUIRE( q.quant == 3 );
REQUIRE( q.data[0] == 3 );
}
{
ui->setValue(1024,0);
ui->setValue(1025,0);
ui->setValue(1026,0);
REQUIRE( ui->getValue(1024) == 0 );
REQUIRE( ui->getValue(1025) == 0 );
REQUIRE( ui->getValue(1026) == 0 );
msleep(polltime+100);
ModbusRTU::ForceCoilsMessage q = mbs->getLastForceCoilsQ();
REQUIRE( q.start == 38 );
REQUIRE( q.quant == 3 );
REQUIRE( q.data[0] == 0 );
}
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x10 (write register outputs or memories)","[modbus][0x10][mbmaster][mbtcpmaster]")
{
// InitTest();
FAIL("Test of '0x10'..not yet.. ");
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x14 (read file record","[modbus][0x14][mbmaster][mbtcpmaster]")
{
FAIL("Test of '0x14'..not yet.. ");
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x15 (write file record","[modbus][0x15][mbmaster][mbtcpmaster]")
{
FAIL("Test of '0x15'..not yet.. ");
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x2B (Modbus Encapsulated Interface","[modbus][0x2B][mbmaster][mbtcpmaster]")
{
FAIL("Test of '0x2B'..not yet.. ");
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x50 (set date and time","[modbus][0x50][mbmaster][mbtcpmaster]")
{
FAIL("Test of '0x50'..not yet.. ");
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x53 (call remote service","[modbus][0x53][mbmaster][mbtcpmaster]")
{
FAIL("Test of '0x53'..not yet.. ");
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x65 (read,write,delete alarm journal","[modbus][0x65][mbmaster][mbtcpmaster]")
{
FAIL("Test of '0x65'..not yet.. ");
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: 0x66 (file transfer","[modbus][0x66][mbmaster][mbtcpmaster]")
{
FAIL("Test of '0x66'..not yet.. ");
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: exchangeMode","[modbus][exchangemode][mbmaster][mbtcpmaster]")
{
FAIL("Test of 'exchangeMode'..not yet.. ");
}
// -----------------------------------------------------------------------------
......@@ -40,15 +40,14 @@ int main(int argc, char* argv[] )
if( !shm )
return 1;
/*
auto mbs = MBSlave::init_mbslave(argc,argv,shm->getId(), (apart ? nullptr : shm ));
if( !mbs )
auto mb = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(), (apart ? nullptr : shm ));
if( !mb )
return 1;
*/
auto act = UniSetActivator::Instance();
act->addObject(shm);
// act->addObject(mbs);
act->addObject(mb);
SystemMessage sm(SystemMessage::StartUp);
act->broadcast( sm.transport_msg() );
......
......@@ -9,7 +9,13 @@ cd ../../../Utilities/Admin/
cd -
./uniset2-start.sh -f ./tests-with-sm $* -- --confile mbmaster-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
# --ulog-add-levels any --dlog-add-levels any
--mbtcp-name MBTCPMaster1 \
--smemory-id SharedMemory \
--mbtcp-filter-field mb \
--mbtcp-filter-value 1 \
--mbtcp-gateway-iaddr localhost \
--mbtcp-gateway-port 20048 \
--mbtcp-polltime 300 --mbtcp-recv-timeout 1000
#--mbtcp-force-out 1
#--dlog-add-levels any
#!/bin/sh
# '--' - нужен для отделения аргументов catch, от наших..
cd ../../../Utilities/Admin/
./uniset2-start.sh -f ./create_links.sh
./uniset2-start.sh -f ./create
./uniset2-start.sh -f ./exist | grep -q UNISET_PLC/Controllers || exit 1
cd -
./uniset2-start.sh -g ./tests-with-sm $* -- --confile mbmaster-test-configure.xml --e-startup-pause 10 \
--mbtcp-name MBTCPMaster1 \
--smemory-id SharedMemory \
--mbtcp-filter-field mb \
--mbtcp-filter-value 1 \
--mbtcp-gateway-iaddr localhost \
--mbtcp-gateway-port 2048 \
--mbtcp-polltime 300
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