Commit 7a638561 authored by Pavel Vainerman's avatar Pavel Vainerman

(MBExchange): SafeMode: step 3 (docs, tests)

parent 8a49ba17
......@@ -69,6 +69,7 @@ namespace uniset
- \b respondSensor - название(name) датчика связи.
- \b respondInitTimeout - msec, время на инициализацию связи после запуска процесса. Т.е. только после этого времени будет выставлен(обновлён) датчик наличия связи. По умолчанию время равно timeout.
- \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout.
- \b safemodeXXX - см. \ref sec_MBTCP_SafeMode
\par Параметры запуска
......@@ -207,6 +208,32 @@ namespace uniset
Режимы переключаются при помощи датчика, который можно задать либо аргументом командной строки
\b --prefix-exchange-mode-id либо в конф. файле параметром \b exchangeModeID="". Константы определяющие режимы объявлены в MBTCPMaster::ExchangeMode.
\section sec_MBTCP_SafeMode Управление режимом "безопасного состояния"
В MBTCPMaster заложена возможность управлять режимом выставления безопасного состояния входов и выходов.
Возможны следующие режимы:
- \b safeNone - режим отключён (по умолчанию)
- \b safeExternalControl - управление при помощи внешнего датчика
- \b safeResetIfNotRespond - выставление безопасных значение, если пропала связь с устройством.
Суть этого режима, в том, что все входы и выходы у которых в настройках указан параметр safeval=""
выставляются в это значение, при срабатывании внешнего датчика (режим "safeExternalControl") или
при отсутсвии связи с устройством (режим "safeResetIfNotRespond").
Режим задаётся в секции <DeviceList> для каждого устройства отдельно.
\code
<DeviceList>
<item addr="01" .. safemodeSensor="Slave1_SafemodeSensor_S" safemodeValue="42"/>
<item addr="02" .. safemodeResetIfNotRespond="1"/>
</DeviceList>
\endcode
Если указан параметр \a safemodeSensor="..", то используется режим \b safeExternalControl.
При этом можно указать конкретное значение датчика \a safemodeSensorValue="..",
при котором будет сделан сброс значений в безопасное состояние.
Если указан параметр safemodeResetIfNotRespond="1", то будет использован режим \b safeResetIfNotRespond.
Если указан и параметр \a safemodeSensor=".." и \a safemodeResetIfNotRespond="1", то будет использован
режим \b safeExternalControl (как более приоритетный).
*/
// -----------------------------------------------------------------------------
/*!
......
......@@ -78,8 +78,7 @@ namespace uniset
- \b force [1,0] - "1" - обновлять значение датчика связи в SM принудительно на каждом цикле проверки ("0" - только по изменению).
- \b exchangeModeID - идентификатор датчика режима работы (см. MBExchange::ExchangeMode).
- \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout.
- \b safemodeSensor - датчик для управления "безопасным режимом". см. \ref MBTCPM_SafeMode
- \b safemodeSensorValue - значение датчика, при котором происходит сброс в "безопасные значения"
- \b safemodeXXX - см. \ref sec_MBTCP_SafeMode
Секция <GateList> позволяет задать несколько каналов связи со Slave-устройством. Это удобно для случая, когда Slave имеет
более одного канала связи с ним (основной и резервный например).
......
......@@ -115,9 +115,9 @@
<item id="1028" mb="2" mbtype="rtu" mbaddr="0x01" mbreg="47" mbfunc="0x03" vtype="F2" iotype="DI" name="TestWrite1028_F2" textname="F2: Тестовый регистр для 0x10"/>
<!-- SafeMode tests -->
<item id="1040" name="Slave1_SafemodeSensor_S" iotype="AI" textname="Управление safeMode" />
<item id="1041" safeval="42" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="10" mbfunc="0x03" iotype="AI" name="SafeMode_TestRead03" textname="(safemode): Тестовый регистр для 0x03"/>
<item id="1042" safeval="1" mb="1" mbtype="rtu" mbaddr="0x01" mbreg="11" mbfunc="0x02" iotype="DI" name="SafeMode_TestRead02" textname="(safemode): Тестовый регистр для 0x02"/>
<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="10000" iotype="DI" name="TestMode_S" textname="Тестовый датчик"/>
......
......@@ -684,29 +684,32 @@ TEST_CASE("MBTCPMaster: 0x66 (file transfer)", "[modbus][0x66][mbmaster][mbtcpma
TEST_CASE("MBTCPMaster: safe mode", "[modbus][safemode][mbmaster][mbtcpmaster]")
{
InitTest();
ui->setValue(1050,0); // отключаем safeMode
smi->setValue(1040,0); // отключаем safeMode
mbs->setReply(50);
mbs->setReply(53);
msleep(polltime + 200);
REQUIRE( ui->getValue(1041) == 50 );
// REQUIRE( ui->getValue(1042) == 1 );
REQUIRE( ui->getValue(1051) == 53 );
REQUIRE( ui->getValue(1052) == 1 );
mbs->setReply(0);
msleep(polltime + 200);
REQUIRE( ui->getValue(1041) == 0 );
REQUIRE( ui->getValue(1042) == 0 );
REQUIRE( ui->getValue(1051) == 0 );
REQUIRE( ui->getValue(1052) == 0 );
smi->setValue(1040,42); // включаем safeMode
ui->setValue(1050,42); // включаем safeMode
msleep(polltime + 200);
REQUIRE( ui->getValue(1041) == 42 );
REQUIRE( ui->getValue(1042) == 1 );
REQUIRE( ui->getValue(1051) == 42 );
REQUIRE( ui->getValue(1052) == 1 );
smi->setValue(1040,0); // отключаем safeMode
mbs->setReply(0);
mbs->setReply(53);
msleep(polltime + 200);
REQUIRE( ui->getValue(1041) == 0 );
REQUIRE( ui->getValue(1042) == 0 );
REQUIRE( ui->getValue(1051) == 42 );
REQUIRE( ui->getValue(1052) == 1 );
ui->setValue(1050,0); // отключаем safeMode
msleep(polltime + 200);
REQUIRE( ui->getValue(1051) == 53 );
REQUIRE( ui->getValue(1052) == 1 );
}
// -----------------------------------------------------------------------------
#if 0
......
......@@ -155,27 +155,32 @@ TEST_CASE("MBTCPMultiMaster: safe mode", "[modbus][safemode][mbmaster][mbtcpmult
{
InitTest();
ui->setValue(1040,0); // отключаем safeMode
ui->setValue(1050,0); // отключаем safeMode
mbs1->setReply(50);
mbs1->setReply(53);
msleep(polltime + 200);
REQUIRE( ui->getValue(1041) == 50 );
// REQUIRE( ui->getValue(1042) == 1 );
REQUIRE( ui->getValue(1051) == 53 );
REQUIRE( ui->getValue(1052) == 1 );
mbs1->setReply(0);
msleep(polltime + 200);
REQUIRE( ui->getValue(1041) == 0 );
REQUIRE( ui->getValue(1042) == 0 );
REQUIRE( ui->getValue(1051) == 0 );
REQUIRE( ui->getValue(1052) == 0 );
ui->setValue(1040,42); // включаем safeMode
ui->setValue(1050,42); // включаем safeMode
msleep(polltime + 200);
REQUIRE( ui->getValue(1041) == 42 );
REQUIRE( ui->getValue(1042) == 1 );
REQUIRE( ui->getValue(1051) == 42 );
REQUIRE( ui->getValue(1052) == 1 );
ui->setValue(1040,0); // отключаем safeMode
mbs1->setReply(0);
mbs1->setReply(53);
msleep(polltime + 200);
REQUIRE( ui->getValue(1051) == 42 );
REQUIRE( ui->getValue(1052) == 1 );
ui->setValue(1050,0); // отключаем safeMode
msleep(polltime + 200);
REQUIRE( ui->getValue(1041) == 0 );
REQUIRE( ui->getValue(1042) == 0 );
REQUIRE( ui->getValue(1051) == 53 );
REQUIRE( ui->getValue(1052) == 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