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

📄 functions.c

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

ULONG start_parameter_handler_tasks(void)
{
  ULONG ret;
  ULONG func_ret;

  func_ret = OK;


	/****************************************************************/
	/* Start der A-/C-Parameter-Handler Task			*/
	/****************************************************************/
  ret = ResumeThread(SCS_Task[ACPH].TaskHandle);
  if ( ret != 0xFFFFFFFF )
    SCS_Task[ACPH].Status = STARTED;
  else
    func_ret |= NOT_OK;		/* ACHTUNG - Betriebssystemfehler	*/

	/****************************************************************/
	/* Start System channel Handler Task			*/
	/****************************************************************/
  ret = ResumeThread(SCS_Task[SYST].TaskHandle);
  if ( ret != 0xFFFFFFFF )
    SCS_Task[SYST].Status = STARTED;
  else
    func_ret |= NOT_OK;		/* ACHTUNG - Betriebssystemfehler	*/


   return( func_ret );
}
unsigned long RTFCNDCL acph( PVOID	pUnused )
{
  HANDLE acSHMhdl;              /* Shared-Memory fuer A/C Parameter */
  SERC_ARGS_t* ph_ptr;          /* Pointer auf die Uebergabe-Struktur       */
  ULONG ret;                    /* Rueckgabewert fuer RTX-Funktionsaufrufe */
  BOOL  bret;
  T_IPC_NAMES *pSMemNames;      /* Namensliste aller named objects */
  HANDLE hIPCNames;
  ////////
	USHORT usFail,*uspData,iTimeCounter;
	
	ULONG ulData=0,ulLength=0,ulErrorMessage=0;
 	/****************************************************************/
  /* 1. Schritt: Die Prioritaet dieses Threads auf 123 setzen     */
 	/****************************************************************/
  SCS_Task[ACPH].Status = STARTED;
  bret = RtSetThreadPriority( GetCurrentThread(), RT_PRIORITY_MIN+2);
  if( !bret )
    ret = GetLastError();
  /* Shared-Memory fuer die IPC-Namen oeffnen */
  hIPCNames = RtOpenSharedMemory( SHM_MAP_READ, 
                                  0, 
	                 							  "IPC_NAMES", 
							                    (void **)&pSMemNames);
  if( hIPCNames == NULL )
    ret = GetLastError();

  /* Shared-Memory fuer den ACPH IPC oeffnen */
  acSHMhdl = RtOpenSharedMemory( SHM_MAP_WRITE, 0, pSMemNames->ACPH_CNL, (void **)&ph_ptr);
  if( acSHMhdl == NULL )
    ret = GetLastError();

  /* Ab hier wird die IPC-Namensliste nicht mehr gebraucht */
  bret = RtCloseHandle( hIPCNames );
  if( !bret )
    ret = GetLastError();

  SCS_Task[ACPH].Status = READY;        /* ACPH-Task ist 'ready to work'    */
  while( TRUE )
  {
    /* Warte auf eine Anforderung von einer anderen Task */
    ret = RtWaitForSingleObject(ipc_handles.ACPH_FLAG,INFINITE);
    if( ret == WAIT_FAILED ){
		RtPrintf("acph RtWaitForSingleObject(ipc_handles.ACPH_FLAG,INFINITE) FAILED\n");
      ret = GetLastError();
	}
	ph_ptr->ret = 0;
	iTimeCounter = 0;
	switch (ph_ptr->NCsvch_HMIsvch){
		case NC_SVCH:
			switch ( ph_ptr->rd_wrt ){
    			case PAR_LESEN:
				  /* C- oder A-Parameter lesen */
			//		if(ph_ptr->bSinglePara)
					RtPrintf("ph_ptr->ident_nbr=0x%08x\n",ph_ptr->ident_nbr);
					usFail=Request_ReadDriveParameter(ph_ptr->drv_nbr, ph_ptr->ident_nbr,
						ph_ptr->element,ph_ptr->bSinglePara);
					if (usFail != SVCH_OK){
						ph_ptr->ret = usFail;
						break;
					}

					do
					{
						Sleep(WAIT_TIME);
						usFail=Response_ReadDriveParameter(ph_ptr->drv_nbr, &ulData,(USHORT*)(&ulLength));
						iTimeCounter++;
						RtPrintf("ph_ptr->ident_nbr=0x%08x\n",ph_ptr->ident_nbr);
						RtPrintf("iTimeCounter=%d,usFail=0x%08x\n",iTimeCounter,usFail);
						if(iTimeCounter>10){
							ph_ptr->ret = ERR_ANF_UZL;
							break;
						}
						RtPrintf("Response_ReadDriveParameter Sleep(WAIT_TIME)\n");

					}while(usFail == SVCH_IN_PROGRESS || usFail == SVCH_NO_READ);
					if (usFail != SVCH_FINISHED){
						if( ph_ptr->ret	==	ERR_ANF_UZL)
							break;
						if( usFail == SVCH_ERROR){
							ph_ptr->ret = ulData;
							break;
						}
						ph_ptr->ret = usFail;
						break;
					}

					if(ph_ptr->bSinglePara)
					{
						ph_ptr->ldata = ulData;
					}else{
						memcpy(ph_ptr->vdata,(pbBaseAdress+0x200000)+ulData,ulLength+4);
					}
				  break;

				case PAR_SCHREIBEN:
				  /* C- oder A-Parameter schreiben (Standard) */
					usFail = Request_WriteDriveParameter(ph_ptr->drv_nbr,ph_ptr->ident_nbr,
						ph_ptr->element,ph_ptr,ph_ptr->size,ph_ptr->bSinglePara);
					if (usFail != SVCH_OK){
						ph_ptr->ret = usFail;
						break;
					}

					do
					{
						Sleep(WAIT_TIME);
						usFail=Response_WriteDriveParameter(ph_ptr->drv_nbr, &ulData);
						if(iTimeCounter>10){
							ph_ptr->ret = ERR_ANF_UZL;
							break;
						}
						RtPrintf("Response_WriteDriveParameter Sleep(WAIT_TIME)\n");
					}while(usFail == SVCH_IN_PROGRESS || usFail == SVCH_NO_WRITE);
					if (usFail != SVCH_FINISHED){
						if( ph_ptr->ret	==	ERR_ANF_UZL)
							break;
						if( usFail == SVCH_ERROR){
							ph_ptr->ret = ulData;
							break;
						}
						ph_ptr->ret = usFail;
						break;
					}
					break;
			}
			break;
		case HMI_SVCH:
			switch ( ph_ptr->rd_wrt ){
    			case PAR_LESEN:
				  /* C- oder A-Parameter lesen */
					usFail=Request_HMIReadDriveParameter(ph_ptr->ident_nbr,
						ph_ptr->element,ph_ptr->bSinglePara);
					if (usFail != SVCH_OK){
						ph_ptr->ret = usFail;
						break;
					}

					do
					{
						Sleep(WAIT_TIME);
						usFail=Response_HMIReaDriveParameter(&ulData,(USHORT*)(&ulLength));
						if(iTimeCounter>10){
							ph_ptr->ret = ERR_ANF_UZL;
							break;
						}
						RtPrintf("Sleep(WAIT_TIME)\n");
					}while(usFail == SVCH_IN_PROGRESS || usFail == SVCH_NO_READ);
					if (usFail != SVCH_FINISHED){
						if( ph_ptr->ret	==	ERR_ANF_UZL)
							break;

						if( usFail == SVCH_ERROR){
							ph_ptr->ret = ulData;
							break;
						}
						ph_ptr->ret = usFail;
						break;
					}
					if(ph_ptr->bSinglePara)
					{
						ph_ptr->ldata = ulData;
					}else{
						memcpy(ph_ptr->vdata,(pbBaseAdress+0x28018)+ulData,ulLength+4);
					}
				  break;

				case PAR_SCHREIBEN:
				  /* C- oder A-Parameter schreiben (Standard) */
					usFail = Request_HMIWriteDriveParameter(ph_ptr->ident_nbr,
						ph_ptr->element,ph_ptr,ph_ptr->size,ph_ptr->bSinglePara);
					if (usFail != SVCH_OK){
						ph_ptr->ret = usFail;
						break;
					}
					do
					{
						Sleep(WAIT_TIME);
						usFail=Response_HMIWriteDriveParameter(&ulData);
						if(iTimeCounter>10){
							ph_ptr->ret = ERR_ANF_UZL;
							break;
						}
						RtPrintf("Sleep(WAIT_TIME)\n");
					}while(usFail == SVCH_IN_PROGRESS || usFail == SVCH_NO_WRITE);
					
					if (usFail != SVCH_FINISHED){
						if( ph_ptr->ret	==	ERR_ANF_UZL)
							break;
						if( usFail == SVCH_ERROR){
							ph_ptr->ret = ulData;
							break;
						}
						ph_ptr->ret = usFail;
						break;
					}
					break;
			}
			break;
	}
	bret = RtReleaseSemaphore( ipc_handles.ACPH_READY, 1, 0);	
  }
  return(0);
}
unsigned long RTFCNDCL syst( PVOID	pUnused )
{
	HANDLE acSHMhdl;              /* Shared-Memory fuer A/C Parameter */
	  SYST_t* syst_ptr;          /* Pointer auf die Uebergabe-Struktur       */
	  ULONG ret;                    /* Rueckgabewert fuer RTX-Funktionsaufrufe */
	  BOOL  bret;
	  T_IPC_NAMES *pSMemNames;      /* Namensliste aller named objects */
	  HANDLE hIPCNames;
	  ////////
		USHORT usFail;
		ULONG ulData,ulLength,ulErrorMessage;

  SCS_Task[SYST].Status = STARTED;
  bret = RtSetThreadPriority( GetCurrentThread(), RT_PRIORITY_MIN+3);
  if( !bret )
    ret = GetLastError();
  /* Shared-Memory fuer die IPC-Namen oeffnen */
  hIPCNames = RtOpenSharedMemory( SHM_MAP_READ, 
                                  0, 
	                 							  "IPC_NAMES", 
							                    (void **)&pSMemNames);
  if( hIPCNames == NULL )
    ret = GetLastError();

  /* Shared-Memory fuer den ACPH IPC oeffnen */
  acSHMhdl = RtOpenSharedMemory( SHM_MAP_WRITE, 0, pSMemNames->SYST_CNL, (void **)&syst_ptr);
  if( acSHMhdl == NULL )
    ret = GetLastError();

  /* Ab hier wird die IPC-Namensliste nicht mehr gebraucht */
  bret = RtCloseHandle( hIPCNames );
  if( !bret )
    ret = GetLastError();

  SCS_Task[SYST].Status = READY;        /* ACPH-Task ist 'ready to work'    */
  while( TRUE )
  {
    /* Warte auf eine Anforderung von einer anderen Task */
    ret = RtWaitForSingleObject(ipc_handles.SYST_FLAG,INFINITE);
    if( ret == WAIT_FAILED ){
		RtPrintf("syst RtWaitForSingleObject(ipc_handles.SYST_FLAG,INFINITE) FAILED ipc_handles.SYST_FLAG=%d\n",ipc_handles.SYST_FLAG);
      ret = GetLastError();
	}
	switch (syst_ptr->SYST_TYPE){
		case CLEAR_ERROR:
			*(pbBaseAdress+0x20000)=3;
			break;
		case CHANGE_PHASE:
			*(SHORT*)(pbBaseAdress+0x20004)=syst_ptr->usData;
			RtPrintf("syst_ptr->usData=%d\n",syst_ptr->usData);
			break;
		case SAVE_SYSTEM_PARA:
			*(pbBaseAdress+0x20008)=3;
			break;
		case CLEAR_ALL_ERRORS:
			*(pbBaseAdress+0x2000C)=3;
			break;
		case SET_LIFECOUNTER_DIF:
			*(USHORT*)(pbBaseAdress+0x20010)=syst_ptr->usData;
			break;
		case GET_PHASE:
			syst_ptr->usData=*(pbBaseAdress+0x20024);
			break;
		case GET_DIAG_MESSAGE:
			memcpy(syst_ptr->chData,pbBaseAdress+0x20048,64);
			break;
	}
	bret = RtReleaseSemaphore( ipc_handles.SYST_READY, 1, 0);	
  }
}

