Commit ff49c442 authored by Pavel Vainerman's avatar Pavel Vainerman

(modbus): MultiMaster подправил help

parent 6e6834cd
......@@ -144,7 +144,7 @@ void MBExchange::help_print( int argc, const char* const* argv )
cout << "--prefix-confnode name - Настроечная секция в конф. файле <name>. " << endl;
cout << "--prefix-polltime msec - Пауза между опросаом карт. По умолчанию 200 мсек." << endl;
cout << "--prefix-recv-timeout msec - Таймаут на приём одного сообщения" << endl;
cout << "--prefix-timeout msec - Таймаут для определения отсутсвия соединения" << endl;
cout << "--prefix-timeout msec - Таймаут для определения отсутствия соединения" << endl;
cout << "--prefix-reopen-timeout msec - Таймаут для 'переоткрытия соединения' при отсутсвия соединения msec милисекунд. По умолчанию 10 сек." << endl;
cout << "--prefix-heartbeat-id name - Данный процесс связан с указанным аналоговым heartbeat-дачиком." << endl;
cout << "--prefix-heartbeat-max val - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10." << endl;
......
......@@ -166,8 +166,7 @@ void MBTCPMaster::help_print( int argc, const char* const* argv )
{
cout << "Default: prefix='mbtcp'" << endl;
MBExchange::help_print(argc,argv);
// ---------- init MBTCP ----------
// cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl;
cout << endl;
cout << " Настройки протокола TCP: " << endl;
cout << "--prefix-gateway-iaddr hostname,IP - IP опрашиваемого узла" << endl;
cout << "--prefix-gateway-port num - port на опрашиваемом узле" << endl;
......
......@@ -43,6 +43,7 @@ checkThread(0)
UniXML_iterator it(cnode);
checktime = conf->getArgPInt("--" + prefix + "-checktime",it.getProp("checktime"), 5000);
force_disconnect = conf->getArgInt("--" + prefix + "-persistent-connection",it.getProp("persistent_connection")) ? false : true;
UniXML_iterator it1(it);
if( !it1.find("GateList") )
......@@ -102,7 +103,7 @@ checkThread(0)
sinf.sleepPause_usec = it1.getPIntProp("sleepPause_usec",sleepPause_usec);
sinf.respond_invert = it1.getPIntProp("respond_invert",0);
// sinf.force_disconnect = it.getProp("persistent_connection") ? false : true;
sinf.force_disconnect = it.getPIntProp("persistent_connection",!force_disconnect) ? false : true;
ostringstream n;
n << sinf.ip << ":" << sinf.port;
......@@ -140,6 +141,12 @@ checkThread(0)
pollThread = new ThreadCreator<MBTCPMultiMaster>(this, &MBTCPMultiMaster::poll_thread);
checkThread = new ThreadCreator<MBTCPMultiMaster>(this, &MBTCPMultiMaster::check_thread);
// Т.к. при "многоканальном" доступе к slave, смена канала должна происходит сразу после
// неудачной попытки запросов по одному из каналов, то ПЕРЕОПРЕДЕЛЯЕМ reopen, на timeout..
ptReopen.setTiming(ptTimeout.getInterval());
if( dlog.debugging(Debug::INFO) )
printMap(rmap);
}
......@@ -223,7 +230,7 @@ bool MBTCPMultiMaster::MBSlaveInfo::init()
dlog[Debug::INFO] << myname << "(init): connect..." << endl;
mbtcp->connect(ip,port);
// mbtcp->setForceDisconnect(force_disconnect);
mbtcp->setForceDisconnect(force_disconnect);
if( recv_timeout > 0 )
mbtcp->setTimeout(recv_timeout);
......@@ -351,10 +358,13 @@ void MBTCPMultiMaster::help_print( int argc, const char* const* argv )
{
cout << "Default: prefix='mbtcp'" << endl;
MBExchange::help_print(argc,argv);
// ---------- init MBTCP ----------
// cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl;
cout << " Настройки протокола TCP: " << endl;
cout << "--prefix-checktime - период проверки связи по каналам (<GateList>)" << endl;
cout << endl;
cout << " Настройки протокола TCP(MultiMaster): " << endl;
cout << "--prefix-persistent-connection 0,1 - Не закрывать соединение на каждом цикле опроса" << endl;
cout << "--prefix-checktime - период проверки связи по каналам (<GateList>)" << endl;
cout << endl;
cout << " ВНИМАНИЕ! '--prefix-reopen-timeout' для MBTCPMultiMaster НЕ ДЕЙСТВУЕТ! " << endl;
cout << " Переключение на следующий канал зависит от '--prefix-timeout'" << endl;
}
// -----------------------------------------------------------------------------
MBTCPMultiMaster* MBTCPMultiMaster::init_mbmaster( int argc, const char* const* argv,
......
......@@ -9,19 +9,24 @@
#include "modbus/ModbusTCPMaster.h"
// -----------------------------------------------------------------------------
/*!
\page page_ModbusTCP Реализация ModbusTCP master
\page page_ModbusTCPMulti Реализация ModbusTCP 'multi' master
- \ref sec_MBTCP_Comm
- \ref sec_MBTCP_Conf
- \ref sec_MBTCP_ConfList
- \ref sec_MBTCP_ExchangeMode
- \ref sec_MBTCPM_Comm
- \ref sec_MBTCPM_Conf
- \ref sec_MBTCPM_ConfList
- \ref sec_MBTCPM_ExchangeMode
\section sec_MBTCP_Comm Общее описание ModbusTCP master
\section sec_MBTCPM_Comm Общее описание ModbusTCPMultiMaster
Класс реализует процесс обмена (опрос/запись) с RTU-устройствами,
через TCP-шлюз. Список регистров с которыми работает процесс задаётся в конфигурационном файле
в секции \b <sensors>. см. \ref sec_MBTCP_Conf
\section sec_MBTCP_Conf Конфигурирование ModbusTCP master
в секции \b <sensors>. см. \ref sec_MBTCPM_Conf
При этом для шлюза можно задавать несколько ip-адресов (см. <GateList>), если связь пропадает по
одному каналу (ip), то происходит переключение на другой канал (через timeout мсек), если пропадает
с этим каналом, то переключается на следующий и так по кругу (в порядке уменьшения приоритета, задаваемого
для каждого канала (cм. <GateList> \a priority).
\section sec_MBTCPM_Conf Конфигурирование ModbusTCPMultiMaster
Конфигурирование процесса осуществляется либо параметрами командной строки либо
через настроечную секцию.
......@@ -114,7 +119,7 @@
\b --xxx-activate-timeout msec . По умолчанию 2000. - время ожидания готовности SharedMemory к работе.
\section sec_MBTCP_ConfList Конфигурирование списка регистров для ModbusTCP master
\section sec_MBTCPM_ConfList Конфигурирование списка регистров для ModbusTCP master
Конфигурационные параметры задаются в секции <sensors> конфигурационного файла.
Список обрабатываемых регистров задаётся при помощи двух параметров командной строки
......@@ -180,7 +185,7 @@
\warning Регистр должен быть уникальным. И может повторятся только если указан параметр \a nbit или \a nbyte.
\section sec_MBTCP_ExchangeMode Управление режимом работы MBTCPMultiMaster
\section sec_MBTCPM_ExchangeMode Управление режимом работы MBTCPMultiMaster
В MBTCPMultiMaster заложена возможность управлять режимом работы процесса. Поддерживаются
следующие режимы:
- \b emNone - нормальная работа (по умолчанию)
......@@ -197,8 +202,8 @@
*/
// -----------------------------------------------------------------------------
/*!
\par Реализация Modbus TCP Master для обмена с многими ModbusRTU устройствами
через один modbus tcp шлюз.
\par Реализация Modbus TCP Multi Master для обмена с многими ModbusRTU устройствами
через один modbus tcp шлюз, доступный по нескольким ip-адресам.
\par Чтобы не зависеть от таймаутов TCP соединений, которые могут неопределённо зависать
на создании соединения с недоступным хостом. Обмен вынесен в отдельный поток.
......@@ -240,7 +245,9 @@ class MBTCPMultiMaster:
{
MBSlaveInfo():ip(""),port(0),mbtcp(0),priority(0),
respond(false),respond_id(UniSetTypes::DefaultObjectId),respond_invert(false),
recv_timeout(200),aftersend_pause(0),sleepPause_usec(100),myname(""),initOK(false){}
recv_timeout(200),aftersend_pause(0),sleepPause_usec(100),
force_disconnect(true),
myname(""),initOK(false){}
std::string ip;
int port;
......@@ -263,6 +270,7 @@ class MBTCPMultiMaster:
int recv_timeout;
int aftersend_pause;
int sleepPause_usec;
bool force_disconnect;
std::string myname;
......
#!/bin/sh
./uniset-start.sh -f ./uniset-mbtcpmultimaster \
--confile test.xml \
--mbtcp-name MBMultiMaster1 \
--smemory-id SharedMemory \
--dlog-add-levels info,crit,warn,level4,level3,level9 \
--mbtcp-set-prop-prefix \
--mbtcp-filter-field rs \
--mbtcp-filter-value 5 \
--mbtcp-gateway-iaddr 127.0.0.1 \
--mbtcp-gateway-port 2048 \
--mbtcp-recv-timeout 3000 \
--mbtcp-timeout 2000 \
--mbtcp-force-disconnect 1 \
--mbtcp-polltime 3000 \
--mbtcp-force-out 1 \
$*
#--mbtcp-exchange-mode-id MB1_Mode_AS \
#--mbtcp-filter-field mbtcp --mbtcp-filter-value 1
#--mbtcp-set-prop-prefix rs_ \
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