📄 functions.c
字号:
pListParameterDataWr = pbBaseAdress+0x28018;
//pchData=(char *)pulData;
memcpy(pListParameterDataWr,(void*)ph_ptr->vdata,sLength);
// memcpy((void*)rRequestData.Data_Cont,(void*)pulData,sLength);
}
rRequestData.uControlWord = sControlWord;
/* RtPrintf("sControlWord=0x%08x\n",sControlWord);
RtPrintf("Request_HMIWriteDriveParameter rRequestData.ulIdent_Nbr=0x%08x\n",rRequestData.ulIdent_Nbr);
RtPrintf("Request_HMIWriteDriveParameter rRequestData.uControlWord=0x%08x\n",rRequestData.uControlWord);
*/
memcpy( (NC_SERVICE_CHN*)pbDriveParameterDataWr, &rRequestData,sizeof(rRequestData));
return(SVCH_OK);
}
USHORT Response_WriteDriveParameter (USHORT uDriveNbr, ULONG* pulData)
{
#define NC_SERVICE_CHANNEL_READ(_DrvAddr) (pbBaseAdress+_DrvAddr*0x20+0x00044000)
char* pbDriveParameterDataRd;
NC_SERVICE_CHN rResponseData;
pbDriveParameterDataRd = NC_SERVICE_CHANNEL_READ(uDriveNbr);
memcpy ( &rResponseData, (NC_SERVICE_CHN*)pbDriveParameterDataRd, sizeof(rResponseData));
if(!(rResponseData.uStatusWord & 0x2))
{
return (SVCH_NO_WRITE);
}
else if (rResponseData.uStatusWord & 0x8000)
{
// RtPrintf("rResponseData.uStatusWord=0x%08x\n",rResponseData.uStatusWord);
memcpy((LARGE_INTEGER*)pulData, &(rResponseData.Data_Cont),4);
// RtPrintf("rResponseData.Data_Cont=0x%08x\n",rResponseData.Data_Cont);
// RtPrintf("in function *pulData=0x%08x\n",*pulData);
//*((LARGE_INTEGER*)psData) = rResponseData.Data_Cont;
return (SVCH_ERROR);
}
else if (rResponseData.uStatusWord & 0x40)
{
return (SVCH_IN_PROGRESS);
}
else if (rResponseData.uStatusWord & 0x80)
{
/* RtPrintf("rResponseData.uStatusWord=0x%08x\n",rResponseData.uStatusWord);
RtPrintf("rResponseData.Data_Cont=0x%08x\n",rResponseData.Data_Cont);
RtPrintf("rResponseData.usACT_LEN=0x%08x\n",rResponseData.usACT_LEN);
*/
*pulData = 0;
return (SVCH_FINISHED);
}
else
{
return (SVCH_NO_STATE);
}
}
USHORT Response_HMIWriteDriveParameter (ULONG* pulData)
{
char* pbDriveParameterDataRd;
NC_SERVICE_CHN rResponseData;
pbDriveParameterDataRd = pbBaseAdress+0x28000;
memcpy ( &rResponseData, (NC_SERVICE_CHN*)pbDriveParameterDataRd, sizeof(rResponseData));
if(!(rResponseData.uStatusWord & 0x2))
{
return (SVCH_NO_WRITE);
}
else if (rResponseData.uStatusWord & 0x8000)
{
// RtPrintf("rResponseData.uStatusWord=0x%08x\n",rResponseData.uStatusWord);
memcpy((LARGE_INTEGER*)pulData, &(rResponseData.Data_Cont),4);
// RtPrintf("rResponseData.Data_Cont=0x%08x\n",rResponseData.Data_Cont);
// RtPrintf("in function *pulData=0x%08x\n",*pulData);
//*((LARGE_INTEGER*)psData) = rResponseData.Data_Cont;
return (SVCH_ERROR);
}
else if (rResponseData.uStatusWord & 0x40)
{
return (SVCH_IN_PROGRESS);
}
else if (rResponseData.uStatusWord & 0x80)
{
/* RtPrintf("rResponseData.uStatusWord=0x%08x\n",rResponseData.uStatusWord);
RtPrintf("rResponseData.Data_Cont=0x%08x\n",rResponseData.Data_Cont);
RtPrintf("rResponseData.usACT_LEN=0x%08x\n",rResponseData.usACT_LEN);
*/
*pulData = 0;
return (SVCH_FINISHED);
}
else
{
return (SVCH_NO_STATE);
}
}
void ReadCyclicData(USHORT uDriveNbr, T_CYC_DATA* psActualData, short sActualDataLength)
{
#define ACTUAL_DATA(_DrvAddr) (pbBaseAdress + _DrvAddr*0x48 + 0x00010000)
char * pbDriveCyclicData;
pbDriveCyclicData = ACTUAL_DATA(uDriveNbr);
// RtPrintf("ReadCyclicData *pbDriveCyclicData=0X%08X\n",*(ULONG*)pbDriveCyclicData);
memcpy((char*) psActualData, pbDriveCyclicData, sActualDataLength);
// RtPrintf("ReadCyclicData *psActualData=0X%08X\n",*(ULONG*)psActualData);
}
void WriteCyclicData(USHORT uDriveNbr, T_CYC_DATA * psCommandData, short sCommandDataLength)
{
#define COMMAND_DATA(_DrvAddr) (pbBaseAdress + _DrvAddr*0x48)
char * pbDriveCyclicData;
pbDriveCyclicData = COMMAND_DATA(uDriveNbr);
memcpy(pbDriveCyclicData, (char*) psCommandData, sCommandDataLength);
}
DWORD Init_SHM(void)
{
HANDLE tmp_handle;
DWORD ret;
SERC_ARGS_t *pSMem;
RtPrintf("Init_SHM\n");
/* Shared-Memory fuer Semaphorennamen bilden */
tmp_handle = RtCreateSharedMemory( PAGE_READWRITE,
0,
sizeof(T_IPC_NAMES),
"IPC_NAMES",
(void**)&ipc_handles.pSMemNames);
if( tmp_handle == NULL )
{
RtPrintf("Init_SHM1\n");
ret = GetLastError();
return(1);
}
RtPrintf("Init_SHM\n");
/* Namen der Shared-memorys eintragen */
strcpy( ipc_handles.pSMemNames->ACPH_CNL, "ACPH_CHANNEL");
strcpy( ipc_handles.pSMemNames->ACPH_FLAG, "ACPH_FLAG");
strcpy( ipc_handles.pSMemNames->ACPH_BUSY, "ACPH_BUSY");
strcpy( ipc_handles.pSMemNames->ACPH_READY, "ACPH_READY");
strcpy( ipc_handles.pSMemNames->DIAG_FLAG, "DIAG_FLAG");
strcpy( ipc_handles.pSMemNames->DIAG_CNL, "DIAGNOSE");
strcpy( ipc_handles.pSMemNames->REAL_CNL, "REAL_CHANNEL");
strcpy( ipc_handles.pSMemNames->CYCLE_DATA_AT, "CYCLE_DATA_AT");
strcpy( ipc_handles.pSMemNames->CYCLE_DATA_MDT,"CYCLE_DATA_MDT");
strcpy( ipc_handles.pSMemNames->SOFT_SYNC, "SOFTWARE_SYNC");
strcpy( ipc_handles.pSMemNames->SYST_CNL, "SYST_CHANNEL");
strcpy( ipc_handles.pSMemNames->SYST_FLAG, "SYST_FLAG");
strcpy( ipc_handles.pSMemNames->SYST_BUSY, "SYST_BUSY");
strcpy( ipc_handles.pSMemNames->SYST_READY, "SYST_READY");
strcpy( ipc_handles.pSMemNames->TERMINATE_FLAG, "TERMINATE_FLAG");
ipc_handles.TERMINATE_FLAG = RtCreateSemaphore( 0,
0,
1,
ipc_handles.pSMemNames->TERMINATE_FLAG);
if( ipc_handles.TERMINATE_FLAG == NULL )
{
RtPrintf("Init_SHM ipc_handles.TERMINATE_FLAG == NULL\n");
ret = GetLastError();
return(1);
}
RtPrintf("Init_SHM ipc_handles.TERMINATE_FLAG == TRUE\n");
tmp_handle = RtCreateSharedMemory( PAGE_READWRITE,
0,
sizeof(DIAGNOSE),
ipc_handles.pSMemNames->DIAG_CNL,
(void **)&ipc_handles.DIAG_CNL);
if( tmp_handle == NULL )
{
ret = GetLastError();
return(1);
}
/* Flag zur Kommunikation zwischen den Threads / DIAG bilden */
ipc_handles.DIAG_FLAG = RtCreateSemaphore( 0,
0,
1,
ipc_handles.pSMemNames->DIAG_FLAG);
if( ipc_handles.DIAG_FLAG == NULL )
{
ret = GetLastError();
return(1);
}
/* Shared-Memory fuer die MDT-Echtzeitdaten bilden */
tmp_handle = RtCreateSharedMemory( PAGE_READWRITE,
0,
(256 * sizeof(T_CYC_DATA)),
ipc_handles.pSMemNames->CYCLE_DATA_MDT,
(void **)&ipc_handles.CYCLE_DATA_MDT);
if( tmp_handle == NULL )
{
ret = GetLastError();
return(1);
}
/* Shared-Memory fuer die Software-Synchronisation bilden */
tmp_handle = RtCreateSharedMemory( PAGE_READWRITE,
0,
(256 * sizeof(T_CYC_DATA)),
ipc_handles.pSMemNames->CYCLE_DATA_AT,
(void **)&ipc_handles.CYCLE_DATA_AT);
if( tmp_handle == NULL )
{
ret = GetLastError();
return(1);
}
/* Semaphore fuer die User-ISR Synchronisation */
ipc_handles.REAL_CNL = RtCreateSemaphore( 0,
0,
1,
ipc_handles.pSMemNames->REAL_CNL);
if( ipc_handles.REAL_CNL == NULL )
{
ret = GetLastError();
return(1);
}
/* Semaphore fuer die Software-Synchronisation bilden */
ipc_handles.SOFT_SYNC = RtCreateSemaphore( 0,
0,
1,
ipc_handles.pSMemNames->SOFT_SYNC);
if( ipc_handles.SOFT_SYNC == NULL )
{
ret = GetLastError();
return(1);
}
/* Shared-Memory fuer ACPH-Kommunikation bilden */
ipc_handles.ACPH_CNL = RtCreateSharedMemory( PAGE_READWRITE,
0,
sizeof(SERC_ARGS_t),
ipc_handles.pSMemNames->ACPH_CNL,
(void **)&pSMem);
if( ipc_handles.ACPH_CNL == NULL )
{
ret = GetLastError();
return(1);
}
ipc_handles.ACPH_BUSY = RtCreateSemaphore( 0,
1,
1,
ipc_handles.pSMemNames->ACPH_BUSY);
if( ipc_handles.ACPH_BUSY == NULL )
ret = GetLastError();
//strcpy( pSMem->busy, ipc_handles.pSMemNames->ACPH_BUSY);
ipc_handles.ACPH_READY = RtCreateSemaphore( 0,
0,
1,
ipc_handles.pSMemNames->ACPH_READY);
if( ipc_handles.ACPH_READY == NULL )
ret = GetLastError();
// strcpy( pSMem->ready, ipc_handles.pSMemNames->ACPH_READY);
/* Flag zur IPC des AC-Parameterhandlers bilden */
ipc_handles.ACPH_FLAG = RtCreateSemaphore( 0,
0,
1,
ipc_handles.pSMemNames->ACPH_FLAG);
if( ipc_handles.ACPH_FLAG == NULL )
{
ret = GetLastError();
return(1);
}
/* Shared-Memory fuer SYST-Kommunikation bilden */
ipc_handles.SYST_CNL = RtCreateSharedMemory( PAGE_READWRITE,
0,
sizeof(SYST_t),
ipc_handles.pSMemNames->SYST_CNL,
(void **)&pSMem);
if( ipc_handles.SYST_CNL == NULL )
{
ret = GetLastError();
return(1);
}
ipc_handles.SYST_BUSY = RtCreateSemaphore( 0,
1,
1,
ipc_handles.pSMemNames->SYST_BUSY);
if( ipc_handles.SYST_BUSY == NULL )
ret = GetLastError();
//strcpy( pSMem->busy, ipc_handles.pSMemNames->ACPH_BUSY);
ipc_handles.SYST_READY = RtCreateSemaphore( 0,
0,
1,
ipc_handles.pSMemNames->SYST_READY);
if( ipc_handles.SYST_READY == NULL )
ret = GetLastError();
// strcpy( pSMem->ready, ipc_handles.pSMemNames->ACPH_READY);
/* Flag zur IPC des AC-Parameterhandlers bilden */
ipc_handles.SYST_FLAG = RtCreateSemaphore( 0,
0,
1,
ipc_handles.pSMemNames->SYST_FLAG);
if( ipc_handles.SYST_FLAG == NULL )
{
RtPrintf("Init_SHM ipc_handles.SYST_FLAG error\n");
ret = GetLastError();
return(1);
}
return(0);
}
ULONG create_parameter_handler_tasks( void )
{
HANDLE hThread;
DWORD threadId;
ULONG func_ret;
func_ret = OK;
hThread = CreateThread( NULL,
0,
acph,
NULL,
CREATE_SUSPENDED,
(LPDWORD)&threadId );
if ( hThread != NULL )
{ /* Eintrag der Task in die CLC-Task-Struktur */
strcpy( SCS_Task[ACPH].Name, "ACPH");
SCS_Task[ACPH].TaskID = threadId;
SCS_Task[ACPH].TaskHandle = hThread;
SCS_Task[ACPH].Status = CREATED;
}
else
func_ret |= NOT_OK; /* ACHTUNG - Betriebssystemfehler */
hThread = CreateThread( NULL,
0,
syst,
NULL,
CREATE_SUSPENDED,
(LPDWORD)&threadId );
if ( hThread != NULL )
{ /* Eintrag der Task in die CLC-Task-Struktur */
strcpy( SCS_Task[SYST].Name, "SYST");
SCS_Task[SYST].TaskID = threadId;
SCS_Task[SYST].TaskHandle = hThread;
SCS_Task[SYST].Status = CREATED;
}
else
func_ret |= NOT_OK; /* ACHTUNG - Betriebssystemfehler */
/* hThread = CreateThread( NULL,
0,
endh,
NULL,
CREATE_SUSPENDED,
(LPDWORD)&threadId );
if ( hThread != NULL )
{
strcpy( SCS_Task[ENDH].Name, "SYST");
SCS_Task[ENDH].TaskID = threadId;
SCS_Task[ENDH].TaskHandle = hThread;
SCS_Task[ENDH].Status = CREATED;
}
else
func_ret |= NOT_OK;
*/
return( func_ret );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -