Index: setport.c
===================================================================
--- setport.c	(revision 1549)
+++ setport.c	(working copy)
@@ -33,7 +33,7 @@
 #define debug 0
 #define ThisModule "setPort : "
 
-int setPort(char * name, char* baud,char parity)
+int setPort(const char * name, char* baud,char parity)
 {
     int fd,res;
     struct termios oldtio, newtio;
Index: siemens.cpp
===================================================================
--- siemens.cpp	(revision 1549)
+++ siemens.cpp	(working copy)
@@ -34,6 +34,7 @@
 #include "cif_user.h"
 
 #include "openSocket.h"
+#include "setport.h"
 
 #include "siemens.h"
 
@@ -103,9 +104,13 @@
     fldAdd( new TFld("PRIOR",_("Request task priority"),TFld::Integer,TFld::NoFlag,"2","0","-1;99") );
     fldAdd( new TFld("ASINC_WR",_("Asynchronous write mode"),TFld::Boolean,TFld::NoFlag,"1","0") );
     fldAdd( new TFld("TYPE",_("Connection type"),TFld::Integer,TFld::Selected,"1","0",
-	(TSYS::int2str(TMdContr::CIF_PB)+";"+TSYS::int2str(TMdContr::ISO_TCP)).c_str(),"CIF_PB;ISO_TCP") );
+	(TSYS::int2str(TMdContr::CIF_PB)+";"+TSYS::int2str(TMdContr::ISO_TCP)+";"+TSYS::int2str(TMdContr::SER_MPI)).c_str(),"CIF_PB;ISO_TCP;SER_MPI") );
     fldAdd( new TFld("ADDR",_("Remote controller address"),TFld::String,TFld::NoFlag,"40","10") );
     fldAdd( new TFld("SLOT",_("Slot CPU"),TFld::Integer,TFld::NoFlag,"2","2","0;30") );
+    fldAdd( new TFld("MPI_PLC_ADDR",_("PLC/MPI address"),TFld::Integer,TFld::NoFlag,"3","2","0;255") );
+    fldAdd( new TFld("MPI_SPD",_("MPI bus speed"),TFld::Integer,TFld::Selected,"1","0",
+	(TSYS::int2str(daveSpeed9k)+";"+TSYS::int2str(daveSpeed19k)+";"+TSYS::int2str(daveSpeed187k)+";"+TSYS::int2str(daveSpeed500k)+";"+
+	    TSYS::int2str(daveSpeed1500k)+";"+TSYS::int2str(daveSpeed45k)+";"+TSYS::int2str(daveSpeed45k)).c_str(),"9;19;187;500;1500;45;93") );
     fldAdd( new TFld("CIF_DEV",_("CIF board"),TFld::Integer,TFld::NoFlag,"1","0","0;3") );
     //>> Parameter type DB structure
     int t_prm = tpParmAdd("logic","PRM_BD",_("Logical"));
@@ -483,7 +488,7 @@
 	::TController(name_c,daq_db,cfgelem),
 	mPer(cfg("PERIOD").getRd()), mPrior(cfg("PRIOR").getId()), mType(cfg("TYPE").getId()),
 	mSlot(cfg("SLOT").getId()), mDev(cfg("CIF_DEV").getId()), mSched(cfg("SCHEDULE").getSd()),
