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

📄 pbprocomm.cpp

📁 profibus dp主站于从站通信
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    int i=profi_snd_req_res(&sdb, temp_buffer, PB_TRUE);
         // Sleep(10);
		con_ind_sdb.result    =1; 
		
       
		
		do
		{
			PROFI_RCV_CON_IND ();			
		
//			Sleep(35);
			if  ( (con_ind_sdb.service   ==DP_SLAVE_DIAG) &&
				(con_ind_sdb.primitive == CON            ) &&
				(con_ind_sdb.result    == POS            ) )		  
			{	//
				//howmanyslaves = howmanyslaves +1;
                ActiveslavesSize=ActiveslavesSize+1; //2008-5-10
				//tempActiveSlave.SlaveAdd=Slavezaehler; 2008-5-11
				//Activeslaves.Add(tempActiveSlave); //2008--5-9
				Activeslaves[Slavezaehler].SlaveAdd=Slavezaehler; //2008-5-10
				Activeslaves[Slavezaehler].ind=1; //2008-5-10

				//Activeslave[Slavezaehler]={tempActiveSlave,Slavezaehler};
			   break;	
			} 
			retry_counter-- ;

			
		} while (  retry_counter>0 );

	}	
	//delete m_slavesDlg;
	if(ActiveslavesSize>0)
	{
		return true;
	}  	  	
	else 
	{
		return false;
	}
 }
	 
 PB_BOOL CPbproComm::read_dp_slave_default ( USIGN8  slave_offset)
 {   
	
	 slave_para_set_ptr = (T_DP_SLAVE_PARA_SET FAR *) slave_para_table [dp_slave_table [slave_offset]];
	 int j=ActiveslavesSize;
	     if(j>0)
		 for(int i=0;i<j;i++)
		 {
		   Activeslaves[i].SlavePrmSet=slave_para_set_ptr;
		 
		 }
	 download_req_ptr   = (T_DP_DOWNLOAD_REQ  FAR*) download_buffer;
	 
	 
	 return true;
 }

 PB_BOOL CPbproComm::exit_communication ( void )  
{
LOCAL_VARIABLES

//  T_PROFI_SERVICE_DESCR   sdb;

  USIGN16                 retry_counter;


FUNCTION_BODY

  sdb.layer     = FMB;
  sdb.service   = FMB_EXIT;
  sdb.primitive = REQ;

  result = profi_snd_req_res (&sdb, &sdb, PB_FALSE);
   /*------------------------------------------------------------------------*/

  retry_counter = 1000;

  do
  {
    PROFI_RCV_CON_IND ();

  } while ( (con_ind_sdb.service   != FMB_EXIT) &&
            (con_ind_sdb.primitive != CON     ) &&
            (con_ind_sdb.result    != POS     ) &&
            (retry_counter--                  ) );


  /*------------------------------------------------------------------------*/

  result = profi_end ();
 
return result;
} /* exit_communication */

 /****************************************************************************/
/****************************************************************************/
/*------------------------------------------------------------------------*/
  /* FUNCTIONAL_DESCRIPTION                                                 */
  /*------------------------------------------------------------------------*/
  /*                                                                        */
  /* calculate the offsets of inputs and outputs. To exchange data in DP,   */
  /* I/O information has to be written to particular offsets for every      */
  /* slave. This function returns the offsets for a particular slave.       */
  /*                                                                        */
  /* possible return values:                                                */
  /*   - PB_FALSE                                                           */
  /*   - PB_TRUE                                                            */
  /*                                                                        */
  /*------------------------------------------------------------------------*/
 PB_BOOL CPbproComm::dp_io_offsets ( void  )  
{
	// return PB_TRUE;
LOCAL_VARIABLES

 // T_PROFI_SERVICE_DESCR            sdb;
  T_DP_GET_SLAVE_PARAM_REQ         get_slave_param_req;
  T_DP_GET_SLAVE_PARAM_CON*        get_slave_param_con_ptr;
 T_DP_SLAVE_PARAM_SLAVE_INFO*     slave_info_ptr;


  USIGN8                           slave;


FUNCTION_BODY

  memset (io_descr, 0, sizeof (T_DP_IO_DESCR) * DP_MAX_NUMBER_SLAVES);

  /*------------------------------------------------------------------------*/
    //int j=Activeslaves.GetSize();//2008-5-9
     int j=ActiveslavesSize;//2008-5-9 ActiveslavesSize
   ////////////////////////////////////////////
// 2008-5-19
    // int j=Slavezaehler;
    
	if(j<=0)
	{
	return PB_FALSE;
	}
  //	for (slave =0; slave<j; slave++)
 ////////////////////////////////////////////////////
//2008-5-20
for(int i=0;i<DP_MAX_SLAVE_ADDRESS;i++)
{
   if(Activeslaves[i].ind==1)
   {

/////////////////////////////////////////////////////

//	for (slave =0; slave<j; slave++)
//  {
    sdb.layer     =DP;  //11
    sdb.service   = DP_GET_SLAVE_PARAM; //232  0x80|0x08|0x60;
	sdb.primitive = REQ;  //0x00 

    get_slave_param_req.identifier = DP_SLAVE_PARAM_SLAVE_INFO;
    //该处应该可以不修改
    //get_slave_param_req.rem_add    = Activeslaves[slave].SlaveAdd;  //2008-5-20
     get_slave_param_req.rem_add    = Activeslaves[i].SlaveAdd;
    result = profi_snd_req_res (&sdb, &get_slave_param_req, PB_TRUE);  //返回0 正确
   // Sleep(20);
   //sprintf (s, "DP_Get_Slave_Param.req [%d]", result);
	
    //OutPutString (s);

    //if (result != E_OK)	{AfxMessageBox(s,MB_ICONERROR);  return (PB_FALSE);	}
    ////////////////////////////////////////
	////2008-5-15
	if (result != E_OK)	
	{
		return (PB_FALSE);
	}
    /*----------------------------------------------------------------------*/

    PROFI_RCV_CON_IND ();
    PROFI_RCV_CON_IND ();

	
   	get_slave_param_con_ptr = (T_DP_GET_SLAVE_PARAM_CON  *) con_ind_buffer;
	slave_info_ptr = (T_DP_SLAVE_PARAM_SLAVE_INFO  *) (get_slave_param_con_ptr + 1);

    if ( (con_ind_sdb.service   == DP_GET_SLAVE_PARAM) &&
             (con_ind_sdb.primitive == CON               ) &&  //01
             (con_ind_sdb.result    == POS               ) )   //POS=00
        {

        //slave
          io_descr [ Activeslaves[i].SlaveAdd].number_inputs  = slave_info_ptr->number_inputs;
          io_descr [ Activeslaves[i].SlaveAdd].number_outputs = slave_info_ptr->number_outputs;
          io_descr [ Activeslaves[i].SlaveAdd].offset_inputs  = slave_info_ptr->offset_inputs;
          io_descr [ Activeslaves[i].SlaveAdd].offset_outputs = slave_info_ptr->offset_outputs;
       }
        else
       {
             
         return (PB_FALSE);
        }
    
  //} /* for slave */2008-5-20 DElete
///////////////////////////////////////
}//2008-5-20 Add
}

//////////////////////////////////////////////
  return (PB_TRUE);

} /* dp_io_offsets */
 ///////////////////////////////////////////////////////////////////
/****************************************************************************/
 /*------------------------------------------------------------------------*/
  /* FUNCTIONAL_DESCRIPTION                                                 */
  /*------------------------------------------------------------------------*/
  /* This function is used to exchange data with the slaves                 */
  /*              与从站交换数据                                            */
  /* possible return values:                                                */
  /*   NONE                                                                 */
  /*                                                                        */
  /*------------------------------------------------------------------------*/
