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

📄 pbprocomm.cpp

📁 profibus dp主站于从站通信
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PbproComm.cpp: implementation of the PbproComm class.
//
//////////////////////////////////////////////
//#include "stdafx.h"
//////////////////////////////////
//2008-5-10-18
#include <windows.h>
#include "keywords.h"
#include "pb_type.h"
#include "pb_if.h"
#include "pb_dp.h"
#include <stdio.h>
#include "pb_fmb.h"
#include "pb_err.h"


///////////////////////////
#include "PbproComm.h"
#include "dpdemo.h"
////////////// crichedit////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//char Con[4]={193,200,204,1};		 

void  CPbproComm::RemoveSlaves()
{
	memset(Activeslaves,0,sizeof(Activeslaves));
	ActiveslavesSize=0;
}
CPbproComm::PbproComm()
{
  //m_richEditStr="";
  //howmanyslaves=0;
	ActiveslavesSize=0;
	RemoveSlaves();
  max_length=125;
  comm_ref = 65;
}
///////////////////////////////////////////////////////////////////

CPbproComm::~CPbproComm()
{

}

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

PB_BOOL CPbproComm::initialize_application()   //初始化
{
   
   
   int                    iRet;
   int initialize_application=0;

   pub_bSlaveAddress  = 7;
   pub_bMasterAddress = 2; 

  /* if(MsgDisplayFlag)
   {
    print_papi_firmware_version();
   }*/
   Sleep (100);

   iRet=profi_init(0, 0, 0);
   Sleep (500);
      if(iRet!=E_OK)
	 { 
		 
		return PB_FALSE; 
	 }
      else
	  {
		 return PB_TRUE;
	  }

}

PB_BOOL CPbproComm::fmb_set_configuration_req      //FMB SEt
  (
  void
  )
  /*------------------------------------------------------------------------*/
  /* FUNCTIONAL_DESCRIPTION                                                 */
  /*                                                                        */
  /* The function is used to configure the protocol stack running in the    */
  /* firmware. The service sets the active components and allocates memory  */
  /* for the number of devices specified.                                   */
  /*                                                                        */
  /* possible return values:                                                */
  /*   - PB_TRUE                                                            */
  /*   - PB_FALSE                                                           */
  /*                                                                        */
  /*------------------------------------------------------------------------*/
{
LOCAL_VARIABLES

  T_FMB_SET_CONFIGURATION_REQ   set_config_req;
//  T_PROFI_SERVICE_DESCR         sdb;

  T_FMB_CONFIG_DP                 *config_dp_ptr;


FUNCTION_BODY

  sdb.layer     = FMB; //5
  sdb.service   = FMB_SET_CONFIGURATION; //FMB_SET_CONFIGURATION     27
  sdb.primitive = REQ;

  config_dp_ptr = (T_FMB_CONFIG_DP  *) &(set_config_req.dp);

  set_config_req.fms_active         = PB_FALSE;
  set_config_req.dp_active          = PB_TRUE;
  set_config_req.fdlif_active       = PB_FALSE;//PB_TRUE;
  set_config_req.sm7_active         = PB_FALSE;

  set_config_req.fdl_evt_receiver   =FMB_USR;//FDLIF_USR;//DP_USR;FDLIF_USR; FMB_USR;//
  /* FDL events are reproted to the application using DP */
  set_config_req.data_buffer_length = 255;


  config_dp_ptr->max_number_slaves      = 32;
  config_dp_ptr->max_slave_output_len   = 32;
  config_dp_ptr->max_slave_input_len    = 32;
  config_dp_ptr->max_slave_diag_entries = 32;
  config_dp_ptr->max_slave_diag_len     = 64;
  config_dp_ptr->max_bus_para_len       = 128;
  config_dp_ptr->max_slave_para_len     = 128;

 /* config_dp_ptr->max_number_slaves      = 127;
  config_dp_ptr->max_slave_output_len   =40;
  config_dp_ptr->max_slave_input_len    = 70;
  config_dp_ptr->max_slave_diag_entries = 250;
  config_dp_ptr->max_slave_diag_len     = 64;
  config_dp_ptr->max_bus_para_len       = 128;
  config_dp_ptr->max_slave_para_len     = 240;*/
  result = profi_snd_req_res (&sdb, &set_config_req, PB_FALSE);
  Sleep(20);
  PROFI_RCV_CON_IND (); /*Macro to fetch one confirmation or indication*/

  if ( (con_ind_sdb.service   == FMB_SET_CONFIGURATION) &&
       (con_ind_sdb.primitive == CON                  ) &&
       (con_ind_sdb.result    == POS                  ) )
  {  
	return (PB_TRUE);
  }

 return (PB_FALSE);
} /* fmb_set_configuration_req */


void CPbproComm::read_dp_master_default (  void ) 
 {
	 init_master_req.master_default_address = pub_bMasterAddress;
	 init_master_req.master_class2          = PB_FALSE;                      /* master class 1 operation */
	 init_master_req.lowest_slave_address   = 0;
	 init_master_req.slave_io_address_mode  = 0;//DP_AAM_IO_BLOCKS;     /* only mode possible with NT driver */
	 init_master_req.clear_outputs          = PB_FALSE;  /* set outputs to 'clear' befor starting to poll*/
	 init_master_req.cyclic_data_transfer   = PB_TRUE;
	 
 }

 PB_BOOL CPbproComm::dp_init_master_req (  void )  
{
  LOCAL_VARIABLES

 // T_DP_INIT_MASTER_REQ    init_master_req;
  //T_PROFI_SERVICE_DESCR   sdb;


  FUNCTION_BODY

  sdb.layer     = DP;
  sdb.service   = DP_INIT_MASTER;  //193
  sdb.primitive = REQ;

/*
  init_master_req.master_default_address = pub_bMasterAddress;
  init_master_req.master_class2          = PB_FALSE;                      / * master class 1 operation * /
  init_master_req.lowest_slave_address   = 0;
  init_master_req.slave_io_address_mode  = 0;//DP_AAM_IO_BLOCKS;     / * only mode possible with NT driver * /
  init_master_req.clear_outputs          = PB_FALSE;  / * set outputs to 'clear' befor starting to poll* /
  init_master_req.cyclic_data_transfer   = PB_TRUE;
*/
  init_master_req.auto_remote_services   = DP_AUTO_GET_MASTER_DIAG| DP_AUTO_UPLOAD_DOWNLOAD_SEQ | DP_AUTO_ACT_PARAM ;/* remote .ind handled by firmware*/ 
  result = profi_snd_req_res (&sdb, &init_master_req, PB_FALSE);
  Sleep(20);  
  /*if(MsgDisplayFlag)
  {
    sprintf (s, "DP_Init_Master.req [%d]", result);
    OutPutString (s);
  }*/

  PROFI_RCV_CON_IND (); /* macro to fetch a confirmation or indication */

  if ( (con_ind_sdb.service   == DP_INIT_MASTER) &&
       (con_ind_sdb.primitive == CON           ) &&
       (con_ind_sdb.result    == POS           ) )
  { 
	return (PB_TRUE);
  }
    return (PB_FALSE);
} /* dp_init_master_req */


 void CPbproComm::read_dp_bus_default(  void  )
 {
	  bus_para_set_ptr = (T_DP_BUS_PARA_SET  *) dp_bus_para_set;
	  download_req_ptr = (T_DP_DOWNLOAD_REQ  *) download_buffer;
	  
	  download_req_ptr->rem_add    = 0;
	  download_req_ptr->area_code  = DP_AREA_BUS_PARAM;
	  download_req_ptr->add_offset = 0;
 } /* dp_master_default */


 /****************************************************************************/
 /*------------------------------------------------------------------------*/
  /* FUNCTIONAL_DESCRIPTION                                                 */
  /*------------------------------------------------------------------------*/
  /* Loads the busparameter set to the protocol stack                       */
  /*                                                                        */
  /* NOTE: If you're operating multiple protocols (FMS/DP) simultaneously   */
  /*       service fmb_set_busparameter must be used instead                */
  /*                                                                        */
  /* possible return values:                                                */
  /*   - PB_TRUE                                                            */
  /*                                                                        */
  /*------------------------------------------------------------------------*/
 
 PB_BOOL CPbproComm::dp_download_bus_req(  void  ) 
{
/*LOCAL_VARIABLES
  USIGN8                  temp_buffer [250];

  USIGN8                  download_buffer [255];
  T_PROFI_SERVICE_DESCR   sdb;

  T_DP_DOWNLOAD_REQ        *download_req_ptr;
  T_DP_BUS_PARA_SET        *bus_para_set_ptr;
*/
  USIGN8                       temp_buffer [250];				
  T_FMB_SET_BUSPARAMETER_REQ   bus_par_req;
  
FUNCTION_BODY


  sdb.layer     = DP;
    sdb.service   = DP_DOWNLOAD_LOC;  //225
    sdb.primitive = REQ; 
	/* Set Description block */
	
  /*	sdb.comm_ref   = 0;
sdb.layer      = FMB;
sdb.service    = FMB_SET_BUSPARAMETER;
sdb.primitive  = REQ;*/

 
 
   download_req_ptr->data_len   = SWAP16 (bus_para_set_ptr->bus_para_len);
    
    memcpy (download_req_ptr + 1, bus_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 (&sdb, &temp_buffer, PB_TRUE);
 
/*
bus_par_req.loc_add         = 2;

bus_par_req.in_ring_desired = 255;
bus_par_req.baud_rate       = 2;
bus_par_req.loc_segm        = 255;
bus_par_req.medium_red      = 0;

//if (gateway_flag ==0)
{
    // Baudrate 93,75 with no Coupler to IEC-31,25 
    bus_par_req.tset            = 1;
    bus_par_req.tsl             = 100;
    bus_par_req.min_tsdr        = 11;
    bus_par_req.max_tsdr        = 60;
    bus_par_req.tqui            = 0;
    bus_par_req.max_retry_limit = 1;
}


bus_par_req.ttr             = 100000;
bus_par_req.g               = 1;
bus_par_req.hsa             = 126;



result=(profi_snd_req_res(&sdb,&bus_par_req,PB_TRUE));*/


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

  return PB_FALSE;
} /* dp_download_bus_req */


 PB_BOOL CPbproComm::dp_act_param_loc_req( USIGN8    identifier  ) 
{
LOCAL_VARIABLES

  T_DP_ACT_PARAM_REQ      act_param_req;
 // T_PROFI_SERVICE_DESCR   sdb;
  int retry=0;

FUNCTION_BODY

  sdb.layer     = DP;
  sdb.service   = DP_ACT_PARAM_LOC;//194
  sdb.primitive = REQ;

  act_param_req.rem_add   = 0;
  act_param_req.area_code = DP_AREA_SET_MODE;
  act_param_req.activate  = identifier;

  
 

  result = profi_snd_req_res (&sdb, &act_param_req, PB_FALSE);
Sleep(10);
do {
	
  PROFI_RCV_CON_IND ();
 //Sleep(10);

  if ( (con_ind_sdb.service   == DP_ACT_PARAM_LOC) &&
	  (con_ind_sdb.primitive == CON               ) &&
	  (con_ind_sdb.result    == POS               ) )
  {  
	 return (PB_TRUE);
  }
  retry++;
} while(retry<3);


  return PB_FALSE;
} /* dp_act_param_loc_req */

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

 PB_BOOL CPbproComm::dp_slave_scan (void  )
 { 
    USIGN8 ScanEnd       =  DP_MAX_SLAVE_ADDRESS;
    // howmanyslaves = 0;
	ActiveslavesSize=0; //2008-5-11
    USIGN8 Slavezaehler  = 0 ;
	//int retry=0;
	USIGN8 temp_buffer [244];
	//PB_BOOL  dp_slave_diag_con_received ;  //2008-5-11
	//PB_BOOL  dp_slave_diag_con_pos_received;  //2008-5-11
    //T_DP_ACTIVE_SLAVES tempActiveSlave;
	
    T_DP_SLAVE_DIAG_REQ* sl_diag;
	sl_diag=(T_DP_SLAVE_DIAG_REQ*)temp_buffer; 
	
	//CScanSlavesDlg* m_slavesDlg=new CScanSlavesDlg;
	//m_slavesDlg->Create(IDD_DIALOG_SCAN_SLAVES,dlgWnd );
    //m_slavesDlg->ShowWindow(SW_SHOW);
	//m_slavesDlg->m_slavesProgress.SetRange(0,DP_MAX_SLAVE_ADDRESS);
    //m_slavesDlg->m_slavesProgress.SetStep(2);
	for( Slavezaehler=0;Slavezaehler<DP_MAX_SLAVE_ADDRESS;Slavezaehler++)
	{  
	  Sleep(10);
	  //m_slavesDlg->m_slavesProgress.SetPos(Slavezaehler);
	 // m_slavesDlg->UpdateWindow();
	  sdb.comm_ref= 0;
	  sdb.layer=DP;
	  sdb.service=DP_SLAVE_DIAG;
	  sdb.primitive=REQ;
	  sdb.invoke_id=0;
	  sdb.result=POS;
       int 	retry_counter =20;
	  sl_diag->rem_add= Slavezaehler ;
	  sl_diag->dummy= PB_TRUE ;	 
	 
	 

⌨️ 快捷键说明

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