⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mexopc.cpp

📁 一个opc服务器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
         
         IConnectionPoint *pCallbackCP = 0;
         hr = pCPC->FindConnectionPoint(IID_IOPCShutdown, &pCallbackCP);
         pCPC->Release();
         if( SUCCEEDED(hr) )
         {
            hr = pCallbackCP->Advise(pDoc->shutdownCP, &pDoc->dwShutdownConnection);
            pCallbackCP->Release();
         }
      }
	}

   // Create a single group that will contain all the items
      FLOAT deadband = 0.0;
      DWORD rate;
      hr = pDoc->opcServer.AddGroup( L"Fred", TRUE, m_synctime,  // name, active, rate
                             1324, NULL, &deadband,  // handle, bias, band
                             0, &pDoc->groupHandle, &rate,
                             IID_IOPCGroupStateMgt,   // interface to return
                             pDoc->opcGroup );              // this holds the group ptr
   
      if( FAILED(hr) )
	  {
		  pDoc->ReportError( _T("AddGroup:%s "), hr);
		   z[0] = 2789561;
		   init =0;
          return ;
	  }

   // Test GetGroupByName and SetName
#ifdef FULL_TEST
      IOPCGroupStateMgt* pTest=NULL;
      hr = pDoc->opcServer.GetGroupByName( L"Fred", IID_IOPCGroupStateMgt, (LPUNKNOWN*)&pTest );
      if( SUCCEEDED(hr) )
	  {
         ASSERT( pTest == (IOPCGroupStateMgt*)opcGroup );   // should get the same
         hr = pTest->SetName( L"Group one" );               // set new name
         pTest->Release();
         if( FAILED(hr) )
		 {
            pDoc->ReportError( _T("IOPCGroupStateMgt::SetName:%s "), pErrors[0] );
		 }
         else
		 {
         // should now go by this new name
            hr = pDoc->opcServer.GetGroupByName( L"Group one", IID_IOPCGroupStateMgt, (LPUNKNOWN*)&pTest );
            if( SUCCEEDED(hr) )
			{
              ASSERT( pTest == (IOPCGroupStateMgt*)opcGroup );
              pTest->Release();
			}
		 }
	  }
#endif // FULL_TEST

   // OPC 2.0 ConnectionPoints
      IConnectionPointContainer *pCPC = 0;
      hr = pDoc->opcGroup.QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
      if( SUCCEEDED(hr) )  // This server supports 2.0
	  {
	  
          pDoc->usingCP = TRUE;
          IConnectionPoint *pCallbackCP = 0;
          hr = pCPC->FindConnectionPoint(IID_IOPCDataCallback, &pCallbackCP);
          pCPC->Release();
          if( FAILED(hr) )
		  {
              pDoc->ReportError( _T("FindConnectionPoint:%s "), hr);
              pDoc->usingCP = FALSE;  // Try old style
		  }

          hr = pCallbackCP->Advise(pDoc->callbackCP, &pDoc->dwConnection1);
          pCallbackCP->Release();
          if( FAILED(hr) )
		  {
             pDoc->ReportError( _T("Advise ConnectionPoint:%s "), hr );
             pDoc->dwConnection1 = 0;
             pDoc->usingCP = FALSE;  // Try old style
		  }
	  }
      if( !pDoc->usingCP )
	  {
      // OPC 1.0 data advise format
          FORMATETC formatEtc ;
          formatEtc.tymed =  TYMED_HGLOBAL;
          formatEtc.ptd = NULL;
          formatEtc.dwAspect = DVASPECT_CONTENT;
          formatEtc.lindex = -1;

      // IAdviseSink is an interface on OUR object that is passed to
      // the server for callbacks
          IAdviseSink *pAdviseSink = NULL;
          hr = pDoc->testSink->QueryInterface(IID_IAdviseSink, (LPVOID *)&pAdviseSink);
          if( FAILED(hr) )
		  {
           pDoc->ReportError( _T("IAdviseSink:%s "), hr);
           pDoc->opcGroup.Detach();
           pDoc->opcServer.Detach();
		    z[0] = 2789561;
			init =0;
           return ;
		  }

      // Get an IDataObject interface on the group
          DataObject dataObject;
          hr = dataObject.Attach( pDoc->opcGroup );
          if(FAILED(hr) || !dataObject.IsOk() )
		  {
         //  some servers don't do this, so don't quit altogether
            MessageBox( 0, _T("IDataObject not supported by this server\nNo data notifications will take place"), _T("FactorySoft Client"), MB_OK );
             z[0] = 2789561;
			return ;
		  }

      // Register our IAdvise with the group
      // Need to register both formats: data change, and write complete
         formatEtc.cfFormat = OPCSTMFORMATWRITECOMPLETE ;
         hr = dataObject.DAdvise(&formatEtc,
                                ADVF_PRIMEFIRST,    // ADVF flag
                                pAdviseSink,
                                &pDoc->dwConnection2);
	  
         if( FAILED(hr) )
		 {
			pDoc->ReportError( _T("IDataObject::DAdvise:%s "), hr );
			 z[0] = 2789561;
			 init =0;
            return ;
		 }

#ifdef DATATIMEFORMAT
         formatEtc.cfFormat = OPCSTMFORMATDATATIME ;
#else
         formatEtc.cfFormat = OPCSTMFORMATDATA ;
#endif // DATATIMEFORMAT
         hr = dataObject.DAdvise(&formatEtc,
                                ADVF_PRIMEFIRST,    // ADVF flag
                                pAdviseSink,
                                &pDoc->dwConnection1);
         pAdviseSink->Release();
         if( FAILED(hr) )
		 {
         pDoc->ReportError( _T("IDataObject::DAdvise:%s "), hr );
		  z[0] = 2789561;
		  init =0;
         return ;
		 }
	  }
     }       
//**************************************注册函数************************************************	
//************************WRITE写函数************************************************************      
	
//**************************************关闭函数************************************************      
	if(para.Compare( "close" ) == 0||para.Compare( "Close" ) == 0||para.Compare( "CLOSE" ) == 0)
    {
		HRESULT hr = S_OK;
        if( pDoc->opcServer.IsOk() && pDoc->opcGroup.IsOk() )
		{
            if( pDoc->dwShutdownConnection )
			{
               IConnectionPointContainer *pCPC = 0;
               hr = pDoc->opcServer.QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
               if( SUCCEEDED(hr) )
			   {
                   IConnectionPoint *pCallbackCP = 0;
                   hr = pCPC->FindConnectionPoint(IID_IOPCShutdown, &pCallbackCP);
                   if( SUCCEEDED(hr) )
				   {
                       hr = pCallbackCP->Unadvise(pDoc->dwShutdownConnection);
                       pCallbackCP->Release();
				   }
                pCPC->Release();
			   } 
			}
            if( pDoc->usingCP )
			{
         // OPC 2.0 ConnectionPoints
            IConnectionPointContainer *pCPC = 0;
            hr = pDoc->opcGroup.QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
            if( SUCCEEDED(hr) && pDoc->dwConnection1 )  // This server supports 2.0
			{
            IConnectionPoint *pCallbackCP = 0;
            hr = pCPC->FindConnectionPoint(IID_IOPCDataCallback, &pCallbackCP);
            if( SUCCEEDED(hr) )
            {
               hr = pCallbackCP->Unadvise(pDoc->dwConnection1);
               pCallbackCP->Release();
            }
            pCPC->Release();
			}
			}
            else
      // call IDataObject::DUnadvise to turn off data notification
			{
          DataObject dataObject;
          HRESULT hr = dataObject.Attach( pDoc->opcGroup );
          if( SUCCEEDED(hr) )
          {
             if( pDoc->dwConnection1 )
                hr = dataObject.DUnadvise(pDoc->dwConnection1);
             if( pDoc->dwConnection2 )
                hr = dataObject.DUnadvise(pDoc->dwConnection2);
             dataObject.Detach();
          }
			}
       // test RemoveItems (RemoveGroup cleans up anyway.)
#ifdef FULL_TEST
       
       hr = itemMgt.Attach( opcGroup );
       if( SUCCEEDED(hr) && items.GetCount()>0 )
       {
          HRESULT *pErrors=0;
          OPCHANDLE* handles = new OPCHANDLE[items.GetCount()];
          POSITION pos = items.GetHeadPosition();
          for( int index=0; pos; index++ )
          {
             Item* pItem = items.GetNext( pos );
             handles[index] = pItem->hServerHandle;
          }
          hr = itemMgt.RemoveItems( items.GetCount(), handles, &pErrors );
          if( SUCCEEDED(hr) )
             CoTaskMemFree( pErrors );
          delete [] handles;
       }
#endif // FULL_TEST

       pDoc->opcServer.RemoveGroup(pDoc->groupHandle, FALSE);

   }
       pDoc->opcGroup.Detach();
       pDoc->opcServer.Detach();
   // now that the group is released and unadvised, no more data will
   // be sent from the server. It is safe to delete the items
   while( !pDoc->items.IsEmpty() )
      delete pDoc->items.RemoveTail();
   pDoc->pCurrentItem = NULL;
    init =0;
	}
	//***********************wait***********************************
	    if(para.Compare( "wait" ) == 0)
		{
           
           lock.Lock(m_synctime);
		   if (lock.IsLocked())  
		   lock.Unlock();
	       event->ResetEvent();
		}
   
    z[0]=0;