// PB_BOOL CPbproComm::dp_data_exchange (  UINT slavenumber  )  //2008-5-21
PB_BOOL CPbproComm::dp_data_exchange (   )
{
LOCAL_VARIABLES

  USIGN16             data_len;
  USIGN16             offset_inputs;

  USIGN8              slave;
  static int          zaehler = 4;
  
  INT16               result=1000;              /* !!! local result variable !!! */
  USIGN16             retry_counter;

  //CString             str1;
  //CString             str2;
  int                 i=0;

FUNCTION_BODY
 
//data [DP_MAX_TELEGRAM_LEN-1]='\0';
  //int j=Activeslaves.GetSize();
  int j=ActiveslavesSize; //2008-5-11
    if(j<1)
	{
	//	AfxMessageBox("Slave is not on bus");
		return false;
	}
 //for (slave = 0; slave<j; slave++)//2008-5-23
///////////////////////////////////////////////
	//2008-5-23
for(i=0;i<DP_MAX_SLAVE_ADDRESS;i++)
{
  if(Activeslaves[i].ind==1)
  {

	offset_inputs=io_descr [ Activeslaves[i].SlaveAdd].offset_inputs; //2008-5-20
		
		
    /*--- GET CURRENT INPUTE VALUES------------------------------------------*/

    retry_counter = DP_MAX_SERVICE_RETRY;
 

    /*--- SET NEW OUTPUT VALUES --------------------------------------------*/

    retry_counter =1;   

     data_len = io_descr [ Activeslaves[i].SlaveAdd].number_outputs; //2008-5-20


   
  
      result = profi_set_data
                 (
                    //ID_DP_SLAVE_IO_IMAGE,
					0x80,
                    offset_inputs,
                    data_len,
             Output_data[Activeslaves[i].SlaveAdd]   //2008-5-20


                 ); 

	if(result == E_OK)
	{

	
	}
	else
	{
		//sprintf(s,"Faile to set data ");
        //OutPutString(s);
		return result;
	
	}

/////////////////////////////////////////////////////////////////////////////
	data_len = io_descr [ Activeslaves[i].SlaveAdd].number_inputs; //2008-5-20




		
		result = profi_get_data(ID_DP_SLAVE_IO_IMAGE,  
			                     offset_inputs,&data_len,
								 &Input_data[Activeslaves[i].SlaveAdd]);  //2008-5-20

	if(result == E_OK)
    { 
	
		
	}
	else
	{  
	//	sprintf(s,"Faile to get data ");
      //  OutPutString(s);
		return result;
	}

    
  } /* for slave */
}
  return result;

} /* dp_data_exchange */

 /****************************************************************************/
/*------------------------------------------------------------------------*/
  /* FUNCTIONAL_DESCRIPTION                                                 */
  /*------------------------------------------------------------------------*/
  /* Loads one slave parameter set to the protocol stack.                   */
  /* The parameter sets are defined in DPDEMO.H. For exact meaning of each  */
  /* individual parameter refer to the PROFIBUS standard.                   */
  /*                                                                        */
  /* possible return values:                                                */
  /*   - PB_TRUE                                                            */
  /*                                                                        */
  /*------------------------------------------------------------------------*/

 
 PB_BOOL CPbproComm::dp_download_slave_req (T_DP_ACTIVE_SLAVES ActiveSlave )  
{
LOCAL_VARIABLES
  USIGN8                    temp_buffer [244];
  //USIGN8                    download_buffer [244];

  T_PROFI_SERVICE_DESCR     sdb1;
 // T_DP_DOWNLOAD_REQ         FAR* download_req_ptr;


FUNCTION_BODY

  sdb1.layer     = DP;
  sdb1.service   =DP_DOWNLOAD_LOC;// DP_DOWNLOAD_LOC;
  sdb1.primitive = REQ;

 /*
  slave_para_set_ptr = (T_DP_SLAVE_PARA_SET FAR *) slave_para_table [dp_slave_table [slave_offset]];
   download_req_ptr   = (T_DP_DOWNLOAD_REQ  FAR*) download_buffer;
 */
  slave_para_set_ptr=ActiveSlave.SlavePrmSet;
  download_req_ptr->data_len   = SWAP16 (slave_para_set_ptr->slave_para_len);
  download_req_ptr->rem_add    = 2; 
  download_req_ptr->area_code  = ActiveSlave.SlaveAdd;
  download_req_ptr->add_offset = 0;
  
  memcpy (download_req_ptr + 1, slave_para_set_ptr, download_req_ptr->data_len);
  memcpy (temp_buffer, download_req_ptr, sizeof(T_DP_DOWNLOAD_REQ)+download_req_ptr->data_len);

  result=profi_snd_req_res (&sdb1,&temp_buffer, PB_FALSE);
//  Sleep(1);
  
  //sprintf (s, "DP_Download_Loc.req, area_code = %hu [%d]", download_req_ptr->area_code,result );
 // OutPutString (s);
  PROFI_RCV_CON_IND ();
//  Sleep(10);
  
  if ( (con_ind_sdb.service   ==DP_DOWNLOAD_LOC) &&
       (con_ind_sdb.primitive == CON            ) &&
       (con_ind_sdb.result    == POS            ) )
  {
    //sprintf (s, "DP_Download_Loc.con [+]: status = 0x%04X", ((T_DP_DOWNLOAD_RES_CON  *) con_ind_buffer)->status);
    //OutPutString (s);
	return (PB_TRUE);
  }
  else
  {
    //sprintf (s, "DP_Download_Loc.con [-]: status = 0x%04X", ((T_DP_DOWNLOAD_RES_CON  *) con_ind_buffer)->status);
    //OutPutString (s);
  }

  return (PB_FALSE);
} /* dp_download_slave_req */






⌨️ 快捷键说明

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