Commit 5b9fc568 authored by Pavel Vainerman's avatar Pavel Vainerman

add ModbusTCPMaster extention (process)

parent d29dd69b
...@@ -46,6 +46,10 @@ ...@@ -46,6 +46,10 @@
<SharedMemory name="SharedMemory" shmID="SharedMemory"/> <SharedMemory name="SharedMemory" shmID="SharedMemory"/>
<MBMaster1 name="MBMaster1" iaddr="127.0.0.1" addr="0x31" port="30000"
levels="info,warn,crit" poll_time="200" reply_timeout="60"
/>
<MBSlave1 name="MBSlave1" dev="/dev/ttyS0" addr="0x31" speed="9600" <MBSlave1 name="MBSlave1" dev="/dev/ttyS0" addr="0x31" speed="9600"
aftersend-pause="0" levels="info,warn,crit" poll_time="200" reply_timeout="60" aftersend-pause="0" levels="info,warn,crit" poll_time="200" reply_timeout="60"
> >
...@@ -139,6 +143,7 @@ ...@@ -139,6 +143,7 @@
<item name="IOControl"/> <item name="IOControl"/>
<item name="RTUExchange"/> <item name="RTUExchange"/>
<item name="MBSlave1"/> <item name="MBSlave1"/>
<item name="MBMaster1"/>
<item name="UDPExchange"/> <item name="UDPExchange"/>
<item name="UDPExchange2"/> <item name="UDPExchange2"/>
</objects> </objects>
......
...@@ -188,6 +188,8 @@ AC_CONFIG_FILES([Makefile ...@@ -188,6 +188,8 @@ AC_CONFIG_FILES([Makefile
extentions/UDPExchange/libUniSetUDP.pc extentions/UDPExchange/libUniSetUDP.pc
extentions/ModbusSlave/Makefile extentions/ModbusSlave/Makefile
extentions/ModbusSlave/libUniSetMBSlave.pc extentions/ModbusSlave/libUniSetMBSlave.pc
extentions/MBTCPMaster/Makefile
extentions/MBTCPMaster/libUniSetMBTCPMaster.pc
extentions/LogicProcessor/Makefile extentions/LogicProcessor/Makefile
extentions/LogicProcessor/libUniSetLogicProcessor.pc extentions/LogicProcessor/libUniSetLogicProcessor.pc
extentions/SharedMemory/Makefile extentions/SharedMemory/Makefile
......
../libUniSetMBTCPMaster.la
\ No newline at end of file
# libUniSetMBTCPMaster.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
# The name that we can dlopen(3).
dlname='libUniSetMBTCPMaster.so.0'
# Names of this library.
library_names='libUniSetMBTCPMaster.so.0.0.0 libUniSetMBTCPMaster.so.0 libUniSetMBTCPMaster.so'
# The name of the static archive.
old_library=''
# Libraries that this one depends upon.
dependency_libs=' /usr/local/lib/libUniSetSharedMemory.la /usr/local/lib/libUniSetExtentions.la /usr/local/lib/libUniSet.la -lccgnu2 -ldl -lrt -lomniORB4 -lomnithread -lxml2 -lsigc-2.0'
# Version information for libUniSetMBTCPMaster.
current=0
age=0
revision=0
# Is this an already installed library?
installed=yes
# Should we warn about portability when linking against -modules?
shouldnotlink=no
# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''
# Directory that this library needs to be installed in:
libdir='/usr/local/lib'
libUniSetMBTCPMaster.so.0.0.0
\ No newline at end of file
libUniSetMBTCPMaster.so.0.0.0
\ No newline at end of file
// $Id: MBMaster.h,v 1.7 2009/03/03 10:33:27 pv Exp $
// -----------------------------------------------------------------------------
#ifndef _MBMaster_H_
#define _MBMaster_H_
// -----------------------------------------------------------------------------
#include <string>
#include <vector>
#include "UniSetObject_LT.h"
#include "IONotifyController.h"
#include "modbus/ModbusTCPMaster.h"
#include "PassiveTimer.h"
#include "Trigger.h"
#include "Mutex.h"
#include "SharedMemory.h"
#include "IOBase.h"
#include "SMInterface.h"
// -----------------------------------------------------------------------------
class MBMaster:
public UniSetObject_LT
{
public:
MBMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic=0,
std::string prefix="mbtcp" );
virtual ~MBMaster();
/*! */
static MBMaster* init_mbmaster( int argc, char* argv[], UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
std::string prefix="mbtcp" );
/*! help- */
static void help_print( int argc, char* argv[] );
static const int NoSafetyState=-1;
enum Timer
{
tmExchange
};
struct MBProperty:
public IOBase
{
ModbusRTU::ModbusAddr mbaddr; /*!< */
ModbusRTU::ModbusData mbreg; /*!< */
ModbusRTU::SlaveFunctionCode mbfunc; /*!< / */
MBProperty():
mbaddr(0),mbreg(0),
mbfunc(ModbusRTU::fnUnknown)
{}
friend std::ostream& operator<<( std::ostream& os, MBProperty& p );
};
protected:
typedef std::vector<MBProperty> MBMap;
MBMap mbmap; /*!< / */
unsigned int maxItem; /*!< ( ) */
ModbusTCPMaster* mb;
UniSetTypes::uniset_mutex mbMutex;
std::string iaddr;
int port;
int recv_timeout;
ModbusRTU::ModbusAddr myaddr;
xmlNode* cnode;
std::string s_field;
std::string s_fvalue;
SMInterface* shm;
void step();
void poll();
virtual void processingMessage( UniSetTypes::VoidMessage *msg );
void sysCommand( UniSetTypes::SystemMessage *msg );
void sensorInfo( UniSetTypes::SensorMessage*sm );
void timerInfo( UniSetTypes::TimerMessage *tm );
void askSensors( UniversalIO::UIOCommand cmd );
void initOutput();
void waitSMReady();
long callItem( MBMap::iterator& p );
virtual bool activateObject();
//
virtual void sigterm( int signo );
void init_mb();
void initIterators();
bool initItem( UniXML_iterator& it );
bool readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec );
void readConfiguration();
bool check_item( UniXML_iterator& it );
private:
MBMaster();
bool initPause;
UniSetTypes::uniset_mutex mutex_start;
bool force; /*!< , SM, */
bool force_out; /*!< , */
int polltime; /*!< , [] */
PassiveTimer ptHeartBeat;
UniSetTypes::ObjectId sidHeartBeat;
int maxHeartBeat;
IOController::AIOStateList::iterator aitHeartBeat;
UniSetTypes::ObjectId test_id;
UniSetTypes::uniset_mutex pollMutex;
Trigger trTimeout;
PassiveTimer ptTimeout;
bool activated;
int activateTimeout;
std::string prefix;
};
// -----------------------------------------------------------------------------
#endif // _MBMaster_H_
// -----------------------------------------------------------------------------
bin_PROGRAMS = @PACKAGE@-mbtcpmaster
lib_LTLIBRARIES = libUniSetMBTCPMaster.la
libUniSetMBTCPMaster_la_LIBADD = $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extentions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extentions/lib/libUniSetExtentions.la \
$(SIGC_LIBS)
libUniSetMBTCPMaster_la_CXXFLAGS = -I$(top_builddir)/extentions/include -I$(top_builddir)/extentions/SharedMemory $(SIGC_CFLAGS)
libUniSetMBTCPMaster_la_SOURCES = MBMaster.cc
@PACKAGE@_mbtcpmaster_SOURCES = main.cc
@PACKAGE@_mbtcpmaster_LDADD = libUniSetMBTCPMaster.la $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extentions/SharedMemory/libUniSetSharedMemory.la \
$(top_builddir)/extentions/lib/libUniSetExtentions.la \
$(SIGC_LIBS)
@PACKAGE@_mbtcpmaster_CXXFLAGS = -I$(top_builddir)/extentions/include -I$(top_builddir)/extentions/SharedMemory $(SIGC_CFLAGS)
#!/bin/sh
ln -s -f /usr/bin/uniset-stop.sh stop.sh
ln -s -f ../../conf/test.xml test.xml
# libUniSetMBTCPMaster.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
# The name that we can dlopen(3).
dlname='libUniSetMBTCPMaster.so.0'
# Names of this library.
library_names='libUniSetMBTCPMaster.so.0.0.0 libUniSetMBTCPMaster.so.0 libUniSetMBTCPMaster.so'
# The name of the static archive.
old_library=''
# Libraries that this one depends upon.
dependency_libs=' /home/pv/Projects/uniset/extentions/SharedMemory/libUniSetSharedMemory.la /home/pv/Projects/uniset/extentions/lib/libUniSetExtentions.la /home/pv/Projects/uniset/lib/libUniSet.la -lccgnu2 -ldl -lrt -lomniORB4 -lomnithread -lxml2 -lsigc-2.0'
# Version information for libUniSetMBTCPMaster.
current=0
age=0
revision=0
# Is this an already installed library?
installed=no
# Should we warn about portability when linking against -modules?
shouldnotlink=no
# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''
# Directory that this library needs to be installed in:
libdir='/usr/local/lib'
relink_command="(cd /home/pv/Projects/uniset/extentions/MBTCPMaster; /bin/sh ../../libtool --tag=CXX --mode=relink g++ -I../../extentions/include -I../../extentions/SharedMemory -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -pedantic -Wall -funsigned-char -D_GNU_SOURCE -D__x86__ -D__linux__ -D__OSVERSION__=2 -I/usr/include/libxml2 -I../../include -lomniORB4 -lomnithread -lxml2 -o libUniSetMBTCPMaster.la -rpath /usr/local/lib libUniSetMBTCPMaster_la-MBMaster.lo ../../lib/libUniSet.la ../../extentions/SharedMemory/libUniSetSharedMemory.la ../../extentions/lib/libUniSetExtentions.la -lsigc-2.0 @inst_prefix_dir@) "
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: libUniSetMBSlave
Description: Support library for UniSetModbusSlave
Requires: libUniSetExtentions libUniSetSharedMemory
Version: 0.96
Libs: -L${libdir} -lUniSetMBSlave
Cflags: -I${includedir}/uniset/extentions
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: libUniSetMBSlave
Description: Support library for UniSetModbusSlave
Requires: libUniSetExtentions libUniSetSharedMemory
Version: @VERSION@
Libs: -L${libdir} -lUniSetMBSlave
Cflags: -I${includedir}/uniset/extentions
# libUniSetMBTCPMaster_la-MBMaster.lo - a libtool object file
# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
# Name of the PIC object.
pic_object='.libs/libUniSetMBTCPMaster_la-MBMaster.o'
# Name of the non-PIC object.
non_pic_object=none
// $Id: rsexchange.cc,v 1.2 2008/06/06 11:03:32 pv Exp $
// -----------------------------------------------------------------------------
#include <sstream>
#include "MBMaster.h"
#include "Configuration.h"
#include "Debug.h"
#include "ObjectsActivator.h"
#include "Extentions.h"
// -----------------------------------------------------------------------------
using namespace std;
using namespace UniSetTypes;
using namespace UniSetExtentions;
// -----------------------------------------------------------------------------
int main( int argc,char** argv )
{
if( argc>1 && (!strcmp(argv[1],"--help") || !strcmp(argv[1],"-h")) )
{
cout << "--smemory-id objectName - SharedMemory objectID. Default: autodetect" << endl;
cout << "--confile filename - configuration file. Default: configure.xml" << endl;
cout << "--mbtcp-logfile filename - logfilename. Default: mbtcpmaster.log" << endl;
cout << endl;
MBMaster::help_print(argc,argv);
return 0;
}
try
{
string confile=UniSetTypes::getArgParam("--confile",argc,argv,"configure.xml");
conf = new Configuration( argc, argv, confile );
string logfilename(conf->getArgParam("--mbtcp-logfile"));
if( logfilename.empty() )
logfilename = "mbtcpmaster.log";
conf->initDebug(dlog,"dlog");
std::ostringstream logname;
string dir(conf->getLogDir());
logname << dir << logfilename;
unideb.logFile( logname.str().c_str() );
dlog.logFile( logname.str().c_str() );
ObjectId shmID = DefaultObjectId;
string sID = conf->getArgParam("--smemory-id");
if( !sID.empty() )
shmID = conf->getControllerID(sID);
else
shmID = getSharedMemoryID();
if( shmID == DefaultObjectId )
{
cerr << sID << "? SharedMemoryID not found in " << conf->getControllersSection() << " section" << endl;
return 1;
}
MBMaster* mb = MBMaster::init_mbmaster(argc,argv,shmID);
if( !mb )
{
dlog[Debug::CRIT] << "(mbmaster): init ۣ..." << endl;
return 1;
}
ObjectsActivator act;
act.addObject(static_cast<class UniSetObject*>(mb));
SystemMessage sm(SystemMessage::StartUp);
act.broadcast( sm.transport_msg() );
unideb(Debug::ANY) << "\n\n\n";
unideb[Debug::ANY] << "(main): -------------- MBTCP Exchange START -------------------------\n\n";
dlog(Debug::ANY) << "\n\n\n";
dlog[Debug::ANY] << "(main): -------------- MBTCP Exchange START -------------------------\n\n";
act.run(false);
}
catch( Exception& ex )
{
dlog[Debug::CRIT] << "(mbtcpmaster): " << ex << std::endl;
}
catch(...)
{
dlog[Debug::CRIT] << "(mbtcpmaster): catch ..." << std::endl;
}
return 0;
}
18/03/2009 00:04:03(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:04:03(crit): (mbtcpmaster): (MBMaster): Not find conf-node for MBMaster1
18/03/2009 00:05:29(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:05:29(info): MBMaster1(init): read s_field='' s_fvalue=''
18/03/2009 00:05:32(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:05:32(info): MBMaster1(init): read s_field='' s_fvalue=''
18/03/2009 00:08:59(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:08:59(info): MBMaster1(init): read s_field='' s_fvalue=''
18/03/2009 00:09:45(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:09:45(info): MBMaster1(init): read s_field='' s_fvalue=''
18/03/2009 00:11:58(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:11:58(info): MBMaster1(init): read s_field='' s_fvalue=''
18/03/2009 00:12:56(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:12:56(info): MBMaster1(init): read s_field='' s_fvalue=''
18/03/2009 00:14:10(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:14:10(info): MBMaster1(init): read s_field='' s_fvalue=''
18/03/2009 00:14:47(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:14:48(info): MBMaster1(init): read s_field='' s_fvalue=''
18/03/2009 00:16:59(info): (mbtcpexchange): name = MBMaster1(18)
18/03/2009 00:16:59(info): MBMaster1(init): read s_field='' s_fvalue=''
#!/bin/sh
uniset-start.sh -f ./uniset-mbtcpmaster --mbtcp-name MBMaster1 --confile test.xml \
--dlog-add-levels info,crit,warn --mbtcp-reg-from-id 1 \
--mbtcp-iaddr 127.0.0.1 --mbtcp-port 30000
/usr/bin/uniset-stop.sh
\ No newline at end of file
../../conf/test.xml
\ No newline at end of file
#! /bin/sh
# uniset-mbtcpmaster - temporary wrapper script for .libs/uniset-mbtcpmaster
# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
#
# The uniset-mbtcpmaster program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
Xsed='/bin/sed -e 1s/^X//'
sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
relink_command="(cd /home/pv/Projects/uniset/extentions/MBTCPMaster; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/home/pv/bin:/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/X11R6/bin\"; export PATH; g++ -I../../extentions/include -I../../extentions/SharedMemory -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -pedantic -Wall -funsigned-char -D_GNU_SOURCE -D__x86__ -D__linux__ -D__OSVERSION__=2 -I/usr/include/libxml2 -I../../include -o \$progdir/\$file uniset_mbtcpmaster-main.o -lomniORB4 -lomnithread -lxml2 ./.libs/libUniSetMBTCPMaster.so ../../lib/.libs/libUniSet.so ../../extentions/SharedMemory/.libs/libUniSetSharedMemory.so ../../extentions/lib/.libs/libUniSetExtentions.so -lsigc-2.0 -Wl,--rpath -Wl,/home/pv/Projects/uniset/extentions/MBTCPMaster/.libs -Wl,--rpath -Wl,/home/pv/Projects/uniset/lib/.libs -Wl,--rpath -Wl,/home/pv/Projects/uniset/extentions/SharedMemory/.libs -Wl,--rpath -Wl,/home/pv/Projects/uniset/extentions/lib/.libs -Wl,--rpath -Wl,/usr/local/lib ) "
# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
# install mode needs the following variable:
notinst_deplibs=' libUniSetMBTCPMaster.la ../../lib/libUniSet.la ../../extentions/SharedMemory/libUniSetSharedMemory.la ../../extentions/lib/libUniSetExtentions.la'
else
# When we are sourced in execute mode, $file and $echo are already set.
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
echo="echo"
file="$0"
# Make sure echo works.
if test "X$1" = X--no-reexec; then
# Discard the --no-reexec flag, and continue.
shift
elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
# Yippee, $echo works!
:
else
# Restart under the correct shell, and then maybe $echo will work.
exec /bin/sh "$0" --no-reexec ${1+"$@"}
fi
fi
# Find the directory that this script lives in.
thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
test "x$thisdir" = "x$file" && thisdir=.
# Follow symbolic links until we get to the real thisdir.
file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
while test -n "$file"; do
destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
# If there was a directory component, then change thisdir.
if test "x$destdir" != "x$file"; then
case "$destdir" in
[\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
*) thisdir="$thisdir/$destdir" ;;
esac
fi
file=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
done
# Try to get the absolute directory name.
absdir=`cd "$thisdir" && pwd`
test -n "$absdir" && thisdir="$absdir"
program=lt-'uniset-mbtcpmaster'
progdir="$thisdir/.libs"
if test ! -f "$progdir/$program" || \
{ file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
test "X$file" != "X$progdir/$program"; }; then
file="$$-$program"
if test ! -d "$progdir"; then
mkdir "$progdir"
else
rm -f "$progdir/$file"
fi
# relink executable if necessary
if test -n "$relink_command"; then
if relink_command_output=`eval $relink_command 2>&1`; then :
else
echo "$relink_command_output" >&2
rm -f "$progdir/$file"
exit 1
fi
fi
mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
{ rm -f "$progdir/$program";
mv -f "$progdir/$file" "$progdir/$program"; }
rm -f "$progdir/$file"
fi
if test -f "$progdir/$program"; then
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
# Run the actual program with our arguments.
exec "$progdir/$program" ${1+"$@"}
$echo "$0: cannot exec $program $*"
exit 1
fi
else
# The program doesn't exist.
$echo "$0: error: \`$progdir/$program' does not exist" 1>&2
$echo "This script is just a wrapper for $program." 1>&2
echo "See the libtool documentation for more information." 1>&2
exit 1
fi
fi
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
if HAVE_EXTENTIONS if HAVE_EXTENTIONS
SUBDIRS = lib include SharedMemory IOControl RTUExchange LogicProcessor \ SUBDIRS = lib include SharedMemory IOControl RTUExchange LogicProcessor \
ModbusSlave SharedMemoryPlus ModbusSlave MBTCPMaster
#SharedMemoryPlus
#UDPExchange #UDPExchange
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
......
#!/bin/sh
uniset-start.sh -f ./uniset-mbslave --mbs-name MBSlave1 --confile test.xml --dlog-add-levels info,crit,warn \
--mbs-type TCP --mbs-inet-addr 127.0.0.2 --mbs-inet-port 2048 --mbs-reg-from-id 1
\ 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