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