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

📄 convert.cpp

📁 SERCOSII卡驱动,通过该驱动程序可以在windowXp与RTX环境下运行自己编写的数控软件实现对数控设备的驱动。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				ucStringLength = 2, 2 Stellen-(char)-Hexadezimalzahl                          
				ucStringLength = 4, 4 Stellen-(short)-Hexadezimalzahl                         
				ucStringLength = 8, 8 Stellen-(long)-Hexadezimalzahl                          
				Beispiele:                                                         
				ucStringLength = 0; ulDatum = E; => chDest = E;                                 
				ucStringLength = 2; ulDatum = E; => chDest = 0E;                                
				ucStringLength = 4; ulDatum = E1; => chDest = 00E1;                             
				ucStringLength = 8; ulDatum = E1; => chDest = 000000E1;                         
				Bei einem gewaehltem Anzeigeformat von 2 Stellen (ucStringLength=2), muss die 
				aufrufende Funktion ulDatum auf max.2 Stellen begrenzen. (casten auf
			    unsigned char/char).    
				*/
				ulBufferlength = strlen(chBuffer);
				if (ulBufferlength < ucStringLength)
				{
					/* Init Schleifenzaehler mit 'Stellen - 1' */
					usVarJ = ucStringLength - 1;
					for (usVarI = (unsigned short)ulBufferlength; usVarI > 0; usVarI--)
					{
						chBuffer[usVarJ--] = chBuffer[usVarI-1];
					}
					
					for (usVarI = 0; usVarI <= usVarJ; usVarI++)
					{
						/* mit fuehrenden Nullen auff黮len    */
						chBuffer[usVarI] = '0';
					}
				}
				
				strcat( chDest, chBuffer );
				break;

			case 0x004: /*** String *************************************************/
				strcpy( chDest, (char*) pSConvert->psData );
				break;

			case 0x006: 
				/*
				** Dump memory: Dieses Datenformat stellt die (maxi-	
				26) Datenbytes eines Speicherbereich in HEXASCII-  	
				Format dar und haengt ein Leerzeichen als Trennzei-	
				chen an. Aus einem Datenbyte werden somit 3 Anzeige-	
				bytes gebildet.			  	
				Beispiele:	0x31 --> 0x33, 0x31, 0x20,	
							0x5B --> 0x35, 0x42, 0x20,	
							0xF0 --> 0x46, 0x30, 0x20.		
				*/
				pucByte = (unsigned char *)pSConvert->psData;
				
				usVarI = 0;
				for ( usVarJ = 0; usVarJ < pSConvert->usLength; usVarJ++ )
				{ /* Telegramm ins Array chDest[] uebernehmen */
					ucChar = ((pucByte[usVarJ] & HIGH_NIBBLE) >> SHIFT_4);
					if ( ucChar < MIN_CHAR_VALUE )
						chDest[usVarI++] = ucChar + HEX_ASCII_DIGIT_VALUE;
					else
						chDest[usVarI++] = ucChar + HEX_ASCII_CHAR_VALUE;

					ucChar = (pucByte[usVarJ] & LOW_NIBBLE);
					if ( ucChar < MIN_CHAR_VALUE )
						chDest[usVarI++] = ucChar + HEX_ASCII_DIGIT_VALUE;
					else
						chDest[usVarI++] = ucChar + HEX_ASCII_CHAR_VALUE;

					if ( (!ucStringLength) || (usVarJ % TWO_W) )
						/* Entweder bei Byte-Anzeige oder (Word) nach jedem zweiten Byte */
						chDest[usVarI++] = ' ';
				} /* end for */

				/* Rest des Arrays chDest[] loeschen und das Telegramm anzeigen */
				for ( usVarJ = usVarI; usVarJ < pSConvert->usSize ; usVarJ++ )
					chDest[usVarJ] = ' ';
				
				chDest[usVarJ] = 0;				/* terminierende '0' gesetzt */
				break;

			case 0x105: /*** Anzeigeformat Identnummer ******************************/
				if( pSConvert->ulDatum & P_PAR_MASK)
					strcpy( chDest, "P-" );
				else
					strcpy( chDest, "S-" );
				sprintf( chBuffer, "%1.1d-", (((unsigned short) pSConvert->ulDatum & 0x7000) >> 12) );
				strcat( chDest, chBuffer );
				sprintf( chBuffer, "%4.4d", (unsigned short) pSConvert->ulDatum & 0x0FFF);
				strcat( chDest, chBuffer );
				break;

			case 0x207: /*** Anzeigeformat SYNAX-Liste ******************************/
				switch( pSConvert->ulDatum & 0x000F8000 )
				{
				case 0x00010000:                  /* A-Parameter */
					strcpy( chDest, "A__:A-");
					sprintf( chBuffer, "%1.1d-", (((unsigned short) pSConvert->ulDatum & 0x7000) >> 12) );
					strcat( chDest, chBuffer );
					sprintf( chBuffer, "%4.4d", (unsigned short) pSConvert->ulDatum & 0xFFF );
					strcat( chDest,chBuffer);
					ucChar = (unsigned char)( pSConvert->ulDatum >> 24 );
					sprintf( chBuffer, "%2.2d", ucChar );
					chDest[1] = chBuffer[0];
					chDest[2] = chBuffer[1];
					break;
				
				case 0x00040000:                  /* Y-Parameter */
					// JL (18.03.99): CLC in SCS ge鋘dert
					strcpy( chDest, "SCS:Y-" );
					sprintf( chBuffer, "%1.1d-", (((unsigned short) pSConvert->ulDatum & 0x7000) >> 12) );
					strcat( chDest, chBuffer );
					sprintf( chBuffer, "%4.4d", (unsigned short) pSConvert->ulDatum & 0xFFF );
					strcat( chDest, chBuffer );
					break;
				
				case 0x00000000:                  /* S-Parameter */
					strcpy( chDest, "A__:S-" );
					sprintf( chBuffer, "%1.1d-", (((unsigned short) pSConvert->ulDatum & 0x7000) >> 12) );
					strcat( chDest, chBuffer );
					sprintf( chBuffer, "%4.4d", (unsigned short) pSConvert->ulDatum & 0xFFF );
					strcat( chDest, chBuffer );
					ucChar = (unsigned char)( pSConvert->ulDatum >> 24 );
					sprintf( chBuffer, "%2.2d", ucChar );
					chDest[1] = chBuffer[0];
					chDest[2] = chBuffer[1];
					break;
      
				case 0x00008000:                  /* P-Parameter */
					strcpy( chDest, "A__:P-" );
					sprintf( chBuffer, "%1.1d-", (((unsigned short) pSConvert->ulDatum & 0x7000) >> 12) );
					strcat( chDest, chBuffer );
					sprintf( chBuffer, "%4.4d", (unsigned short) pSConvert->ulDatum & 0xFFF );
					strcat( chDest, chBuffer );
					ucChar = (unsigned char)( pSConvert->ulDatum >> 24 );
					sprintf( chBuffer, "%2.2d", ucChar );
					chDest[1] = chBuffer[0];
					chDest[2] = chBuffer[1];
					break;
				
				default:
					return( ERR_ELM7_NK );          /* Fehler: Datum nicht korrekt   */
			} /* End of switch: Auswertung des Anzeigeformates */
		
		} /* End of switch: Auswertung des Datentyps bzw. der Datenlaenge */

		if( ucKomma )								/* Das Komma ausfiltern     */
		{
			ucChar = (unsigned char) strlen( chDest );
			if( chDest[0] == '-' )
				ucChar--;
      
			if( ucChar <= ucKomma )                 /* Fuehrende Null           */
			{
				if( chDest[0] == '-' )
				{
					strcpy( chBuffer, "-0.0000000000" );
					chBuffer[ucKomma+3-ucChar] = 0;
					strcat( chBuffer, &chDest[1] );
				}
				else
				{
					strcpy( chBuffer, "0.0000000000" );
					chBuffer[ucKomma+2-ucChar] = 0;
					strcat( chBuffer, chDest );
				}
				
				strcpy( chDest, chBuffer );
			}
			else
			{
				if( chDest[0] == '-' )
					ucChar++;
				
				for( ++ucKomma; ucKomma; ucKomma--, ucChar-- )
					chDest[ucChar+1] = chDest[ucChar];
				
				chDest[ucChar+1] = '.';
			}
		}
		// WR: definitiv beenden
		return( OK );
		
	case SCS_ELEM3:       /*** Attribut konvertieren **************************/
		strcpy( chDest, "00000000000000000000000000000000" );
		itoa( pSConvert->ulAttribut, chBuffer, BINAER );	/* Attribute        */
		ucChar = (unsigned char) strlen( chBuffer );
		chDest[32-ucChar] = 0;                          /* Fuehrende Nullen */
		strcat( chDest, chBuffer );
		return( OK );
	
	case SCS_ELEM1:       /*** Identnummer konvertieren ***********************/
		switch( ucStringLength )
		{
		case 0:                                         /* S/P-Parameter    */
			if( pSConvert->usIdentnr & P_PAR_MASK)
				strcpy( chDest, "P-" );
			else
				strcpy( chDest, "S-" );
      
			sprintf( chBuffer, "%1.1d-", ((pSConvert->usIdentnr & 0x7000) >> 12) );
			strcat( chDest, chBuffer );
			sprintf( chBuffer, "%4.4d", (pSConvert->usIdentnr & 0x0FFF) + 1);
			strcat( chDest, chBuffer );
			return( OK );
				
		case 3:                                         /* Y-Parameter      */
			strcpy( chDest, "Y-" );
			sprintf( chBuffer, "%1.1d-", ((pSConvert->usIdentnr & 0x7000) >> 12) );
			strcat( chDest, chBuffer );
			sprintf( chBuffer, "%4.4d", (pSConvert->usIdentnr & 0x0FFF) + 1);
			strcat( chDest, chBuffer );
			return( OK );
		
		case 2:											/* A-Parameter      */
			strcpy( chDest, "A-" );
			sprintf( chBuffer, "%1.1d-", ((pSConvert->usIdentnr & 0x7000) >> 12) );
			strcat( chDest, chBuffer );
			sprintf( chBuffer, "%4.4d", (pSConvert->usIdentnr & 0x0FFF) + 1);
			strcat( chDest, chBuffer );
			return( OK );
		} /* End of switch: Auswertung der Parameterart */
  
	default:
		return( NOT_OK );
	} /* End of switch: Auswertung des SERCOS-Elementes */

} /*** End of function 'dat2asc()' ******************************************/



