📄 pbprocomm.cpp
字号:
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 + -