//************************************************************************************
}
void mexFunction( int nlhs,mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
		//*****************************************//参数的初始化
	CString para=("");
	CString NAME=("");
	CString data=("");
    //************************************//输入,输出矩阵
	input = mxCreateDoubleMatrix(10,1,mxREAL);
	
	//*******************************************//三个输入参数的转化
	int n,n1;
	char *input_buf;
	char *input_buf2;
	char *input_buf3;
	int buflen,status,buflen1,status1,buflen2,status2;
	buflen1 = (mxGetM(prhs[0])*mxGetN(prhs[0]))+1;
    input_buf2 = (char*)mxCalloc(buflen1,sizeof(char));
	sleeptime = mxCreateDoubleMatrix(1,1,mxREAL);
	status1 = mxGetString(prhs[0],input_buf2,buflen1);
	for (int  i = 0 ;i<buflen1-1;i++)
	{
		n1 = para.Insert(i,input_buf2[i]);
        ASSERT(n1 == para.GetLength());
    }
	
	//**************************************///调用动态函数
	if(!init)
           if(para.Compare("Open")==0||para.Compare("open")==0||para.Compare("PARA")==0)
			      init=1;
	       else
		   {
					  AfxMessageBox("请先连接服务器");
					  plhs[0] =mxCreateDoubleMatrix(1,1,mxREAL);
	                  double *z;
	                  z =mxGetPr(plhs[0]);
					  z[0] = 2789561;
					  return;
			}
           if(para.Compare("directread")==0||para.Compare("Directread")==0||para.Compare("DirectRead")==0||para.Compare("DIAECTREAD")==0
		      ||para.Compare("write")==0||para.Compare("Write")==0||para.Compare("WRITE")==0
		      ||para.Compare("read")==0||para.Compare("Read")==0||para.Compare("READ")==0
			  ||para.Compare("directwrite")==0||para.Compare("DirectWrite")==0||para.Compare("DIRECTWRITE")==0)
			{
		      buflen = (mxGetM(prhs[1])*mxGetN(prhs[1]))+1;
	          input_buf = (char*)mxCalloc(buflen,sizeof(char));
	          status = mxGetString(prhs[1],input_buf,buflen);
	          plhs[0] = mxCreateDoubleMatrix(100,1,mxREAL);
	          buflen2 = (mxGetM(prhs[2])*mxGetN(prhs[2]))+1;
              input_buf3 = (char*)mxCalloc(buflen2,sizeof(char));
	          status2 = mxGetString(prhs[2],input_buf3,buflen2);
	          for( i=0;i<buflen-1;i++)
			  {
	              n = NAME.Insert(i, input_buf[i]);
                  ASSERT(n == NAME.GetLength());
			  }
	          for( i=0;i<buflen2-1;i++)
			  {
	              n = data.Insert(i, input_buf3[i]);
                 ASSERT(n == data.GetLength());
			  }
		      if(para=="write"||para =="Write"||para =="WRITE"||para.Compare("directwrite")==0||para.Compare("DirectWrite")==0||para.Compare("DIRECTWRITE")==0)
			  {
		         inth =mxCreateDoubleMatrix(1,1,mxREAL);
		         inth =prhs[2];
			  }
		      if(data=="CString"||data=="cstring"||data=="CSTRING")
			  {
			     plhs[0]=mxCreateString(input_buf4);
	             double *z;
	             z =mxGetPr(plhs[0]);
                 gill(para,NAME,data,z);//这里可以改进,我想,也可以不改进    
			  }
		     else
			 {
	             plhs[0] =mxCreateDoubleMatrix(1,1,mxREAL);
	             double *z;
	             z = mxGetPr(plhs[0]);
	             gill(para,NAME,data,z);
			 }
			  }
	        else
			{
				/*if(para.Compare("wait")==0||para.Compare("sleep")==0)
				{
					 buflen = (mxGetM(prhs[1])*mxGetN(prhs[1]))+1;
	                 input_buf = (char*)mxCalloc(buflen,sizeof(char));
	                 status = mxGetString(prhs[1],input_buf,buflen);
					 for( i=0;i<buflen-1;i++)
					 {
	                     n = NAME.Insert(i, input_buf[i]);
                         ASSERT(n == NAME.GetLength());
					 }
                     inth =mxCreateDoubleMatrix(1,1,mxREAL);
		             inth =prhs[2];
					 plhs[0] =mxCreateDoubleMatrix(1,1,mxREAL);
				     double *z;
				     z = mxGetPr(plhs[0]);
					 dill(para,NAME,z);
				}
				else
				{*/
				plhs[0] =mxCreateDoubleMatrix(1,1,mxREAL);
				double *z;
				z = mxGetPr(plhs[0]);
                fill(para,z);
				//}
			}  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -