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

📄 functions.c

📁 SERCOSII卡驱动,通过该驱动程序可以在windowXp与RTX环境下运行自己编写的数控软件实现对数控设备的驱动。
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -