Commit 050e1f9c authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusMaster): перенёс реализацию ModbusMaster TCP и RTU в один каталог ModbusMaster

parent 00b4d0ee
...@@ -179,13 +179,11 @@ AC_CONFIG_FILES([Makefile ...@@ -179,13 +179,11 @@ AC_CONFIG_FILES([Makefile
extensions/DBServer-MySQL/libUniSetMySQL.pc extensions/DBServer-MySQL/libUniSetMySQL.pc
extensions/IOControl/Makefile extensions/IOControl/Makefile
extensions/IOControl/libUniSetIOControl.pc extensions/IOControl/libUniSetIOControl.pc
extensions/RTUExchange/Makefile
extensions/RTUExchange/libUniSetRTU.pc
extensions/ModbusMaster/Makefile extensions/ModbusMaster/Makefile
extensions/ModbusMaster/libUniSetRTU.pc
extensions/ModbusMaster/libUniSetMBTCPMaster.pc
extensions/ModbusSlave/Makefile extensions/ModbusSlave/Makefile
extensions/ModbusSlave/libUniSetMBSlave.pc extensions/ModbusSlave/libUniSetMBSlave.pc
extensions/MBTCPMaster/Makefile
extensions/MBTCPMaster/libUniSetMBTCPMaster.pc
extensions/LogicProcessor/Makefile extensions/LogicProcessor/Makefile
extensions/LogicProcessor/libUniSetLogicProcessor.pc extensions/LogicProcessor/libUniSetLogicProcessor.pc
extensions/SMViewer/Makefile extensions/SMViewer/Makefile
......
bin_PROGRAMS = @PACKAGE@-mbtcpmaster
# не забывайте править версию в pc-файле
UMBTCP_VER=1:2:1
lib_LTLIBRARIES = libUniSetMBTCPMaster.la
libUniSetMBTCPMaster_la_LDFLAGS = -version-info $(UMBTCP_VER)
libUniSetMBTCPMaster_la_LIBADD = $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(top_builddir)/extensions/ModbusMaster/libMBMaster.la \
$(SIGC_LIBS)
libUniSetMBTCPMaster_la_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory -I$(top_builddir)/extensions/ModbusMaster $(SIGC_CFLAGS)
libUniSetMBTCPMaster_la_SOURCES = MBTCPMaster.cc
@PACKAGE@_mbtcpmaster_SOURCES = main.cc
@PACKAGE@_mbtcpmaster_LDADD = libUniSetMBTCPMaster.la $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(top_builddir)/extensions/ModbusMaster/libMBMaster.la \
$(SIGC_LIBS)
@PACKAGE@_mbtcpmaster_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory -I$(top_builddir)/extensions/ModbusMaster $(SIGC_CFLAGS)
# install
devel_include_HEADERS = *.h
devel_includedir = $(pkgincludedir)/extensions
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libUniSetMBTCPMaster.pc
all-local:
ln -sf ../MBTCPMaster/$(devel_include_HEADERS) ../include
#!/bin/sh
ln -s -f ../../Utilities/scripts/uniset-start.sh
ln -s -f ../../Utilities/scripts/uniset-stop.sh stop.sh
ln -s -f ../../Utilities/scripts/uniset-functions.sh
ln -s -f ../../conf/test.xml test.xml
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
############################################################################ ############################################################################
if HAVE_EXTENTIONS if HAVE_EXTENTIONS
SUBDIRS = lib include ModbusMaster SharedMemory IOControl RTUExchange LogicProcessor \ SUBDIRS = lib include SharedMemory IOControl LogicProcessor \
ModbusSlave MBTCPMaster SMViewer UniNetwork UNet2 DBServer-MySQL tests ModbusMaster ModbusSlave SMViewer UniNetwork UNet2 DBServer-MySQL tests
#SMDBServer #SMDBServer
#SharedMemoryPlus #SharedMemoryPlus
#UDPExchange #UDPExchange
......
...@@ -55,10 +55,10 @@ pollActivated(false) ...@@ -55,10 +55,10 @@ pollActivated(false)
if( stat_time > 0 ) if( stat_time > 0 )
ptStatistic.setTiming(stat_time*1000); ptStatistic.setTiming(stat_time*1000);
// recv_timeout = conf->getArgPInt("--" + prefix + "-recv-timeout",it.getProp("recv_timeout"), 500); recv_timeout = conf->getArgPInt("--" + prefix + "-recv-timeout",it.getProp("recv_timeout"), 500);
//
// int tout = conf->getArgPInt("--" + prefix + "-timeout",it.getProp("timeout"), 5000); int tout = conf->getArgPInt("--" + prefix + "-timeout",it.getProp("timeout"), 5000);
// ptTimeout.setTiming(tout); ptTimeout.setTiming(tout);
noQueryOptimization = conf->getArgInt("--" + prefix + "-no-query-optimization",it.getProp("no_query_optimization")); noQueryOptimization = conf->getArgInt("--" + prefix + "-no-query-optimization",it.getProp("no_query_optimization"));
...@@ -148,6 +148,21 @@ void MBExchange::help_print( int argc, const char* const* argv ) ...@@ -148,6 +148,21 @@ void MBExchange::help_print( int argc, const char* const* argv )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBExchange::~MBExchange() MBExchange::~MBExchange()
{ {
for( RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{
if( it1->second->rtu )
{
delete it1->second->rtu;
it1->second->rtu = 0;
}
RTUDevice* d(it1->second);
for( RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
delete it->second;
delete it1->second;
}
delete shm; delete shm;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -2613,3 +2628,34 @@ void MBExchange::poll() ...@@ -2613,3 +2628,34 @@ void MBExchange::poll()
// printMap(rmap); // printMap(rmap);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool MBExchange::RTUDevice::checkRespond()
{
bool prev = resp_state;
if( resp_ptTimeout.getInterval() <= 0 )
{
resp_state = resp_real;
return (prev != resp_state);
}
if( resp_trTimeout.hi(resp_state && !resp_real) )
resp_ptTimeout.reset();
if( resp_real )
resp_state = true;
else if( resp_state && !resp_real && resp_ptTimeout.checkTime() )
resp_state = false;
// если ещё не инициализировали значение в SM
// то возвращаем true, чтобы оно принудительно сохранилось
if( !resp_init )
{
resp_state = resp_real;
resp_init = true;
prev = resp_state;
return true;
}
return ( prev != resp_state );
}
// -----------------------------------------------------------------------------
...@@ -308,6 +308,7 @@ class MBExchange: ...@@ -308,6 +308,7 @@ class MBExchange:
// определение timeout для соединения // определение timeout для соединения
PassiveTimer ptTimeout; PassiveTimer ptTimeout;
bool pollActivated; bool pollActivated;
int recv_timeout;
private: private:
MBExchange(); MBExchange();
......
...@@ -10,7 +10,7 @@ using namespace std; ...@@ -10,7 +10,7 @@ using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId,
SharedMemory* ic, const std::string prefix ): SharedMemory* ic, const std::string prefix ):
MBExchange(objId,shmId,ic,prefix), MBExchange(objId,shmId,ic,prefix),
force_disconnect(true), force_disconnect(true),
...@@ -59,15 +59,6 @@ pollThread(0) ...@@ -59,15 +59,6 @@ pollThread(0)
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBTCPMaster::~MBTCPMaster() MBTCPMaster::~MBTCPMaster()
{ {
for( MBTCPMaster::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{
RTUDevice* d(it1->second);
for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
delete it->second;
delete it1->second;
}
delete pollThread; delete pollThread;
delete mbtcp; delete mbtcp;
} }
...@@ -78,7 +69,7 @@ ModbusClient* MBTCPMaster::initMB( bool reopen ) ...@@ -78,7 +69,7 @@ ModbusClient* MBTCPMaster::initMB( bool reopen )
{ {
if( !reopen ) if( !reopen )
return mbtcp; return mbtcp;
delete mbtcp; delete mbtcp;
mb = 0; mb = 0;
mbtcp = 0; mbtcp = 0;
...@@ -88,7 +79,7 @@ ModbusClient* MBTCPMaster::initMB( bool reopen ) ...@@ -88,7 +79,7 @@ ModbusClient* MBTCPMaster::initMB( bool reopen )
{ {
ost::Thread::setException(ost::Thread::throwException); ost::Thread::setException(ost::Thread::throwException);
mbtcp = new ModbusTCPMaster(); mbtcp = new ModbusTCPMaster();
ost::InetAddress ia(iaddr.c_str()); ost::InetAddress ia(iaddr.c_str());
mbtcp->connect(ia,port); mbtcp->connect(ia,port);
mbtcp->setForceDisconnect(force_disconnect); mbtcp->setForceDisconnect(force_disconnect);
...@@ -99,7 +90,7 @@ ModbusClient* MBTCPMaster::initMB( bool reopen ) ...@@ -99,7 +90,7 @@ ModbusClient* MBTCPMaster::initMB( bool reopen )
mbtcp->setSleepPause(sleepPause_usec); mbtcp->setSleepPause(sleepPause_usec);
dlog[Debug::INFO] << myname << "(init): ipaddr=" << iaddr << " port=" << port << endl; dlog[Debug::INFO] << myname << "(init): ipaddr=" << iaddr << " port=" << port << endl;
if( dlog.debugging(Debug::LEVEL9) ) if( dlog.debugging(Debug::LEVEL9) )
mbtcp->setLog(dlog); mbtcp->setLog(dlog);
} }
...@@ -202,37 +193,6 @@ void MBTCPMaster::poll_thread() ...@@ -202,37 +193,6 @@ void MBTCPMaster::poll_thread()
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool MBTCPMaster::RTUDevice::checkRespond()
{
bool prev = resp_state;
if( resp_ptTimeout.getInterval() <= 0 )
{
resp_state = resp_real;
return (prev != resp_state);
}
if( resp_trTimeout.hi(resp_state && !resp_real) )
resp_ptTimeout.reset();
if( resp_real )
resp_state = true;
else if( resp_state && !resp_real && resp_ptTimeout.checkTime() )
resp_state = false;
// если ещё не инициализировали значение в SM
// то возвращаем true, чтобы оно принудительно сохранилось
if( !resp_init )
{
resp_state = resp_real;
resp_init = true;
prev = resp_state;
return true;
}
return ( prev != resp_state );
}
// -----------------------------------------------------------------------------
void MBTCPMaster::sigterm( int signo ) void MBTCPMaster::sigterm( int signo )
{ {
dlog[Debug::WARN] << myname << ": ********* SIGTERM(" << signo <<") ********" << endl; dlog[Debug::WARN] << myname << ": ********* SIGTERM(" << signo <<") ********" << endl;
......
...@@ -10,21 +10,21 @@ ...@@ -10,21 +10,21 @@
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
/*! /*!
\page page_ModbusTCP Реализация ModbusTCP master \page page_ModbusTCP Реализация ModbusTCP master
- \ref sec_MBTCP_Comm - \ref sec_MBTCP_Comm
- \ref sec_MBTCP_Conf - \ref sec_MBTCP_Conf
- \ref sec_MBTCP_ConfList - \ref sec_MBTCP_ConfList
- \ref sec_MBTCP_ExchangeMode - \ref sec_MBTCP_ExchangeMode
\section sec_MBTCP_Comm Общее описание ModbusTCP master \section sec_MBTCP_Comm Общее описание ModbusTCP master
Класс реализует процесс обмена (опрос/запись) с RTU-устройствами, Класс реализует процесс обмена (опрос/запись) с RTU-устройствами,
через TCP-шлюз. Список регистров с которыми работает процесс задаётся в конфигурационном файле через TCP-шлюз. Список регистров с которыми работает процесс задаётся в конфигурационном файле
в секции \b <sensors>. см. \ref sec_MBTCP_Conf в секции \b <sensors>. см. \ref sec_MBTCP_Conf
\section sec_MBTCP_Conf Конфигурирование ModbusTCP master \section sec_MBTCP_Conf Конфигурирование ModbusTCP master
Конфигурирование процесса осуществляется либо параметрами командной строки либо Конфигурирование процесса осуществляется либо параметрами командной строки либо
через настроечную секцию. через настроечную секцию.
\par Секция с настройками \par Секция с настройками
При своём старте, в конфигурационном файле ищётся секция с названием объекта, При своём старте, в конфигурационном файле ищётся секция с названием объекта,
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
</MBMaster1> </MBMaster1>
\endcode \endcode
Секция <DeviceList> позволяет задать параметры обмена с конкретным RTU-устройством. Секция <DeviceList> позволяет задать параметры обмена с конкретным RTU-устройством.
- \b addr - адрес устройства для которого, задаются параметры - \b addr - адрес устройства для которого, задаются параметры
- \b timeout msec - таймаут, для определения отсутствия связи - \b timeout msec - таймаут, для определения отсутствия связи
- \b invert - инвертировать логику. По умолчанию датчик выставляется в "1" при \b наличии связи. - \b invert - инвертировать логику. По умолчанию датчик выставляется в "1" при \b наличии связи.
...@@ -47,36 +47,36 @@ ...@@ -47,36 +47,36 @@
- \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout. - \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout.
\par Параметры запуска \par Параметры запуска
При создании объекта в конструкторе передаётся префикс для определения параметров командной строки. При создании объекта в конструкторе передаётся префикс для определения параметров командной строки.
По умолчанию \b xxx="mbtcp". По умолчанию \b xxx="mbtcp".
Далее приведены основные параметры: Далее приведены основные параметры:
\b --xxx-name ID - идентификатор процесса. \b --xxx-name ID - идентификатор процесса.
IP-адрес шлюза задаётся параметром в конфигурационном файле \b gateway_iaddr или IP-адрес шлюза задаётся параметром в конфигурационном файле \b gateway_iaddr или
параметром командной строки \b --xxx-gateway-iaddr. параметром командной строки \b --xxx-gateway-iaddr.
Порт задаётся в конфигурационном файле параметром \b gateway_port или Порт задаётся в конфигурационном файле параметром \b gateway_port или
параметром командной строки \b --xxx-gateway-port. По умолчанию используется порт \b 502. параметром командной строки \b --xxx-gateway-port. По умолчанию используется порт \b 502.
\b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём одного сообщения. По умолчанию 100 мсек. \b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём одного сообщения. По умолчанию 100 мсек.
\b --xxx-timeout или \b timeout msec - таймаут на определение отсутсвия связи \b --xxx-timeout или \b timeout msec - таймаут на определение отсутсвия связи
(после этого идёт попытка реинициализировать соединение) (после этого идёт попытка реинициализировать соединение)
По умолчанию 5000 мсек. По умолчанию 5000 мсек.
\b --xxx-no-query-optimization или \b no_query_optimization - [1|0] отключить оптимизацию запросов \b --xxx-no-query-optimization или \b no_query_optimization - [1|0] отключить оптимизацию запросов
Оптимизация заключается в том, что регистры идущие подряд автоматически запрашиваются/записываются одним запросом. Оптимизация заключается в том, что регистры идущие подряд автоматически запрашиваются/записываются одним запросом.
В связи с чем, функция указанная в качестве \b mbfunc игнорируется и подменяется на работающую с многими регистрами. В связи с чем, функция указанная в качестве \b mbfunc игнорируется и подменяется на работающую с многими регистрами.
\b --xxx-poll-time или \b poll_time msec - пауза между опросами. По умолчанию 100 мсек. \b --xxx-poll-time или \b poll_time msec - пауза между опросами. По умолчанию 100 мсек.
\b --xxx-initPause или \b initPause msec - пауза перед началом работы, после активации. По умолчанию 50 мсек. \b --xxx-initPause или \b initPause msec - пауза перед началом работы, после активации. По умолчанию 50 мсек.
\b --xxx-force или \b force [1|0] \b --xxx-force или \b force [1|0]
- 1 - перечитывать значения входов из SharedMemory на каждом цикле - 1 - перечитывать значения входов из SharedMemory на каждом цикле
- 0 - обновлять значения только по изменению - 0 - обновлять значения только по изменению
...@@ -86,37 +86,37 @@ ...@@ -86,37 +86,37 @@
- 1 - перечитывать значения выходов из SharedMemory на каждом цикле - 1 - перечитывать значения выходов из SharedMemory на каждом цикле
- 0 - обновлять значения только по изменению - 0 - обновлять значения только по изменению
\b --xxx-reg-from-id или \b reg_from_id [1|0] \b --xxx-reg-from-id или \b reg_from_id [1|0]
- 1 - в качестве регистра использовать идентификатор датчика - 1 - в качестве регистра использовать идентификатор датчика
- 0 - регистр брать из поля tcp_mbreg - 0 - регистр брать из поля tcp_mbreg
\b --xxx-heartbeat-id или \b heartbeat_id ID - идентификатор датчика "сердцебиения" (см. \ref sec_SM_HeartBeat) \b --xxx-heartbeat-id или \b heartbeat_id ID - идентификатор датчика "сердцебиения" (см. \ref sec_SM_HeartBeat)
\b --xxx-heartbeat-max или \b heartbeat_max val - сохраняемое значение счётчика "сердцебиения". \b --xxx-heartbeat-max или \b heartbeat_max val - сохраняемое значение счётчика "сердцебиения".
\b --xxx-activate-timeout msec . По умолчанию 2000. - время ожидания готовности SharedMemory к работе. \b --xxx-activate-timeout msec . По умолчанию 2000. - время ожидания готовности SharedMemory к работе.
\section sec_MBTCP_ConfList Конфигурирование списка регистров для ModbusTCP master \section sec_MBTCP_ConfList Конфигурирование списка регистров для ModbusTCP master
Конфигурационные параметры задаются в секции <sensors> конфигурационного файла. Конфигурационные параметры задаются в секции <sensors> конфигурационного файла.
Список обрабатываемых регистров задаётся при помощи двух параметров командной строки Список обрабатываемых регистров задаётся при помощи двух параметров командной строки
\b --xxx-filter-field - задаёт фильтрующее поле для датчиков \b --xxx-filter-field - задаёт фильтрующее поле для датчиков
\b --xxx-filter-value - задаёт значение фильтрующего поля. Необязательный параметр. \b --xxx-filter-value - задаёт значение фильтрующего поля. Необязательный параметр.
\b --xxx-statistic-sec sec - при наличии выведет кол-во посланных запросов за этот промежуток времени. \b --xxx-statistic-sec sec - при наличии выведет кол-во посланных запросов за этот промежуток времени.
Если параметры не заданы, будет произведена попытка загрузить все датчики, у которых Если параметры не заданы, будет произведена попытка загрузить все датчики, у которых
присутствуют необходимые настроечные параметры. присутствуют необходимые настроечные параметры.
\warning Если в результате список будет пустым, процесс завершает работу. \warning Если в результате список будет пустым, процесс завершает работу.
Пример конфигурационных параметров: Пример конфигурационных параметров:
\code \code
<sensors name="Sensors"> <sensors name="Sensors">
... ...
<item name="MySensor_S" textname="my sesnsor" iotype="DI" <item name="MySensor_S" textname="my sesnsor" iotype="DI"
tcp_mbtype="rtu" tcp_mbaddr="0x01" tcp_mbfunc="0x04" tcp_mbreg="0x02" my_tcp="1" tcp_mbtype="rtu" tcp_mbaddr="0x01" tcp_mbfunc="0x04" tcp_mbreg="0x02" my_tcp="1"
/> />
... ...
</sensors> </sensors>
...@@ -125,9 +125,9 @@ ...@@ -125,9 +125,9 @@
К основным параметрам относятся следующие: К основным параметрам относятся следующие:
- \b tcp_mbtype - [rtu] - пока едиственный разрешённый тип. - \b tcp_mbtype - [rtu] - пока едиственный разрешённый тип.
- \b tcp_mbaddr - адрес RTU-устройства. - \b tcp_mbaddr - адрес RTU-устройства.
- \b tcp_mbreg - запрашиваемый/записываемый регистр. - \b tcp_mbreg - запрашиваемый/записываемый регистр.
- \b tcp_mbfunc - [0x1,0x2,0x3,...] функция опроса/записи. Разрешённые см. ModbusRTU::SlaveFunctionCode. - \b tcp_mbfunc - [0x1,0x2,0x3,...] функция опроса/записи. Разрешённые см. ModbusRTU::SlaveFunctionCode.
Помимо этого можно задавать следующие параметры: Помимо этого можно задавать следующие параметры:
- \b tcp_vtype - тип переменной. см VTypes::VType. - \b tcp_vtype - тип переменной. см VTypes::VType.
- \b tcp_rawdata - [0|1] - игнорировать или нет параметры калибровки - \b tcp_rawdata - [0|1] - игнорировать или нет параметры калибровки
...@@ -135,7 +135,7 @@ ...@@ -135,7 +135,7 @@
- \b tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется - \b tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется
функция читающая слова (03 функция читающая слова (03
- \b tcp_nbyte - [1|2] номер байта. Используется если tcp_vtype="byte". - \b tcp_nbyte - [1|2] номер байта. Используется если tcp_vtype="byte".
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи. - \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset". Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля: Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
...@@ -185,9 +185,9 @@ class MBTCPMaster: ...@@ -185,9 +185,9 @@ class MBTCPMaster:
MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
const std::string prefix="mbtcp" ); const std::string prefix="mbtcp" );
virtual ~MBTCPMaster(); virtual ~MBTCPMaster();
/*! глобальная функция для инициализации объекта */ /*! глобальная функция для инициализации объекта */
static MBTCPMaster* init_mbmaster( int argc, const char* const* argv, static MBTCPMaster* init_mbmaster( int argc, const char* const* argv,
UniSetTypes::ObjectId shmID, SharedMemory* ic=0, UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
const std::string prefix="mbtcp" ); const std::string prefix="mbtcp" );
...@@ -207,12 +207,12 @@ class MBTCPMaster: ...@@ -207,12 +207,12 @@ class MBTCPMaster:
virtual void step(); virtual void step();
virtual ModbusClient* initMB( bool reopen=false ); virtual ModbusClient* initMB( bool reopen=false );
void poll_thread(); void poll_thread();
void updateRespondSensors(); void updateRespondSensors();
virtual void sigterm( int signo ); virtual void sigterm( int signo );
bool force_disconnect; bool force_disconnect;
private: private:
......
...@@ -6,9 +6,71 @@ libMBMaster_la_LIBADD = $(top_builddir)/lib/libUniSet.la \ ...@@ -6,9 +6,71 @@ libMBMaster_la_LIBADD = $(top_builddir)/lib/libUniSet.la \
libMBMaster_la_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS) libMBMaster_la_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS)
libMBMaster_la_SOURCES = MBExchange.cc RTUStorage.cc libMBMaster_la_SOURCES = MBExchange.cc RTUStorage.cc
bin_PROGRAMS = @PACKAGE@-mbtcpmaster @PACKAGE@-rtuexchange @PACKAGE@-mtr-conv @PACKAGE@-rtu188-state @PACKAGE@-vtconv @PACKAGE@-mtr-setup
lib_LTLIBRARIES = libUniSetMBTCPMaster.la libUniSetRTU.la
# -------------------- Mobus TCP -------------------
# не забывайте править версию в pc-файле
UMBTCP_VER=1:2:1
libUniSetMBTCPMaster_la_LDFLAGS = -version-info $(UMBTCP_VER)
libUniSetMBTCPMaster_la_LIBADD = libMBMaster.la $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(SIGC_LIBS)
libUniSetMBTCPMaster_la_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS)
libUniSetMBTCPMaster_la_SOURCES = MBTCPMaster.cc
@PACKAGE@_mbtcpmaster_SOURCES = main.cc
@PACKAGE@_mbtcpmaster_LDADD = libUniSetMBTCPMaster.la libMBMaster.la $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(SIGC_LIBS)
@PACKAGE@_mbtcpmaster_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS)
# -------------------- Mobus RTU -------------------
# не забывайте править версию в pc-файле
URTU_VER=2:0:0
libUniSetRTU_la_LDFLAGS = -version-info $(URTU_VER)
libUniSetRTU_la_LIBADD = libMBMaster.la $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(SIGC_LIBS)
libUniSetRTU_la_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS)
libUniSetRTU_la_SOURCES = RTUExchange.cc
@PACKAGE@_rtuexchange_SOURCES = rtuexchange.cc
@PACKAGE@_rtuexchange_LDADD = libUniSetRTU.la libMBMaster.la $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(SIGC_LIBS)
@PACKAGE@_rtuexchange_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS)
@PACKAGE@_mtr_conv_SOURCES = mtrconv.cc
@PACKAGE@_mtr_conv_LDADD = $(top_builddir)/extensions/lib/libUniSetExtensions.la $(top_builddir)/lib/libUniSet.la
@PACKAGE@_mtr_conv_CXXFLAGS = -I$(top_builddir)/extensions/include
@PACKAGE@_mtr_setup_SOURCES = mtr-setup.cc
@PACKAGE@_mtr_setup_LDADD = $(top_builddir)/extensions/lib/libUniSetExtensions.la $(top_builddir)/lib/libUniSet.la
@PACKAGE@_mtr_setup_CXXFLAGS = -I$(top_builddir)/extensions/include
@PACKAGE@_vtconv_SOURCES = vtconv.cc
@PACKAGE@_vtconv_LDADD = $(top_builddir)/extensions/lib/libUniSetExtensions.la $(top_builddir)/lib/libUniSet.la
@PACKAGE@_vtconv_CXXFLAGS = -I$(top_builddir)/extensions/include
@PACKAGE@_rtu188_state_LDADD = libUniSetRTU.la libMBMaster.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la $(top_builddir)/lib/libUniSet.la
@PACKAGE@_rtu188_state_CXXFLAGS = -I$(top_builddir)/extensions/include
@PACKAGE@_rtu188_state_SOURCES = rtustate.cc
# install # install
devel_include_HEADERS = *.h devel_include_HEADERS = *.h
devel_includedir = $(pkgincludedir)/extensions devel_includedir = $(pkgincludedir)/extensions
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libUniSetMBTCPMaster.pc libUniSetRTU.pc
all-local: all-local:
ln -sf ../ModbusMaster/$(devel_include_HEADERS) ../include ln -sf ../ModbusMaster/$(devel_include_HEADERS) ../include
...@@ -39,8 +39,6 @@ allNotRespond(false) ...@@ -39,8 +39,6 @@ allNotRespond(false)
transmitCtl = conf->getArgInt("--"+prefix+"-transmit-ctl",it.getProp("transmitCtl")); transmitCtl = conf->getArgInt("--"+prefix+"-transmit-ctl",it.getProp("transmitCtl"));
defSpeed = ComPort::getSpeed(speed); defSpeed = ComPort::getSpeed(speed);
recv_timeout = conf->getArgPInt("--"+prefix+"-recv-timeout",it.getProp("recv_timeout"), 50);
int alltout = conf->getArgPInt("--"+prefix+"-all-timeout",it.getProp("all_timeout"), 2000); int alltout = conf->getArgPInt("--"+prefix+"-all-timeout",it.getProp("all_timeout"), 2000);
ptAllNotRespond.setTiming(alltout); ptAllNotRespond.setTiming(alltout);
...@@ -67,21 +65,6 @@ allNotRespond(false) ...@@ -67,21 +65,6 @@ allNotRespond(false)
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
RTUExchange::~RTUExchange() RTUExchange::~RTUExchange()
{ {
for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{
if( it1->second->rtu )
{
delete it1->second->rtu;
it1->second->rtu = 0;
}
RTUDevice* d(it1->second);
for( RTUExchange::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
delete it->second;
delete it1->second;
}
delete mbrtu; delete mbrtu;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -150,13 +133,13 @@ void RTUExchange::poll() ...@@ -150,13 +133,13 @@ void RTUExchange::poll()
{ {
if( trAllNotRespond.hi(allNotRespond) ) if( trAllNotRespond.hi(allNotRespond) )
ptAllNotRespond.reset(); ptAllNotRespond.reset();
if( allNotRespond && mb && ptAllNotRespond.checkTime() ) if( allNotRespond && mb && ptAllNotRespond.checkTime() )
{ {
ptAllNotRespond.reset(); ptAllNotRespond.reset();
initMB(true); initMB(true);
} }
if( !mb ) if( !mb )
{ {
initMB(false); initMB(false);
...@@ -170,20 +153,20 @@ void RTUExchange::poll() ...@@ -170,20 +153,20 @@ void RTUExchange::poll()
} }
ComPort::Speed s = mbrtu->getSpeed(); ComPort::Speed s = mbrtu->getSpeed();
for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 ) for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{ {
RTUDevice* d(it1->second); RTUDevice* d(it1->second);
if( d->speed != s ) if( d->speed != s )
{ {
s = d->speed; s = d->speed;
mbrtu->setSpeed(d->speed); mbrtu->setSpeed(d->speed);
} }
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(poll): ask addr=" << ModbusRTU::addr2str(d->mbaddr) << endl; dlog[Debug::INFO] << myname << "(poll): ask addr=" << ModbusRTU::addr2str(d->mbaddr) << endl;
if( d->dtype==RTUExchange::dtRTU188 ) if( d->dtype==RTUExchange::dtRTU188 )
{ {
if( !d->rtu ) if( !d->rtu )
...@@ -205,19 +188,19 @@ void RTUExchange::poll() ...@@ -205,19 +188,19 @@ void RTUExchange::poll()
d->resp_real = true; d->resp_real = true;
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
{ {
if( d->resp_real ) if( d->resp_real )
{ {
if( dlog.debugging(Debug::LEVEL3) ) if( dlog.debugging(Debug::LEVEL3) )
{ {
dlog[Debug::CRIT] << myname << "(poll): FAILED ask addr=" << ModbusRTU::addr2str(d->mbaddr) dlog[Debug::CRIT] << myname << "(poll): FAILED ask addr=" << ModbusRTU::addr2str(d->mbaddr)
<< " -> " << ex << endl; << " -> " << ex << endl;
} }
d->resp_real = false; d->resp_real = false;
} }
} }
} }
else else
{ {
d->resp_real = false; d->resp_real = false;
for( RTUExchange::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it ) for( RTUExchange::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
...@@ -233,7 +216,7 @@ void RTUExchange::poll() ...@@ -233,7 +216,7 @@ void RTUExchange::poll()
} }
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
{ {
// if( d->resp_real ) // if( d->resp_real )
// { // {
if( dlog.debugging(Debug::LEVEL3) ) if( dlog.debugging(Debug::LEVEL3) )
...@@ -255,7 +238,7 @@ void RTUExchange::poll() ...@@ -255,7 +238,7 @@ void RTUExchange::poll()
// update SharedMemory... // update SharedMemory...
updateSM(); updateSM();
// check thresholds // check thresholds
for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 ) for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{ {
...@@ -267,35 +250,8 @@ void RTUExchange::poll() ...@@ -267,35 +250,8 @@ void RTUExchange::poll()
IOBase::processingThreshold( &(*i),shm,force); IOBase::processingThreshold( &(*i),shm,force);
} }
} }
// printMap(rmap);
}
// -----------------------------------------------------------------------------
bool RTUExchange::RTUDevice::checkRespond()
{
bool prev = resp_state;
if( resp_trTimeout.hi(resp_real) )
{
if( resp_real )
resp_state = true;
resp_ptTimeout.reset();
}
if( resp_state && !resp_real && resp_ptTimeout.checkTime() ) // printMap(rmap);
resp_state = false;
// если ещё не инициализировали значение в SM
// то возвращаем true, чтобы оно принудительно сохранилось
if( !resp_init )
{
resp_state = resp_real;
resp_init = true;
prev = resp_state;
return true;
}
return ( prev != resp_state );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void RTUExchange::help_print( int argc, const char* const* argv ) void RTUExchange::help_print( int argc, const char* const* argv )
......
...@@ -16,7 +16,7 @@ class RTUExchange: ...@@ -16,7 +16,7 @@ class RTUExchange:
RTUExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, RTUExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID,
SharedMemory* ic=0, const std::string prefix="rs" ); SharedMemory* ic=0, const std::string prefix="rs" );
virtual ~RTUExchange(); virtual ~RTUExchange();
/*! глобальная функция для инициализации объекта */ /*! глобальная функция для инициализации объекта */
static RTUExchange* init_rtuexchange( int argc, const char* const* argv, static RTUExchange* init_rtuexchange( int argc, const char* const* argv,
UniSetTypes::ObjectId shmID, SharedMemory* ic=0, UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
...@@ -30,7 +30,6 @@ class RTUExchange: ...@@ -30,7 +30,6 @@ class RTUExchange:
UniSetTypes::uniset_mutex mbMutex; UniSetTypes::uniset_mutex mbMutex;
std::string devname; std::string devname;
ComPort::Speed defSpeed; ComPort::Speed defSpeed;
int recv_timeout;
bool use485F; bool use485F;
bool transmitCtl; bool transmitCtl;
......
...@@ -30,9 +30,9 @@ int main( int argc, const char** argv ) ...@@ -30,9 +30,9 @@ int main( int argc, const char** argv )
string logfilename(conf->getArgParam("--mbtcp-logfile")); string logfilename(conf->getArgParam("--mbtcp-logfile"));
if( logfilename.empty() ) if( logfilename.empty() )
logfilename = "mbtcpmaster.log"; logfilename = "mbtcpmaster.log";
conf->initDebug(dlog,"dlog"); conf->initDebug(dlog,"dlog");
std::ostringstream logname; std::ostringstream logname;
string dir(conf->getLogDir()); string dir(conf->getLogDir());
logname << dir << logfilename; logname << dir << logfilename;
...@@ -62,7 +62,7 @@ int main( int argc, const char** argv ) ...@@ -62,7 +62,7 @@ int main( int argc, const char** argv )
ObjectsActivator act; ObjectsActivator act;
act.addObject(static_cast<class UniSetObject*>(mb)); act.addObject(static_cast<class UniSetObject*>(mb));
SystemMessage sm(SystemMessage::StartUp); SystemMessage sm(SystemMessage::StartUp);
act.broadcast( sm.transport_msg() ); act.broadcast( sm.transport_msg() );
unideb(Debug::ANY) << "\n\n\n"; unideb(Debug::ANY) << "\n\n\n";
......
...@@ -72,7 +72,7 @@ enum Command ...@@ -72,7 +72,7 @@ enum Command
static char* checkArg( int ind, int argc, char* argv[] ); static char* checkArg( int ind, int argc, char* argv[] );
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
int main( int argc, char **argv ) int main( int argc, char **argv )
{ {
Command cmd = cmdNOP; Command cmd = cmdNOP;
int optindex = 0; int optindex = 0;
int opt = 0; int opt = 0;
...@@ -94,15 +94,15 @@ int main( int argc, char **argv ) ...@@ -94,15 +94,15 @@ int main( int argc, char **argv )
ComPort::Parity parity = ComPort::NoParity; ComPort::Parity parity = ComPort::NoParity;
// ModbusRTU::ModbusAddr b=255; // ModbusRTU::ModbusAddr b=255;
// //
// cout << "b=" << (int)b << " b++=" << (int)(b++) << endl; // cout << "b=" << (int)b << " b++=" << (int)(b++) << endl;
// return 0; // return 0;
try try
{ {
while( (opt = getopt_long(argc, argv, "hvw:r:x:d:s:t:l:n:yb:e:x:z:",longopts,&optindex)) != -1 ) while( (opt = getopt_long(argc, argv, "hvw:r:x:d:s:t:l:n:yb:e:x:z:",longopts,&optindex)) != -1 )
{ {
switch (opt) switch (opt)
{ {
case 'h': case 'h':
print_help(); print_help();
...@@ -112,7 +112,7 @@ int main( int argc, char **argv ) ...@@ -112,7 +112,7 @@ int main( int argc, char **argv )
cmd = cmdRead; cmd = cmdRead;
slaveaddr = ModbusRTU::str2mbAddr(optarg); slaveaddr = ModbusRTU::str2mbAddr(optarg);
break; break;
case 'w': case 'w':
cmd = cmdSave; cmd = cmdSave;
slaveaddr = ModbusRTU::str2mbAddr( optarg ); slaveaddr = ModbusRTU::str2mbAddr( optarg );
...@@ -134,7 +134,7 @@ int main( int argc, char **argv ) ...@@ -134,7 +134,7 @@ int main( int argc, char **argv )
cmd = cmdGetSerial; cmd = cmdGetSerial;
slaveaddr = ModbusRTU::str2mbAddr(optarg); slaveaddr = ModbusRTU::str2mbAddr(optarg);
break; break;
case 'y': case 'y':
use485 = 1; use485 = 1;
break; break;
...@@ -168,7 +168,7 @@ int main( int argc, char **argv ) ...@@ -168,7 +168,7 @@ int main( int argc, char **argv )
case 'b': case 'b':
beg = atoi(optarg); beg = atoi(optarg);
break; break;
case 'e': case 'e':
end = atoi(optarg); end = atoi(optarg);
break; break;
...@@ -180,12 +180,12 @@ int main( int argc, char **argv ) ...@@ -180,12 +180,12 @@ int main( int argc, char **argv )
case 'v': case 'v':
verb = 1; verb = 1;
break; break;
case 'l': case 'l':
{ {
if( cmd == cmdNOP ) if( cmd == cmdNOP )
cmd = cmdDetectSlave; cmd = cmdDetectSlave;
if( !checkArg(optind,argc,argv) ) if( !checkArg(optind,argc,argv) )
break; break;
reg = ModbusRTU::str2mbData(argv[optind+2]); reg = ModbusRTU::str2mbData(argv[optind+2]);
...@@ -200,9 +200,9 @@ int main( int argc, char **argv ) ...@@ -200,9 +200,9 @@ int main( int argc, char **argv )
{ {
if( cmd == cmdNOP ) if( cmd == cmdNOP )
cmd = cmdDetectSpeed; cmd = cmdDetectSpeed;
slaveaddr = ModbusRTU::str2mbAddr(optarg); slaveaddr = ModbusRTU::str2mbAddr(optarg);
if( !checkArg(optind,argc,argv) ) if( !checkArg(optind,argc,argv) )
break; break;
...@@ -226,20 +226,20 @@ int main( int argc, char **argv ) ...@@ -226,20 +226,20 @@ int main( int argc, char **argv )
{ {
cout << "(init): dev=" << dev << " speed=" << speed cout << "(init): dev=" << dev << " speed=" << speed
<< " timeout=" << tout << " msec " << " timeout=" << tout << " msec "
<< endl; << endl;
} }
ModbusRTUMaster mb(dev,use485); ModbusRTUMaster mb(dev,use485);
if( verb ) if( verb )
dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) ); dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) );
mb.setTimeout(tout); mb.setTimeout(tout);
mb.setSpeed(speed); mb.setSpeed(speed);
mb.setParity(parity); mb.setParity(parity);
mb.setStopBits(sbits); mb.setStopBits(sbits);
mb.setLog(dlog); mb.setLog(dlog);
switch(cmd) switch(cmd)
{ {
case cmdRead: case cmdRead:
...@@ -290,11 +290,11 @@ int main( int argc, char **argv ) ...@@ -290,11 +290,11 @@ int main( int argc, char **argv )
cout << "(mtr-setup): autodetect slave: " cout << "(mtr-setup): autodetect slave: "
<< " beg=" << ModbusRTU::addr2str(beg) << " beg=" << ModbusRTU::addr2str(beg)
<< " end=" << ModbusRTU::addr2str(end) << " end=" << ModbusRTU::addr2str(end)
<< " reg=" << ModbusRTU::dat2str(reg) << " reg=" << ModbusRTU::dat2str(reg)
<< " fn=" << ModbusRTU::b2str(fn) << " fn=" << ModbusRTU::b2str(fn)
<< endl; << endl;
} }
try try
{ {
ModbusRTU::ModbusAddr a = ModbusHelpers::autodetectSlave(&mb,beg,end,reg,fn); ModbusRTU::ModbusAddr a = ModbusHelpers::autodetectSlave(&mb,beg,end,reg,fn);
...@@ -312,20 +312,20 @@ int main( int argc, char **argv ) ...@@ -312,20 +312,20 @@ int main( int argc, char **argv )
if( verb ) if( verb )
{ {
cout << "(mtr-setup): autodetect speed: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) cout << "(mtr-setup): autodetect speed: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< " reg=" << ModbusRTU::dat2str(reg) << " reg=" << ModbusRTU::dat2str(reg)
<< " fn=" << ModbusRTU::b2str(fn) << " fn=" << ModbusRTU::b2str(fn)
<< endl; << endl;
} }
try try
{ {
ComPort::Speed s = ModbusHelpers::autodetectSpeed(&mb,slaveaddr,reg,fn); ComPort::Speed s = ModbusHelpers::autodetectSpeed(&mb,slaveaddr,reg,fn);
cout << "(mtr-setup): autodetect: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) cout << "(mtr-setup): autodetect: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< " speed=" << ComPort::getSpeed(s) << endl; << " speed=" << ComPort::getSpeed(s) << endl;
} }
catch( UniSetTypes::TimeOut ) catch( UniSetTypes::TimeOut )
{ {
cout << "(mtr-setup): speed not autodetect for slaveaddr=" cout << "(mtr-setup): speed not autodetect for slaveaddr="
<< ModbusRTU::addr2str(slaveaddr) << endl; << ModbusRTU::addr2str(slaveaddr) << endl;
} }
} }
...@@ -339,11 +339,11 @@ int main( int argc, char **argv ) ...@@ -339,11 +339,11 @@ int main( int argc, char **argv )
<< " slaveaddr=" << ModbusRTU::addr2str(slaveaddr) << " slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << endl;
} }
cout << "model: " << MTR::getModelNumber(&mb,slaveaddr) << endl; cout << "model: " << MTR::getModelNumber(&mb,slaveaddr) << endl;
} }
break; break;
case cmdGetSerial: case cmdGetSerial:
{ {
if( verb ) if( verb )
...@@ -352,17 +352,17 @@ int main( int argc, char **argv ) ...@@ -352,17 +352,17 @@ int main( int argc, char **argv )
<< " slaveaddr=" << ModbusRTU::addr2str(slaveaddr) << " slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << endl;
} }
cout << "serial: " << MTR::getSerialNumber(&mb,slaveaddr) << endl; cout << "serial: " << MTR::getSerialNumber(&mb,slaveaddr) << endl;
} }
break; break;
case cmdNOP: case cmdNOP:
default: default:
cerr << "No command. Use -h for help." << endl; cerr << "No command. Use -h for help." << endl;
return 1; return 1;
} }
return 0; return 0;
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
...@@ -389,7 +389,7 @@ char* checkArg( int i, int argc, char* argv[] ) ...@@ -389,7 +389,7 @@ char* checkArg( int i, int argc, char* argv[] )
{ {
if( i<argc && (argv[i])[0]!='-' ) if( i<argc && (argv[i])[0]!='-' )
return argv[i]; return argv[i];
return 0; return 0;
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -13,7 +13,7 @@ static void print_help() ...@@ -13,7 +13,7 @@ static void print_help()
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
int main( int argc, const char **argv ) int main( int argc, const char **argv )
{ {
unsigned short v1 = 0; unsigned short v1 = 0;
unsigned short v2 = 0; unsigned short v2 = 0;
const char* type=""; const char* type="";
...@@ -22,11 +22,11 @@ int main( int argc, const char **argv ) ...@@ -22,11 +22,11 @@ int main( int argc, const char **argv )
{ {
print_help(); print_help();
return 1; return 1;
} }
type = argv[1]; type = argv[1];
v1 = UniSetTypes::uni_atoi(argv[2]); v1 = UniSetTypes::uni_atoi(argv[2]);
if( argc>=4 ) if( argc>=4 )
{ {
v1 = UniSetTypes::uni_atoi(argv[3]); v1 = UniSetTypes::uni_atoi(argv[3]);
...@@ -63,23 +63,23 @@ int main( int argc, const char **argv ) ...@@ -63,23 +63,23 @@ int main( int argc, const char **argv )
else if( !strcmp(type,"T5") ) else if( !strcmp(type,"T5") )
{ {
T5 t(v1,v2); T5 t(v1,v2);
cout << "(T5): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1] cout << "(T5): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1]
<< " --> " << t.raw.u2.val << " * 10^" << (int)t.raw.u2.exp << " --> " << t.raw.u2.val << " * 10^" << (int)t.raw.u2.exp
<< " ===> " << t.val << endl; << " ===> " << t.val << endl;
} }
else if( !strcmp(type,"T6") ) else if( !strcmp(type,"T6") )
{ {
T6 t(v1,v2); T6 t(v1,v2);
cout << "(T6): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1] cout << "(T6): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1]
<< " --> " << t.raw.u2.val << " * 10^" << (int)t.raw.u2.exp << " --> " << t.raw.u2.val << " * 10^" << (int)t.raw.u2.exp
<< " ===> " << t.val << endl; << " ===> " << t.val << endl;
} }
else if( !strcmp(type,"T7") ) else if( !strcmp(type,"T7") )
{ {
T7 t(v1,v2); T7 t(v1,v2);
cout << "(T7): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1] cout << "(T7): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1]
// << " --> " << T7.val << " * 10^-4" // << " --> " << T7.val << " * 10^-4"
<< " ===> " << t.val << " ===> " << t.val
<< " [" << ( t.raw.u2.ic == 0xFF ? "CAP" : "IND" ) << "|" << " [" << ( t.raw.u2.ic == 0xFF ? "CAP" : "IND" ) << "|"
<< ( t.raw.u2.ie == 0xFF ? "EXP" : "IMP" ) << "]" << ( t.raw.u2.ie == 0xFF ? "EXP" : "IMP" ) << "]"
<< endl; << endl;
...@@ -87,7 +87,7 @@ int main( int argc, const char **argv ) ...@@ -87,7 +87,7 @@ int main( int argc, const char **argv )
else if( !strcmp(type,"T8") ) else if( !strcmp(type,"T8") )
{ {
T8 t(v1,v2); T8 t(v1,v2);
cout << "(T8): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1] cout << "(T8): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1]
<< " ===> " << setfill('0') << hex << " ===> " << setfill('0') << hex
<< setw(2) << t.hour() << ":" << setw(2) << t.min() << setw(2) << t.hour() << ":" << setw(2) << t.min()
<< " " << setw(2) << t.day() << "/" << setw(2) << t.mon() << " " << setw(2) << t.day() << "/" << setw(2) << t.mon()
...@@ -105,7 +105,7 @@ int main( int argc, const char **argv ) ...@@ -105,7 +105,7 @@ int main( int argc, const char **argv )
else if( !strcmp(type,"T10") ) else if( !strcmp(type,"T10") )
{ {
T10 t(v1,v2); T10 t(v1,v2);
cout << "(T10): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1] cout << "(T10): v1=" << t.raw.v[0] << " v2=" << t.raw.v[1]
<< " ===> " << setfill('0') << dec << " ===> " << setfill('0') << dec
<< setw(4) << t.year() << "/" << setw(2) << t.mon() << setw(4) << t.year() << "/" << setw(2) << t.mon()
<< "/" << setw(2) << t.day() << "/" << setw(2) << t.day()
...@@ -117,7 +117,7 @@ int main( int argc, const char **argv ) ...@@ -117,7 +117,7 @@ int main( int argc, const char **argv )
cout << "(F1): v1=" << f.raw.v[0] << " v2=" << f.raw.v[1] cout << "(F1): v1=" << f.raw.v[0] << " v2=" << f.raw.v[1]
<< " ===> " << f.raw.val << endl; << " ===> " << f.raw.val << endl;
} }
else else
{ {
cout << " Unknown type: " << type << endl; cout << " Unknown type: " << type << endl;
return 1; return 1;
......
...@@ -28,9 +28,9 @@ int main( int argc, char** argv ) ...@@ -28,9 +28,9 @@ int main( int argc, char** argv )
string logfilename(conf->getArgParam("--rs-logfile")); string logfilename(conf->getArgParam("--rs-logfile"));
if( logfilename.empty() ) if( logfilename.empty() )
logfilename = "rtuexchange.log"; logfilename = "rtuexchange.log";
conf->initDebug(dlog,"dlog"); conf->initDebug(dlog,"dlog");
std::ostringstream logname; std::ostringstream logname;
string dir(conf->getLogDir()); string dir(conf->getLogDir());
logname << dir << logfilename; logname << dir << logfilename;
...@@ -60,7 +60,7 @@ int main( int argc, char** argv ) ...@@ -60,7 +60,7 @@ int main( int argc, char** argv )
ObjectsActivator act; ObjectsActivator act;
act.addObject(static_cast<class UniSetObject*>(rs)); act.addObject(static_cast<class UniSetObject*>(rs));
SystemMessage sm(SystemMessage::StartUp); SystemMessage sm(SystemMessage::StartUp);
act.broadcast( sm.transport_msg() ); act.broadcast( sm.transport_msg() );
unideb(Debug::ANY) << "\n\n\n"; unideb(Debug::ANY) << "\n\n\n";
......
...@@ -30,7 +30,7 @@ static void print_help() ...@@ -30,7 +30,7 @@ static void print_help()
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
int main( int argc, char **argv ) int main( int argc, char **argv )
{ {
int optindex = 0; int optindex = 0;
int opt = 0; int opt = 0;
int verb = 0; int verb = 0;
...@@ -43,38 +43,38 @@ int main( int argc, char **argv ) ...@@ -43,38 +43,38 @@ int main( int argc, char **argv )
try try
{ {
while( (opt = getopt_long(argc, argv, "hva:d:s:t:q:",longopts,&optindex)) != -1 ) while( (opt = getopt_long(argc, argv, "hva:d:s:t:q:",longopts,&optindex)) != -1 )
{ {
switch (opt) switch (opt)
{ {
case 'h': case 'h':
print_help(); print_help();
return 0; return 0;
case 'd': case 'd':
dev = string(optarg); dev = string(optarg);
break; break;
case 's': case 's':
speed = string(optarg); speed = string(optarg);
break; break;
case 't': case 't':
tout = uni_atoi(optarg); tout = uni_atoi(optarg);
break; break;
case 'q': case 'q':
slaveaddr = ModbusRTU::str2mbAddr(optarg); slaveaddr = ModbusRTU::str2mbAddr(optarg);
break; break;
case 'v': case 'v':
verb = 1; verb = 1;
break; break;
case 'y': case 'y':
use485 = 1; use485 = 1;
break; break;
case '?': case '?':
default: default:
printf("? argumnet\n"); printf("? argumnet\n");
...@@ -84,26 +84,26 @@ int main( int argc, char **argv ) ...@@ -84,26 +84,26 @@ int main( int argc, char **argv )
if( verb ) if( verb )
{ {
cout << "(init): dev=" << dev cout << "(init): dev=" << dev
<< " speed=" << speed << " speed=" << speed
<< " timeout=" << tout << " msec " << " timeout=" << tout << " msec "
<< endl; << endl;
} }
ModbusRTUMaster mb(dev,use485); ModbusRTUMaster mb(dev,use485);
if( verb ) if( verb )
dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) ); dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) );
mb.setTimeout(tout); mb.setTimeout(tout);
mb.setSpeed(speed); mb.setSpeed(speed);
mb.setLog(dlog); mb.setLog(dlog);
RTUStorage rtu(slaveaddr); RTUStorage rtu(slaveaddr);
rtu.poll(&mb); rtu.poll(&mb);
cout << rtu << endl; cout << rtu << endl;
for( int i=0; i<24; i++ ) for( int i=0; i<24; i++ )
cout << "UNIO1 AI" << i << ": " << rtu.getFloat( RTUStorage::nJ1, i, UniversalIO::AnalogInput ) << endl; cout << "UNIO1 AI" << i << ": " << rtu.getFloat( RTUStorage::nJ1, i, UniversalIO::AnalogInput ) << endl;
for( int i=0; i<24; i++ ) for( int i=0; i<24; i++ )
......
...@@ -14,4 +14,3 @@ ...@@ -14,4 +14,3 @@
--mbtcp-polltime 5000 \ --mbtcp-polltime 5000 \
--mbtcp-exchange-mode-id MB1_Mode_AS --mbtcp-exchange-mode-id MB1_Mode_AS
#--mbtcp-filter-field mbtcp --mbtcp-filter-value 1 #--mbtcp-filter-field mbtcp --mbtcp-filter-value 1
../../Utilities/scripts/uniset-stop.sh
\ No newline at end of file
../../conf/test.xml
\ No newline at end of file
../../Utilities/scripts/uniset-functions.sh
\ No newline at end of file
...@@ -13,11 +13,11 @@ static void print_help() ...@@ -13,11 +13,11 @@ static void print_help()
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
int main( int argc, const char **argv ) int main( int argc, const char **argv )
{ {
/* /*
VTypes::F2 f2; VTypes::F2 f2;
f2.raw.val = 2.345; f2.raw.val = 2.345;
cout << "Example(F2): float=" << f2.raw.val cout << "Example(F2): float=" << f2.raw.val
<< " regs:" << " regs:"
<< " v[0]=" << f2.raw.v[0] << " v[0]=" << f2.raw.v[0]
...@@ -26,7 +26,7 @@ int main( int argc, const char **argv ) ...@@ -26,7 +26,7 @@ int main( int argc, const char **argv )
VTypes::F4 f4; VTypes::F4 f4;
f4.raw.val = 2.345123123; f4.raw.val = 2.345123123;
cout << "Example(F4): float=" << f4.raw.val cout << "Example(F4): float=" << f4.raw.val
<< " regs:" << " regs:"
<< " v[0]=" << f4.raw.v[0] << " v[0]=" << f4.raw.v[0]
...@@ -34,7 +34,7 @@ int main( int argc, const char **argv ) ...@@ -34,7 +34,7 @@ int main( int argc, const char **argv )
<< " v[2]=" << f4.raw.v[2] << " v[2]=" << f4.raw.v[2]
<< " v[3]=" << f4.raw.v[3] << " v[3]=" << f4.raw.v[3]
<< endl; << endl;
cout << "-------------" << endl << endl; cout << "-------------" << endl << endl;
VTypes::I2 i2; VTypes::I2 i2;
...@@ -44,7 +44,7 @@ int main( int argc, const char **argv ) ...@@ -44,7 +44,7 @@ int main( int argc, const char **argv )
<< " v[0]=" << i2.raw.v[0] << " v[0]=" << i2.raw.v[0]
<< " v[1]=" << i2.raw.v[1] << " v[1]=" << i2.raw.v[1]
<< endl; << endl;
cout << "-------------" << endl << endl; cout << "-------------" << endl << endl;
VTypes::U2 u2; VTypes::U2 u2;
...@@ -54,7 +54,7 @@ int main( int argc, const char **argv ) ...@@ -54,7 +54,7 @@ int main( int argc, const char **argv )
<< " v[0]=" << u2.raw.v[0] << " v[0]=" << u2.raw.v[0]
<< " v[1]=" << u2.raw.v[1] << " v[1]=" << u2.raw.v[1]
<< endl; << endl;
cout << "-------------" << endl << endl; cout << "-------------" << endl << endl;
// return 0; // return 0;
...@@ -68,11 +68,11 @@ int main( int argc, const char **argv ) ...@@ -68,11 +68,11 @@ int main( int argc, const char **argv )
{ {
print_help(); print_help();
return 1; return 1;
} }
type = argv[1]; type = argv[1];
v[0] = UniSetTypes::uni_atoi(argv[2]); v[0] = UniSetTypes::uni_atoi(argv[2]);
if( argc>3 ) if( argc>3 )
v[1] = UniSetTypes::uni_atoi(argv[3]); v[1] = UniSetTypes::uni_atoi(argv[3]);
...@@ -85,14 +85,14 @@ int main( int argc, const char **argv ) ...@@ -85,14 +85,14 @@ int main( int argc, const char **argv )
if( !strcmp(type,"F2") ) if( !strcmp(type,"F2") )
{ {
VTypes::F2 f(v,sizeof(v)); VTypes::F2 f(v,sizeof(v));
cout << "(F2): v[0]=" << v[0] cout << "(F2): v[0]=" << v[0]
<< " v[1]=" << v[1] << " v[1]=" << v[1]
<< " --> (float) " << (float)f << endl; << " --> (float) " << (float)f << endl;
} }
else if( !strcmp(type,"F4") ) else if( !strcmp(type,"F4") )
{ {
VTypes::F4 f(v,sizeof(v)); VTypes::F4 f(v,sizeof(v));
cout << "(F4): v[0]=" << v[0] cout << "(F4): v[0]=" << v[0]
<< " v[1]=" << v[1] << " v[1]=" << v[1]
<< " v[2]=" << v[2] << " v[2]=" << v[2]
<< " v[3]=" << v[3] << " v[3]=" << v[3]
...@@ -101,18 +101,18 @@ int main( int argc, const char **argv ) ...@@ -101,18 +101,18 @@ int main( int argc, const char **argv )
else if( !strcmp(type,"I2") ) else if( !strcmp(type,"I2") )
{ {
VTypes::I2 i(v,sizeof(v)); VTypes::I2 i(v,sizeof(v));
cout << "(I2): v[0]=" << v[0] cout << "(I2): v[0]=" << v[0]
<< " v[1]=" << v[1] << " v[1]=" << v[1]
<< " --> (int) " << (int)i << endl; << " --> (int) " << (int)i << endl;
} }
else if( !strcmp(type,"U2") ) else if( !strcmp(type,"U2") )
{ {
VTypes::U2 i(v,sizeof(v)); VTypes::U2 i(v,sizeof(v));
cout << "(U2): v[0]=" << v[0] cout << "(U2): v[0]=" << v[0]
<< " v[1]=" << v[1] << " v[1]=" << v[1]
<< " --> (unsigned int) " << (unsigned int)i << endl; << " --> (unsigned int) " << (unsigned int)i << endl;
} }
else else
{ {
cout << " Unknown type: " << type << endl; cout << " Unknown type: " << type << endl;
} }
......
bin_PROGRAMS = @PACKAGE@-rtuexchange @PACKAGE@-mtr-conv @PACKAGE@-rtu188-state @PACKAGE@-vtconv @PACKAGE@-mtr-setup
# не забывайте править версию в pc-файле
URTU_VER=2:0:0
lib_LTLIBRARIES = libUniSetRTU.la
libUniSetRTU_la_LDFLAGS = -version-info $(URTU_VER)
libUniSetRTU_la_LIBADD = $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(top_builddir)/extensions/ModbusMaster/libMBMaster.la \
$(SIGC_LIBS)
libUniSetRTU_la_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory -I$(top_builddir)/extensions/ModbusMaster $(SIGC_CFLAGS)
libUniSetRTU_la_SOURCES = RTUExchange.cc
@PACKAGE@_rtuexchange_SOURCES = rtuexchange.cc
@PACKAGE@_rtuexchange_LDADD = libUniSetRTU.la $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(top_builddir)/extensions/ModbusMaster/libMBMaster.la \
$(SIGC_LIBS)
@PACKAGE@_rtuexchange_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory -I$(top_builddir)/extensions/ModbusMaster $(SIGC_CFLAGS)
@PACKAGE@_mtr_conv_SOURCES = mtrconv.cc
@PACKAGE@_mtr_conv_LDADD = $(top_builddir)/extensions/lib/libUniSetExtensions.la $(top_builddir)/lib/libUniSet.la
@PACKAGE@_mtr_conv_CXXFLAGS = -I$(top_builddir)/extensions/include
@PACKAGE@_mtr_setup_SOURCES = mtr-setup.cc
@PACKAGE@_mtr_setup_LDADD = $(top_builddir)/extensions/lib/libUniSetExtensions.la $(top_builddir)/lib/libUniSet.la
@PACKAGE@_mtr_setup_CXXFLAGS = -I$(top_builddir)/extensions/include
@PACKAGE@_vtconv_SOURCES = vtconv.cc
@PACKAGE@_vtconv_LDADD = $(top_builddir)/extensions/lib/libUniSetExtensions.la $(top_builddir)/lib/libUniSet.la
@PACKAGE@_vtconv_CXXFLAGS = -I$(top_builddir)/extensions/include
@PACKAGE@_rtu188_state_LDADD = libUniSetRTU.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/ModbusMaster/libMBMaster.la
@PACKAGE@_rtu188_state_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/ModbusMaster
@PACKAGE@_rtu188_state_SOURCES = rtustate.cc
# install
devel_include_HEADERS = *.h
devel_includedir = $(pkgincludedir)/extensions
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libUniSetRTU.pc
all-local:
ln -sf ../RTUExchange/$(devel_include_HEADERS) ../include
#!/bin/sh
ln -s -f ../../Utilities/scripts/uniset-start.sh
ln -s -f ../../Utilities/scripts/uniset-stop.sh stop.sh
ln -s -f ../../Utilities/scripts/uniset-functions.sh
ln -s -f ../../conf/test.xml test.xml
...@@ -7,8 +7,7 @@ ...@@ -7,8 +7,7 @@
#include "ModbusTypes.h" #include "ModbusTypes.h"
#include "ModbusClient.h" #include "ModbusClient.h"
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
/*! Modbus TCP master interface /*! Modbus TCP master interface */
*/
class ModbusTCPMaster: class ModbusTCPMaster:
public ModbusClient public ModbusClient
{ {
......
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