You need to sign in or sign up before continuing.
Commit ec7601f7 authored by Pavel Vainerman's avatar Pavel Vainerman

(SMemoryPlus): сделал универсальным процесс запуска и добавление

необходимых процессов (--add-xxx)
parent 3a416724
......@@ -1163,40 +1163,35 @@ IOControl* IOControl::init_iocontrol( int argc, const char* const* argv,
// -----------------------------------------------------------------------------
void IOControl::help_print( int argc, const char* const* argv )
{
cout << "--io-confnode name - Использовать для настройки указанный xml-узел" << endl;
cout << "--io-name name - ID процесса. По умолчанию IOController1." << endl;
cout << "--io-numcards - Количество кард в/в. По умолчанию 1." << endl;
cout << "--iodev0 dev - Использовать для card='0' указанный файл comedi-устройства." << endl;
cout << "--iodev1 dev - Использовать для card='1' указанный файл comedi-устройства." << endl;
cout << "--iodev2 dev - Использовать для card='2' указанный файл comedi-устройства." << endl;
cout << "--iodev3 dev - Использовать для card='3' указанный файл comedi-устройства." << endl;
cout << "--iodevX dev - Использовать для card='X' указанный файл comedi-устройства." << endl;
cout << " 'X' не должен быть больше --io-numcards" << endl;
cout << "--iodevX-subdevX-type name - Настройка типа подустройства для UNIO." << endl ;
cout << "--prefix-confnode name - Использовать для настройки указанный xml-узел" << endl;
cout << "--prefix-name name - ID процесса. По умолчанию IOController1." << endl;
cout << "--prefix-numcards - Количество кард в/в. По умолчанию 1." << endl;
cout << "--prefix-devX dev - Использовать для card='X' указанный файл comedi-устройства." << endl;
cout << " 'X' не должен быть больше --prefix-numcards" << endl;
cout << "--prefix-devX-subdevX-type name - Настройка типа подустройства для UNIO." << endl ;
cout << " Разрешены: TBI0_24,TBI24_0,TBI16_8" << endl;
cout << "--io-default_cardnum - Номер карты по умолчанию. По умолчанию -1." << endl;
cout << "--prefix-default_cardnum - Номер карты по умолчанию. По умолчанию -1." << endl;
cout << " Если задать, то он будет использоватся для датчиков" << endl;
cout << " у которых не задано поле 'card'." << endl;
cout << "--io-test-lamp - Для данного узла в качестве датчика кнопки 'ТестЛамп' использовать указанный датчик." << endl;
cout << "--io-conf-field fname - Считывать из конф. файла все датчики с полем fname='1'" << endl;
cout << "--io-polltime msec - Пауза между опросом карт. По умолчанию 200 мсек." << endl;
cout << "--io-filtersize val - Размерность фильтра для аналоговых входов." << endl;
cout << "--io-filterT val - Постоянная времени фильтра." << endl;
cout << "--io-s-filter-field - Идентификатор в configure.xml по которому считывается список относящихся к это процессу датчиков" << endl;
cout << "--io-s-filter-value - Значение идентификатора по которому считывается список относящихся к это процессу датчиков" << endl;
cout << "--io-blink-time msec - Частота мигания, мсек. По умолчанию в configure.xml" << endl;
cout << "--io-blink2-time msec - Вторая частота мигания (lmpBLINK2), мсек. По умолчанию в configure.xml" << endl;
cout << "--io-blink3-time msec - Вторая частота мигания (lmpBLINK3), мсек. По умолчанию в configure.xml" << endl;
cout << "--io-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком." << endl;
cout << "--io-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10." << endl;
cout << "--io-ready-timeout - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')" << endl;
cout << "--io-force - Сохранять значения в SM, независимо от, того менялось ли значение" << endl;
cout << "--io-force-out - Обновлять выходы принудительно (не по заказу)" << endl;
cout << "--io-skip-init-output - Не инициализировать 'выходы' при старте" << endl;
cout << "--io-sm-ready-test-sid - Использовать указанный датчик, для проверки готовности SharedMemory" << endl;
cout << "--prefix-test-lamp - Для данного узла в качестве датчика кнопки 'ТестЛамп' использовать указанный датчик." << endl;
cout << "--prefix-conf-field fname - Считывать из конф. файла все датчики с полем fname='1'" << endl;
cout << "--prefix-polltime msec - Пауза между опросом карт. По умолчанию 200 мсек." << endl;
cout << "--prefix-filtersize val - Размерность фильтра для аналоговых входов." << endl;
cout << "--prefix-filterT val - Постоянная времени фильтра." << endl;
cout << "--prefix-s-filter-field - Идентификатор в configure.xml по которому считывается список относящихся к это процессу датчиков" << endl;
cout << "--prefix-s-filter-value - Значение идентификатора по которому считывается список относящихся к это процессу датчиков" << endl;
cout << "--prefix-blink-time msec - Частота мигания, мсек. По умолчанию в configure.xml" << endl;
cout << "--prefix-blink2-time msec - Вторая частота мигания (lmpBLINK2), мсек. По умолчанию в configure.xml" << endl;
cout << "--prefix-blink3-time msec - Вторая частота мигания (lmpBLINK3), мсек. По умолчанию в configure.xml" << endl;
cout << "--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком." << endl;
cout << "--prefix-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10." << endl;
cout << "--prefix-ready-timeout - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')" << endl;
cout << "--prefix-force - Сохранять значения в SM, независимо от, того менялось ли значение" << endl;
cout << "--prefix-force-out - Обновлять выходы принудительно (не по заказу)" << endl;
cout << "--prefix-skip-init-output - Не инициализировать 'выходы' при старте" << endl;
cout << "--prefix-sm-ready-test-sid - Использовать указанный датчик, для проверки готовности SharedMemory" << endl;
}
// -----------------------------------------------------------------------------
void IOControl::processingMessage( UniSetTypes::VoidMessage* msg )
......
#!/bin/sh
ln -s -f /usr/bin/uniset-stop.sh stop.sh
ln -s -f ../../conf/test.xml test.xml
// --------------------------------------------------------------------------
#include <string>
#include <sys/wait.h>
#include <error.h>
#include <errno.h>
#include <Debug.h>
#include <ObjectsActivator.h>
#include <ThreadCreator.h>
......@@ -18,39 +20,36 @@ using namespace std;
using namespace UniSetTypes;
using namespace UniSetExtensions;
// --------------------------------------------------------------------------
const int MaxAddNum = 10;
// --------------------------------------------------------------------------
void on_sigchild( int sig )
{
// while( waitpid(0,NULL,WNOHANG) > 0 ){}
while(1)
{
int istatus;
pid_t pid = waitpid( -1, &istatus, WNOHANG );
if( pid == -1 && errno == EINTR ) continue;
if( pid <= 0 ) break;
}
}
// --------------------------------------------------------------------------
static void help_print( int argc, const char* argv[] );
// --------------------------------------------------------------------------
int main( int argc, const char **argv )
{
if( argc>1 && strcmp(argv[1],"--help")==0 )
if( argc>1 && ( strcmp(argv[1],"--help")==0 || strcmp(argv[1],"-h")==0 ) )
{
help_print( argc, argv);
return 0;
}
bool add_io = findArgParam("--add-io",argc,argv) != -1;
bool add_rtu = findArgParam("--add-rtu",argc,argv) != -1;
bool add_rtu2 = findArgParam("--add-rtu2",argc,argv) != -1;
bool add_mbslave = findArgParam("--add-mbslave",argc,argv) != -1;
bool add_io2 = findArgParam("--add-io2",argc,argv) != -1;
bool add_mbmaster = findArgParam("--add-mbmaster",argc,argv) != -1;
bool add_mbmaster2 = findArgParam("--add-mbmaster2",argc,argv) != -1;
bool add_mbmaster3 = findArgParam("--add-mbmaster3",argc,argv) != -1;
//bool add_uniexchange = findArgParam("--add-unet",argc,argv) != -1;
//bool add_uniexchange2 = findArgParam("--add-unet2",argc,argv) != -1;
bool add_unetudp = findArgParam("--add-unetudp",argc,argv) != -1;
bool add_mbtcp_ses1 = findArgParam("--add-mbtcp-ses1",argc,argv) != -1;
bool add_mbtcp_ses2 = findArgParam("--add-mbtcp-ses2",argc,argv) != -1;
bool add_mbtcp_ses3 = findArgParam("--add-mbtcp-ses3",argc,argv) != -1;
bool add_mbtcp_ses4 = findArgParam("--add-mbtcp-ses4",argc,argv) != -1;
try
{
string confile = UniSetTypes::getArgParam( "--confile", argc, argv, "configure.xml" );
conf = new Configuration(argc, argv, confile);
string logfilename = conf->getArgParam("--logfile", "smemory2.log");
string logfilename = conf->getArgParam("--logfile", "smemory-plus.log");
string logname( conf->getLogDir() + logfilename );
UniSetExtensions::dlog.logFile( logname );
unideb.logFile( logname );
......@@ -63,155 +62,104 @@ int main( int argc, const char **argv )
return 1;
act.addManager(static_cast<class ObjectsManager*>(shm));
// ------------ IOControl ----------------
std::list< ThreadCreator<IOControl>* > lst_iothr;
for( int i=0; i<MaxAddNum; i++ )
{
ThreadCreator<IOControl>* io_thr = NULL;
stringstream s;
s << "--add-io";
if( i>0 ) s << i;
bool add_io = findArgParam(s.str(),argc,argv) != -1;
if( add_io )
{
IOControl* ic = IOControl::init_iocontrol(argc,argv,shm->getId(),shm);
stringstream p;
p << "io";
if( i > 0 ) p << i;
IOControl* ic = IOControl::init_iocontrol(argc,argv,shm->getId(),shm,p.str());
if( ic == NULL )
return 1;
io_thr = new ThreadCreator<IOControl>(ic, &IOControl::execute);
ThreadCreator<IOControl>* io_thr = new ThreadCreator<IOControl>(ic, &IOControl::execute);
if( io_thr == NULL )
return 1;
act.addObject(static_cast<class UniSetObject*>(ic));
lst_iothr.push_back( io_thr );
}
// ------------- IOControl2 --------------
ThreadCreator<IOControl>* io2_thr = NULL;
if( add_io2 )
{
IOControl* ic2 = IOControl::init_iocontrol(argc,argv,shm->getId(),shm,"io2");
if( ic2 == NULL )
return 1;
io2_thr = new ThreadCreator<IOControl>(ic2, &IOControl::execute);
if( io2_thr == NULL )
return 1;
act.addObject(static_cast<class UniSetObject*>(ic2));
}
// ------------- RTU Exchange --------------
for( int i=0; i<MaxAddNum; i++ )
{
stringstream s;
s << "--add-rtu";
if( i>0 ) s << i;
bool add_rtu = findArgParam(s.str(),argc,argv) != -1;
if( add_rtu )
{
RTUExchange* rtu = RTUExchange::init_rtuexchange(argc,argv,shm->getId(),shm,"rs");
stringstream p;
p << "rtu";
if( i > 0 ) p << i;
RTUExchange* rtu = RTUExchange::init_rtuexchange(argc,argv,shm->getId(),shm,p.str());
if( rtu == NULL )
return 1;
act.addObject(static_cast<class UniSetObject*>(rtu));
}
// ------------- RTU2 Exchange --------------
if( add_rtu2 )
{
RTUExchange* rtu2 = RTUExchange::init_rtuexchange(argc,argv,shm->getId(),shm,"rs2");
if( rtu2 == NULL )
return 1;
act.addObject(static_cast<class UniSetObject*>(rtu2));
}
// ------------- MBSlave --------------
if( add_mbslave )
for( int i=0; i<MaxAddNum; i++ )
{
MBSlave* mbs = MBSlave::init_mbslave(argc,argv,shm->getId(),shm);
if( mbs == NULL )
return 1;
stringstream s;
s << "--add-mbslave";
if( i>0 ) s << i;
act.addObject(static_cast<class UniSetObject*>(mbs));
}
// ------------- MBTCPMaster 1 --------------
if( add_mbmaster )
bool add_mbslave = findArgParam(s.str(),argc,argv) != -1;
if( add_mbslave )
{
MBTCPMaster* mbm1 = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(),shm,"mbtcp");
if( mbm1 == NULL )
return 1;
stringstream p;
p << "mbs";
if( i > 0 ) p << i;
act.addObject(static_cast<class UniSetObject*>(mbm1));
}
// ------------- MBTCPMaster 2 --------------
if( add_mbmaster2 )
{
MBTCPMaster* mbm2 = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(),shm,"mbtcp2");
if( mbm2 == NULL )
MBSlave* mbs = MBSlave::init_mbslave(argc,argv,shm->getId(),shm,p.str());
if( mbs == NULL )
return 1;
act.addObject(static_cast<class UniSetObject*>(mbm2));
act.addObject(static_cast<class UniSetObject*>(mbs));
}
// ------------- MBTCPMaster 3 --------------
if( add_mbmaster3 )
{
MBTCPMaster* mbm3 = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(),shm,"mbtcp3");
if( mbm3 == NULL )
return 1;
act.addObject(static_cast<class UniSetObject*>(mbm3));
}
#if 0
UniExchnage deprecated
// ------------- UniExchange 1 --------------
ThreadCreator<UniExchange>* unet_thr = NULL;
if( add_uniexchange )
{
UniExchange* unet = UniExchange::init_exchange(argc,argv,shm->getId(),shm,"unet");
if( unet == NULL )
return 1;
unet_thr = new ThreadCreator<UniExchange>(unet, &UniExchange::execute);
if( unet_thr == NULL )
return 1;
act.addManager(static_cast<class ObjectsManager*>(unet));
}
// ------------- UniExchange 2 --------------
ThreadCreator<UniExchange>* unet2_thr = NULL;
if( add_uniexchange2 )
// ------------- MBTCPMaster --------------
for( int i=0; i<MaxAddNum; i++ )
{
UniExchange* unet2 = UniExchange::init_exchange(argc,argv,shm->getId(),shm,"unet2");
if( unet2 == NULL )
return 1;
stringstream s;
s << "--add-mbtcp";
if( i>0 ) s << i;
unet2_thr = new ThreadCreator<UniExchange>(unet2, &UniExchange::execute);
if( unet2_thr == NULL )
return 1;
act.addManager(static_cast<class ObjectsManager*>(unet2));
}
#endif
// ------------- MBTCPMaster SES1 --------------
if( add_mbtcp_ses1 )
{
MBTCPMaster* mbm_ses1 = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(),shm,"mbtcp-ses1");
if( mbm_ses1 == NULL )
return 1;
bool add_mbmaster = findArgParam(s.str(),argc,argv) != -1;
act.addObject(static_cast<class UniSetObject*>(mbm_ses1));
}
// ------------- MBTCPMaster SES2 --------------
if( add_mbtcp_ses2 )
if( add_mbmaster )
{
MBTCPMaster* mbm_ses2 = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(),shm,"mbtcp-ses2");
if( mbm_ses2 == NULL )
return 1;
stringstream p;
p << "mbtcp";
if( i > 0 ) p << i;
act.addObject(static_cast<class UniSetObject*>(mbm_ses2));
}
// ------------- MBTCPMaster SES3 --------------
if( add_mbtcp_ses3 )
{
MBTCPMaster* mbm_ses3 = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(),shm,"mbtcp-ses3");
if( mbm_ses3 == NULL )
MBTCPMaster* mbm1 = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(),shm,p.str());
if( mbm1 == NULL )
return 1;
act.addObject(static_cast<class UniSetObject*>(mbm_ses3));
act.addObject(static_cast<class UniSetObject*>(mbm1));
}
// ------------- MBTCPMaster SES4 --------------
if( add_mbtcp_ses4 )
{
MBTCPMaster* mbm_ses4 = MBTCPMaster::init_mbmaster(argc,argv,shm->getId(),shm,"mbtcp-ses4");
if( mbm_ses4 == NULL )
return 1;
act.addObject(static_cast<class UniSetObject*>(mbm_ses4));
}
// ------------- UNetUDP --------------
if( add_unetudp )
bool add_unet = findArgParam("--add-unet",argc,argv) != -1;
if( add_unet )
{
UNetExchange* unet = UNetExchange::init_unetexchange(argc,argv,shm->getId(),shm);
if( unet == NULL )
......@@ -220,24 +168,17 @@ int main( int argc, const char **argv )
act.addObject(static_cast<class UniSetObject*>(unet));
}
// ---------------------------------------
// попытка решить вопрос с "зомби" процессами
signal( SIGCHLD, on_sigchild );
// ---------------------------------------
SystemMessage sm(SystemMessage::StartUp);
act.broadcast( sm.transport_msg() );
if( io_thr )
io_thr->start();
if( io2_thr )
io2_thr->start();
for( std::list< ThreadCreator<IOControl>* >::iterator it=lst_iothr.begin(); it!=lst_iothr.end(); ++it )
(*it)->start();
/*
if( unet_thr )
unet_thr->start();
if( unet2_thr )
unet2_thr->start();
*/
act.run(false);
while( waitpid(-1, 0, 0) > 0 );
on_sigchild(SIGTERM);
return 0;
}
......@@ -254,62 +195,39 @@ int main( int argc, const char **argv )
unideb[Debug::CRIT] << "(smemory-plus): catch(...)" << endl;
}
while( waitpid(-1, 0, 0) > 0 );
on_sigchild(SIGTERM);
return 1;
}
// --------------------------------------------------------------------------
void help_print( int argc, const char* argv[])
{
cout << "--skip-io - skip IOControl" << endl;
cout << "--add-rtu - Start RTUExchange" << endl;
cout << "--add-rtu2 - Start RTUExchange2" << endl;
cout << "--add-mbslave - Start ModbusSlave" << endl;
cout << "--add-io2 - Start IOControl2" << endl;
cout << "--add-mbmaster - Start MBTCPMaster" << endl;
cout << "--add-mbmaster2 - Start MBTCPMaster2" << endl;
cout << "--add-mbmaster3 - Start MBTCPMaster3" << endl;
cout << "--add-unet - Start UniNetwork" << endl;
cout << "--add-mbtcp-ses1 - Exchange for FastwelIO (gdg1)" << endl;
cout << "--add-mbtcp-ses2 - Exchange for FastwelIO (gdg2)" << endl;
cout << "--add-mbtcp-ses3 - Exchange for FastwelIO (gdg3)" << endl;
cout << "--add-mbtcp-ses4 - Exchange for FastwelIO (gdg4)" << endl;
cout << "--add-uniset-unet2 - Exchange for UNet2" << endl;
cout << "\n ###### SM options ###### \n" << endl;
const int mnum = MaxAddNum - 1;
cout << "--add-io[2..." << mnum << "] - Start IOControl" << endl;
cout << "--add-rtu[2..." << mnum << "] - Start RTUExchange (rtu master)" << endl;
cout << "--add-mbslave[2..." << mnum << "] - Start ModbusSlave (RTU or TCP)" << endl;
cout << "--add-mbmaster[2..." << mnum << "] - Start MBTCPMaster" << endl;
cout << "--add-unet - Start UNetExchange (UNetUDP)" << endl;
cout << endl << "###### SM options ######" << endl;
SharedMemory::help_print(argc,argv);
cout << "\n ###### IO options ###### \n" << endl;
cout << endl << "###### IO options ###### (prefix: --ioX)" << endl;
IOControl::help_print(argc,argv);
cout << "\n ###### RTU options ###### \n" << endl;
cout << endl << "###### RTU options ###### (prefix: --rtuX)" << endl;
RTUExchange::help_print(argc,argv);
cout << "\n ###### ModbusSlave options ###### \n" << endl;
cout << endl << "###### ModbusSlave options (prefix: --mbsX) ######" << endl;
MBSlave::help_print(argc,argv);
cout << "\n ###### ModbusTCP Master options ###### \n" << endl;
cout << endl << "###### ModbusTCP Master options (prefix: --mbtcpX) ######" << endl;
MBTCPMaster::help_print(argc,argv);
// cout << "\n ###### UniExchange options ###### \n" << endl;
// UniExchange::help_print(argc,argv);
cout << "\n ###### UNetExchange options ###### \n" << endl;
cout << endl << "###### UNetExchange options ######" << endl;
UNetExchange::help_print(argc,argv);
// CanExchange::help_print(argc,argv); //не реализована!!!
cout << "\n ###### Common options ###### \n" << endl;
cout << "--confile - " << endl;
cout << "--logfile - " << endl;
cout << "--myEDS - " << endl;
cout << "--slaveEDS - " << endl;
cout << "--nodeID - " << endl;
cout << "--initPause - " << endl;
cout << "--baudrate - " << endl;
cout << "--maxHBValue - " << endl;
cout << "--nodeName - " << endl;
cout << "--sendTime - " << endl;
cout << "--lifeTime - " << endl;
cout << "--workTime - " << endl;
cout << "--receiveTime - " << endl;
cout << endl << "###### Common options ######" << endl;
cout << "--confile - Use confile. Default: configure.xml" << endl;
cout << "--logfile - Use logfile. Default: smemory-plus.log" << endl;
}
......@@ -26,9 +26,3 @@ ${START} -f ./uniset-smemory-plus --smemory-id SharedMemory --confile test.xml
# --rs-dev /dev/cbsideA1 \
# --rs-id RTUExchange \
# --add-mbslave \
#--skip-rtu1 --skip-rtu2 --skip-can --dlog-add-levels info,warn,crit
#--c-filter-value 1 --unideb-add-levels level9,warn,crit,info --dlog-add-levels info,warn,crit
#--unideb-add-levels info,warn,crit,system,repository
../../Utilities/scripts/uniset-stop.sh
\ No newline at end of file
../../conf/test.xml
\ No newline at end of file
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