-	mAddr(cfg("ADDR").getSd()), mAssincWR(cfg("ASINC_WR").getBd()),
+	mAddr(cfg("ADDR").getSd()), mSpeed(cfg("MPI_SPD").getId()), mTmpPLCAddr(cfg("MPI_PLC_ADDR").getId()), mAssincWR(cfg("ASINC_WR").getBd()),
 	prc_st(false), call_st(false), endrun_req(false), toReconect(false), isReload(false), di(NULL), dc(NULL), tm_calc(0)
 {
     cfg("PRM_BD").setS("SiemensPrm_"+name_c);
@@ -708,13 +713,16 @@
 
 void TMdContr::connectRemotePLC( )
 {
-    switch(mType)
-    {
-	case CIF_PB:
+//    switch(mType)
+//    {
+//	case CIF_PB:
+	if (mType==CIF_PB)
+	{
 	    if( !(owner().cif_devs[0].present||owner().cif_devs[1].present||owner().cif_devs[2].present||owner().cif_devs[3].present) )
 		throw TError(nodePath().c_str(),_("No one driver or board are present."));
-	    break;
-	case ISO_TCP:
+//	    break;
+	}
+	else if (mType==ISO_TCP||mType==SER_MPI)
 	{
 	    //> Dsconnect previous connection
 	    if(dc && di) disconnectRemotePLC();
@@ -722,11 +730,25 @@
 	    //> Full Libnodave API
 	    ResAlloc res(reqRes, true);
 	    _daveOSserialType fds;
-	    fds.wfd = fds.rfd = openSocket(102, mAddr.getVal().c_str());
-	    if(fds.rfd <= 0) throw TError(nodePath().c_str(),_("Open socket of remote PLC error."));
-	    di = daveNewInterface(fds,(char*)(string("IF")+id()).c_str(),0,daveProtoISOTCP,daveSpeed187k);
-	    daveSetTimeout(di,5000000);
-	    dc = daveNewConnection(di,2,0,mSlot);
+	    if (mType==ISO_TCP)
+	    {
+		fds.wfd = fds.rfd = openSocket(102, mAddr.getVal().c_str());
+		if(fds.rfd <= 0) throw TError(nodePath().c_str(),_("Open socket of remote PLC error."));
+		di = daveNewInterface(fds,(char*)(string("IF")+id()).c_str(),0,daveProtoISOTCP,daveSpeed187k);
+		daveSetTimeout(di,5000000);
+		dc = daveNewConnection(di,2,0,mSlot);
+	    }
+	    else {
+		//TODO "38400" constant <---> Param
+		fds.wfd = fds.rfd = setPort(mAddr.getVal().c_str(),"38400",'O');
+		if(fds.rfd <= 0) throw TError(nodePath().c_str(),_("Open serial port error."));
+		//di = daveNewInterface(fds,(char*)(string("IF")+id()).c_str(),0,daveProtoMPI,daveSpeed187k);
+		di = daveNewInterface(fds,(char*)(string("IF")+id()).c_str(),0,daveProtoMPI,mSpeed);
+		daveSetTimeout(di,500000);
+		daveInitAdapter(di);
+		dc = daveNewConnection(di,mTmpPLCAddr,0,mSlot);
+	    }
+		
 	    if(daveConnectPLC(dc))
 	    {
 		close(fds.wfd);
@@ -787,34 +809,43 @@
 	    resp_len = tr.at().messIO( mbap.data(), mbap.size(), (char*)buf, sizeof(buf), 10 );*/
 	    //daveSetDebug(daveDebugAll);
 
-	    break;
+//	    break;
 	}
-	default: throw TError(nodePath().c_str(),_("Connection type '%d' is not supported."),mType);
-    }
+	//default: throw TError(nodePath().c_str(),_("Connection type '%d' is not supported."),mType);
+	else throw TError(nodePath().c_str(),_("Connection type '%d' is not supported."),mType);
+//    }
 }
 
 void TMdContr::disconnectRemotePLC( )
 {
-    switch(mType)
-    {
-        case ISO_TCP:
+//    switch(mType)
+//    {
+//        case ISO_TCP:
+        if(mType==ISO_TCP||mType==SER_MPI)
+	{
 	    ResAlloc res(reqRes, true);
-	    if(!dc || !di) break;
-	    daveDisconnectPLC(dc);
-	    close(di->fd.rfd);
-	    delete dc;
-	    delete di;
-	    dc = NULL;
-	    di = NULL;
-	    break;
-    }
+	    //if(!dc || !di) break;
+	    if(dc && di)
+	    { 
+		daveDisconnectPLC(dc);
+		if (mType==SER_MPI) daveDisconnectAdapter(di);
+		close(di->fd.rfd);
+		delete dc;
+		delete di;
+		dc = NULL;
+		di = NULL;
+	    }
+//	    break;
+	}
+//    }
 }
 
 void TMdContr::getDB( unsigned n_db, long offset, string &buffer )
 {
-    switch(mType)
-    {
-        case CIF_PB:
+//    switch(mType)
+//    {
+//        case CIF_PB:
+	if (mType==CIF_PB)
 	{
 	    RCS_MESSAGE tMsg;
 	    int res, e_try = 4;
@@ -881,9 +912,10 @@
 
 	    //> Put result
 	    buffer.replace(0,buffer.size(),(char *)tMsg.d+8,buffer.size());
-	    break;
+//	    break;
 	}
-	case ISO_TCP:
+//	case ISO_TCP:
+	else if(mType==ISO_TCP||mType==SER_MPI)
 	{
 	    //> Reconnect for lost connection
 	    if(!dc || toReconect) { connectRemotePLC(); toReconect = false; }
@@ -942,16 +974,17 @@
 	    int pdlen = (buf[pheader+8]<<8) + buf[pheader+9];	//6
 	    buffer.replace(0,buffer.size(),(char*)buf+pdata,buffer.size());*/
 
-	    break;
+//	    break;
 	}
-    }
+//    }
 }
 
 void TMdContr::putDB( unsigned n_db, long offset, const string &buffer )
 {
-    switch(mType)
-    {
-	case CIF_PB:
+//    switch(mType)
+//    {
+//        case CIF_PB:
+	if (mType==CIF_PB)
 	{
 	    RCS_MESSAGE tMsg;
 	    int res, e_try = 4;
@@ -1003,9 +1036,11 @@
 	    if(tMsg.f == 17)	throw TError(nodePath().c_str(),_("17:There is no response from the remote station."));
 	    if(tMsg.f == 18)	throw TError(nodePath().c_str(),_("18:Master is out of the logical token ring."));
 	    if(tMsg.f == 0x85)	throw TError(nodePath().c_str(),_("20:Specified offset address or DB error."));
-	    break;
+//	    break;
 	}
-	case ISO_TCP:
+//	case ISO_TCP:
+	else if(mType==ISO_TCP||mType==SER_MPI)
+	{
 	    //> Reconnect for lost connection
 	    if(!dc || toReconect) { connectRemotePLC(); toReconect = false; }
 
@@ -1053,8 +1088,9 @@
 	        printf("0x%02X ",mbap[j]);
 	    }*/
 
-	    break;
-    }
+//	    break;
+	}
+//    }
 }
 
 char TMdContr::getValB( SValData ival, ResString &err )
Index: setport.h
===================================================================
--- setport.h	(revision 1549)
+++ setport.h	(working copy)
@@ -33,13 +33,13 @@
 #define EXPORTSPEC __declspec (dllimport)
 #endif
 
-EXPORTSPEC HANDLE __stdcall setPort(char * name, char* baud,char parity);
+EXPORTSPEC HANDLE __stdcall setPort(const char * name, char* baud,char parity);
 
 EXPORTSPEC int __stdcall closePort(HANDLE port);
 #endif
 
 #ifdef LINUX
-int setPort(char * name, char* baud, char parity);
+int setPort(const char * name, char* baud, char parity);
 
 int closePort(int port);
 #endif
Index: siemens.h
===================================================================
--- siemens.h	(revision 1549)
+++ siemens.h	(working copy)
@@ -151,7 +151,7 @@
     friend class TMdPrm;
     public:
 	//Data
-	enum Type { CIF_PB, ISO_TCP };
+	enum Type { CIF_PB, ISO_TCP, SER_MPI };
 
 	//Methods
 	TMdContr( string name_c, const string &daq_db, ::TElem *cfgelem );
@@ -232,6 +232,8 @@
 	int	&mPrior,		// Process task priority
 		&mType,			// Connection type
 		&mSlot,
+		&mSpeed,		// MPI bus speed
+		&mTmpPLCAddr,		// Remote PLC address for MPI (pc adapter) connection TODO: multiconnection
 		&mDev;			// CIF device number
 	ResString &mSched,      	// Acquisition schedule
 		&mAddr;			// Remote host address
