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

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

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