/*****************************************************************************
* Funktion: asc2dat()
* Aufgabe:  Konvertiert einen ASCII-Eingabe-String in ein Betriebsdatum, eine
*           Identnummer oder in ein Attribut. (ah ja)
* Param.:   pSConvert, chSource, *ucParameterTyp
* Return:   unsigned short
*             0  = FALSE = Alles in Ordnung
*             !0 = TRUE  = Fehler bzw. Fehler-Code entspr. SERCOS + ACPH
* Ev,Mess.: keine
* Hinweise: keine
*
* Aenderungen:
* 23.01.95 SKR Siehe aeltere Software-Versionen.
* 20.03.95 MH StS
*          Fehler bei Typ SYNAX-IDN behoben: Bisher konnten keine
*          S/P-Parameter eingegeben werden (wird benoetigt fuer C-0-0058 ff:
*          Datenbausteine bei 3964R).
* 05.04.95 SKR
*           - Den Rueckgabewert 0x7008 durch das #define ERR_ELM7_NK ersetzt.
*           - Den Rueckgabewert 0x1001 durch das #define ERR_ELM1_NV ersetzt.
*           - Die Division mit dem Bewertungsfaktor in die 'case'-Auswertung
*             der verschiedenen Datenlaengen verschoben.
*           - Die Funktionen 'strtol()' und 'strtoul()' werden nicht mehr
*             verwendet, weil diese NICHT 'reentrant-faehig' sind !!  Eine
*             Auswertung der globalen, statischen MCC68K-Systemvariable
*             'errno' war deshalb im Prinzip nicht moeglich.
*           - Stattdessen die Funktionen 'string2long()' und 'string2unsigned long()'
*             implementiert. Diese benutzen nicht mehr 'errno', sondern den
*             Uebergabeparameter 'ulError'. Dadurch sind diese Funktionen
*             'reentrant-faehig'.
*****************************************************************************/
/*
	WR :

	- zur Konvertierung eines Datum-Strings sind folgende Eingabewerte erforderlich:

	1. Attribut (mu

⌨️ 快捷键说明

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