Commit 03a49faa authored by Pavel Vainerman's avatar Pavel Vainerman

(MBExchange): SafeMode: step 3. Реализация safeResetIfNotRespond

parent 70af3a3d
......@@ -553,6 +553,13 @@ namespace uniset
if( !dev )
return false;
// если режим, сброс когда исчезла связь
// то проверяем таймер
// resp_Delay - это задержка на отпускание "пропадание" связи,
// поэтому проверка на "0" (0 - связи нет), а значит должен включиться safeMode
if( dev->safeMode == safeResetIfNotRespond )
return !dev->resp_Delay.get();
return ( dev->safeMode != safeNone );
}
// -----------------------------------------------------------------------------
......@@ -2931,7 +2938,12 @@ namespace uniset
}
}
string safemode(it.getProp("safemodeSensor"));
// сперва проверим не задан ли режим "safemodeResetIfNotRespond"
if( it.getIntProp("safemodeResetIfNotRespond") )
dev->safeMode = MBExchange::safeResetIfNotRespond;
// потом проверим датчик для "safeExternalControl"
string safemode = it.getProp("safemodeSensor");
if( !safemode.empty() )
{
......
......@@ -29,12 +29,14 @@
<SharedMemory name="SharedMemory" shmID="SharedMemory"/>
<MBTCPMaster1 name="MBTCPMaster1" exchangeModeID="MBTCPMaster_Mode_AS">
<DeviceList>
<item addr="0x01" invert="1" respondSensor="Slave_Not_Respond_S" timeout="1000" safemodeSensor="Slave1_SafemodeSensor_S" safemodeValue="42"/>
<item addr="0x01" timeout="1000" invert="1" respondSensor="Slave_Not_Respond_S" safemodeSensor="Slave1_SafemodeSensor_S" safemodeValue="42"/>
<item addr="0x02" timeout="1000" safemodeResetIfNotRespond="1"/>
</DeviceList>
</MBTCPMaster1>
<MBTCPMultiMaster1 name="MBTCPMultiMaster1" poll_time="200" reply_timeout="60">
<DeviceList>
<item addr="0x01" invert="1" respondSensor="Slave_Not_Respond_S" timeout="1000" safemodeSensor="Slave1_SafemodeSensor_S" safemodeValue="42" />
<item addr="0x02" timeout="1000" safemodeResetIfNotRespond="1"/>
</DeviceList>
<GateList>
<item ip="127.0.0.1" port="20053" recv_timeout="200" invert="1" respondSensor="Slave1_Not_Respond_S"/>
......@@ -118,6 +120,8 @@
<item id="1050" name="Slave1_SafemodeSensor_S" iotype="AI" textname="Управление safeMode" />
<item id="1051" safeval="42" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="10" mbfunc="0x03" iotype="AI" name="SafeMode_TestRead03" textname="(safemode): Тестовый регистр для 0x03"/>
<item id="1052" safeval="1" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="11" mbfunc="0x02" iotype="DI" name="SafeMode_TestRead02" textname="(safemode): Тестовый регистр для 0x02"/>
<item id="1053" safeval="42" mb="1" mbtype="rtu" mbaddr="0x02" mbreg="10" mbfunc="0x03" iotype="AI" name="SafeMode2_TestRead03" textname="(safemode): Тестовый регистр для 0x03"/>
<item id="1054" safeval="1" mb="1" mbtype="rtu" mbaddr="0x02" mbreg="11" mbfunc="0x02" iotype="DI" name="SafeMode2_TestRead02" textname="(safemode): Тестовый регистр для 0x02"/>
<item id="10000" iotype="DI" name="TestMode_S" textname="Тестовый датчик"/>
......
......@@ -12,11 +12,10 @@
using namespace std;
using namespace uniset;
// -----------------------------------------------------------------------------
static ModbusRTU::ModbusAddr slaveaddr = 0x01; // conf->getArgInt("--mbs-my-addr");
static ModbusRTU::ModbusAddr slaveADDR = 0x01; // conf->getArgInt("--mbs-my-addr");
static int port = 20048; // conf->getArgInt("--mbs-inet-port");
static string iaddr("127.0.0.1"); // conf->getArgParam("--mbs-inet-addr");
static const ModbusRTU::ModbusAddr slaveADDR = 0x01;
static unordered_set<ModbusRTU::ModbusAddr> vaddr = { slaveADDR };
static unordered_set<ModbusRTU::ModbusAddr> vaddr = { slaveADDR, 0x02 };
static shared_ptr<MBTCPTestServer> mbs;
static shared_ptr<UInterface> ui;
static std::shared_ptr<SMInterface> smi;
......@@ -626,13 +625,13 @@ TEST_CASE("MBTCPMaster: check respond resnsor", "[modbus][respond][mbmaster][mbt
{
InitTest();
mbs->disableExchange(false);
msleep(1100);
msleep(3500);
CHECK( ui->getValue(slaveNotRespond) == 0 );
mbs->disableExchange(true);
msleep(1100);
msleep(3000);
CHECK( ui->getValue(slaveNotRespond) == 1 );
mbs->disableExchange(false);
msleep(1100);
msleep(3000);
CHECK( ui->getValue(slaveNotRespond) == 0 );
}
// -----------------------------------------------------------------------------
......@@ -712,6 +711,36 @@ TEST_CASE("MBTCPMaster: safe mode", "[modbus][safemode][mbmaster][mbtcpmaster]")
REQUIRE( ui->getValue(1052) == 1 );
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: safe mode (resetIfNotRespond)", "[modbus][safemode][mbmaster][mbtcpmaster]")
{
InitTest();
mbs->setReply(53);
msleep(polltime + 200);
REQUIRE( ui->getValue(1053) == 53 );
REQUIRE( ui->getValue(1054) == 1 );
mbs->setReply(0);
msleep(polltime + 200);
REQUIRE( ui->getValue(1053) == 0 );
REQUIRE( ui->getValue(1054) == 0 );
mbs->disableExchange(true); // отключаем связь
msleep(5000);
REQUIRE( ui->getValue(1053) == 42 );
REQUIRE( ui->getValue(1054) == 1 );
mbs->setReply(53);
msleep(polltime + 200);
REQUIRE( ui->getValue(1053) == 42 );
REQUIRE( ui->getValue(1054) == 1 );
mbs->disableExchange(false); // включаем связь
msleep(5000);
REQUIRE( ui->getValue(1053) == 53 );
REQUIRE( ui->getValue(1054) == 1 );
}
// -----------------------------------------------------------------------------
#if 0
// -----------------------------------------------------------------------------
static bool init_iobase( IOBase* ib, const std::string& sensor )
......
......@@ -22,12 +22,12 @@ using namespace uniset;
using namespace std;
using namespace uniset;
// -----------------------------------------------------------------------------
static ModbusRTU::ModbusAddr slaveaddr = 0x01; // conf->getArgInt("--mbs-my-addr");
static ModbusRTU::ModbusAddr slaveADDR = 0x01; // conf->getArgInt("--mbs-my-addr");
static unordered_set<ModbusRTU::ModbusAddr> vaddr = { slaveADDR, 0x02 };
static int port = 20053; // conf->getArgInt("--mbs-inet-port");
static const string iaddr("127.0.0.1"); // conf->getArgParam("--mbs-inet-addr");
static int port2 = 20055;
static const string iaddr2("127.0.0.1");
static unordered_set<ModbusRTU::ModbusAddr> slaveADDR = { 0x01 };
static shared_ptr<MBTCPTestServer> mbs1;
static shared_ptr<MBTCPTestServer> mbs2;
static shared_ptr<UInterface> ui;
......@@ -56,7 +56,7 @@ static void InitTest()
{
try
{
mbs1 = make_shared<MBTCPTestServer>(slaveADDR, iaddr, port, false);
mbs1 = make_shared<MBTCPTestServer>(vaddr, iaddr, port, false);
}
catch( const Poco::Net::NetException& e )
{
......@@ -87,7 +87,7 @@ static void InitTest()
{
try
{
mbs2 = make_shared<MBTCPTestServer>(slaveADDR, iaddr2, port2, false);
mbs2 = make_shared<MBTCPTestServer>(vaddr, iaddr2, port2, false);
}
catch( const Poco::Net::NetException& e )
{
......@@ -184,3 +184,42 @@ TEST_CASE("MBTCPMultiMaster: safe mode", "[modbus][safemode][mbmaster][mbtcpmult
REQUIRE( ui->getValue(1052) == 1 );
}
// -----------------------------------------------------------------------------
TEST_CASE("MBTCPMaster: safe mode (resetIfNotRespond)", "[modbus][safemode][mbmaster][mbtcpmaster]")
{
InitTest();
mbs1->disableExchange(false); // включаем связь
mbs2->disableExchange(false); // включаем связь
msleep(2000);
mbs1->setReply(53);
mbs2->setReply(53);
msleep(polltime + 200);
REQUIRE( ui->getValue(1053) == 53 );
REQUIRE( ui->getValue(1054) == 1 );
mbs1->setReply(0);
mbs2->setReply(0);
msleep(polltime + 200);
REQUIRE( ui->getValue(1053) == 0 );
REQUIRE( ui->getValue(1054) == 0 );
mbs1->disableExchange(true); // отключаем связь
mbs2->disableExchange(true); // отключаем связь
msleep(5000);
REQUIRE( ui->getValue(1053) == 42 );
REQUIRE( ui->getValue(1054) == 1 );
mbs1->setReply(53);
mbs2->setReply(53);
msleep(polltime + 200);
REQUIRE( ui->getValue(1053) == 42 );
REQUIRE( ui->getValue(1054) == 1 );
mbs1->disableExchange(false); // включаем связь
mbs2->disableExchange(false); // включаем связь
msleep(5000);
REQUIRE( ui->getValue(1053) == 53 );
REQUIRE( ui->getValue(1054) == 1 );
}
// -----------------------------------------------------------------------------
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