void synchronize_user_isr()
{
BOOL  bret;
 
  usCount_NC_SERCOS_TAKT_SYNC_USER--;

  if( !usCount_NC_SERCOS_TAKT_SYNC_USER )
  {

    usCount_NC_SERCOS_TAKT_SYNC_USER=usNC_SERCOS_TAKT;
    bret = RtReleaseSemaphore( ipc_handles.REAL_CNL, 1, NULL);
  }
}/* End of synchronize_user_isr */

void get_nc_serc_cyc()
{
	ULONG ulNcCycleTime,ulSERCANSCycleTime,ulNcAccessTime;
	CRead_Y_Parameter(5,&ulNcCycleTime);
//	RtPrintf("ulNcCycleTime= %d\n",ulNcCycleTime);
	CRead_Y_Parameter(4,&ulNcCycleTime);
//	RtPrintf("ulNcCycleTime= %d\n",ulNcCycleTime);
	ulNcCycleTime = 2500;
	ulSERCANSCycleTime = 1000;

	usNC_SERCOS_TAKT =  ulNcCycleTime/ulSERCANSCycleTime;

	if(usNC_SERCOS_TAKT==0)
		usNC_SERCOS_TAKT=1;
	if(ulNcCycleTime % ulSERCANSCycleTime)
		usNC_SERCOS_TAKT++;

	RtPrintf("usNC_SERCOS_TAKT = %d\n",usNC_SERCOS_TAKT);

    usCount_NC_SERCOS_TAKT_SYNC_USER=1;
    usCount_NC_SERCOS_TAKT_USER_ACC =1;

	CRead_Y_Parameter(13,&ulNcAccessTime);
	RtPrintf("ulNcAccessTime= %d\n",ulNcAccessTime);
}

void get_exist_drives()
{
	int i,ret,iLength,iIndex;
	USHORT * uspData;
	ULONG * ulData;
	for(i=1;i<255;i++)
	{
		DriveExist[i] = FALSE;
	}
	ret = CRead_Y_Parameter(2,&ulData);
	uspData=(USHORT*)ulData;
	iLength = uspData[0]/2;
	RtPrintf("get_exist_drives iLength =%d\n",iLength);

	for (i=0;i<iLength;i++)
	{
		iIndex = uspData[i+2];
		RtPrintf("get_exist_drives iIndex =%d\n",iIndex);
		DriveExist[iIndex] = TRUE;
	}


	HeapFree(GetProcessHeap(),0,(void*)ulData);
}

⌨️ 快捷键说明

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