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

📄 convert.cpp

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

/*
	膎derungen WR (ab 9.2.99):

- includes:
// strcpy etc.
#include <string.h> 
// itoa etc.
#include <stdlib.h>
#include <stdio.h>
...

	- itostr ersetzt durch itoa
	- ltostr ersetzt durch itoa
	- ltoa Korrigiert: 3. Parameter DEZIMAL
	- Einf黨rung ungarische Notation zwecks 躡ersicht im Chaos
	- Initialisierung der umbenannten Variablen
	- Listing Quellcode 黚erarbeitet

*/

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


// WR
// f黵 die Klasse selbst:
#include "convert.h"


/*****************************************************************************
* Funktion: dat2asc()
* Aufgabe:  Konvertiert ein Betriebsdatum, Minimum, Maximum, eine Identnummer 
			oder ein Attribut in einen ASCII-Ausgabe-String.
* Param.:   chDest, pSConvert, ucStringLength
* Return:   unsigned short = Parameter-Fehlercode (0,1)
* Ev,Mess.: keine
* Hinweise: keine
*
* Aenderungen:
* 20.03.95 MH StS
*          Fehler bei Typ SYNAX-IDN behoben: Bisher konnten keine
*          S/P-Parameter ausgegeben werden (wird benoetigt fuer Y-0-0058 ff:
*          Datenbausteine bei 3964R).
* 04.04.95 JL SKR
*           - Die Multiplikation mit dem Bewertungsfaktor in die 'case'-Aus-
*             wertung der verschiedenen Datenlaengen verschoben.
*           - 2-Byte-Daten werden ab jetzt wie 4-Byte-Daten gehandhabt,
*             d.h. der Cast-Operator 'short' bzw. 'unsigned short' sowie die Funktion
*             'itostr()' und 'ltostr()' werden nicht mehr verwendet.
* 11.04.95 StS Bei Auswertung, Type 'Dezimal mit Vorzeichen' in der
*              if-Anweisung '(signed long)' eingefuegt.
* 18.03.99 JL  ULONG-Konvertierung: MOTOROLA<=>INTEL
*			   "CLC" im String in "SCS" ge鋘dert
* 28.06.99 JL  Fuer vorzeichenlose Parameter wird nun die Funktion ultoa verwendet
*****************************************************************************/
/*
	WR :

	- zur Konvertierung eines Min/Max/Datum-Strings sind folgende 
	Eingabewerte erforderlich:

	1. das ucStringLength
	Formatanweisung 黚er ucStringLength:
  
	ucStringLength = 0, Anzeige mit allen verfuegbaren Stellen                    
	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).    

	2. Attribut
	3. Element-ID
	4. Min/Max/Datum-Wert

	also im Klartext:
	
	vor Aufruf:

	1. ucStringLength
	2. pSConvert->ulAttribut
	3. pSConvert->usElement=SCS_ELEM7/SCS_ELEM6/SCS_ELEM5
	4. pSConvert->ulDatum (das ist unsigned long!)


	nach Aufruf:

	Ergebnis: chDest


	- zur Konvertierung eines Attribut-Werts sind folgende Eingabewerte erforderlich:

	1. Element-ID
	2. Attribut-Wert

	also im Klartext:
	
	vor Aufruf:

	1. pSConvert->usElement=SCS_ELEM3
	2. pSConvert->ulAttribut

	nach Aufruf:

	Ergebnis: 
	
		chDest: wird auf korrekte L鋘ge gebracht "a-b-cccc"

*/
unsigned short CConvert::dat2asc(char* chDest, CHECK_ARGS* pSConvert, 
								 unsigned char ucStringLength)
{
unsigned long	ulAttribut=0;
unsigned short	usDatenTyp=0, usSize=0;
unsigned char	ucKomma=0, ucChar=0;
unsigned short	usFaktor=0;
unsigned short	usVarI=0, usVarJ=0;
unsigned char	*pucByte=NULL;
char			chBuffer[40];
unsigned long	ulBufferlength=0;


	// Element?	
	switch( pSConvert->usElement )
	{
	case SCS_ELEM5:       /*** Minimum aus Eingabewert konvertieren *************/
	case SCS_ELEM6:       /*** Maximum aus Eingabewert konvertieren *************/
	case SCS_ELEM7:       /*** Betriebsdatum konvertieren *********************/
		ulAttribut    = pSConvert->ulAttribut;					/* Attribut sichern         */
		usFaktor   = (unsigned short) (ulAttribut & 0xFFFF);	/* Bewertungsfaktor         */
	    ulAttribut  >>= 16;
		usSize     = (unsigned short) (ulAttribut & 0x7);       /* Variable Laenge          */
	    ulAttribut  >>= 4;
		usDatenTyp      = (unsigned short) (ulAttribut & 0x7);       /* Datentyp                 */
		ulAttribut  >>= 4;
		ucKomma    = (unsigned char) (ulAttribut & 0x0F);       /* Kommastellen             */

	    if( (pSConvert->usElement == SCS_ELEM5) ||		/* Bei Min. und Max. Werten */
		(pSConvert->usElement == SCS_ELEM6)    )		/* zaehlt das Bit 23        */
		{
			if((pSConvert->ulAttribut & MIN_MAX_VAR) != MIN_MAX_VAR)
				usSize &= 3;						/* Feste L鋘ge: Var. Bit weg */
		} /* End of if: Min./Max.-Wert */

		if( usSize & 0x4 )                          /* Datum variabler Laenge   */
		{
			if( usSize & 1 )                        /* Liste, 2-Byte (Word)     */
				pSConvert->ulDatum = (unsigned short) *pSConvert->psData;
			else									/* Liste, 4-Byte (Long)     */
			{
				// JL: am 18.3.99 ge鋘dert MOTOROLA<=>INTEL
				pSConvert->ulDatum   = (unsigned short) *(pSConvert->psData+1); /* Upper word               */
				pSConvert->ulDatum <<= 16;
 				pSConvert->ulDatum  |= (unsigned short) *pSConvert->psData;     /* Lower word               */
//				pSConvert->ulDatum <<= 16;
//				pSConvert->psData++;
//				pSConvert->ulDatum |= (unsigned short) *pSConvert->psData;      /* Lower word               */
//				pSConvert->psData--;
			}
		} /* End of if: Datum variabler Laenge */

		usSize  &= 0x3;                             /* Bit var.Laenge entfernen */
		usSize <<= 8;
		usDatenTyp   |= usSize;

		switch( usDatenTyp )
		{
		case 0x100:
			/*** Binaer, Word *****************************************************/
			strcpy( chDest, "0000000000000000" );
			itoa( (unsigned short)pSConvert->ulDatum, chBuffer, BINAER );
			ucChar = (unsigned char) strlen( chBuffer );
			chDest[16-ucChar] = 0;                  /* Fuehrende Nullen */
			strcat( chDest, chBuffer );
		    break;

		case 0x200:
			/*** Binaer, Long *****************************************************/
			strcpy( chDest, "00000000000000000000000000000000" );
			itoa( pSConvert->ulDatum, chBuffer, BINAER );
			ucChar = (unsigned char) strlen( chBuffer );
			chDest[32-ucChar] = 0;                  /* Fuehrende Nullen */
			strcat( chDest, chBuffer );
			break;

		case 0x101: /*** Dezimal ohne Vorzeichen, Word **************************/
		case 0x201: /*** Dezimal ohne Vorzeichen, Long **************************/
			/* Pruefen, ob das Produkt aus Datum und Bewertungsfaktor mit
			32-Bit ueberhaupt dargestellt werden kann. */
			if ( pSConvert->ulDatum > ( ULONG_MAX / usFaktor ) )
			{ /* Fehler !  Die Zahl ist als 'unsigned long' nicht mehr darstellbar */
				;
				//set_diag( TERM_SOFT_ERROR+9,		/* Fehler: 4909, Display: 95        */
				//CLC_ERROR,            /* Achsindex 0 ==> CLC-Fehler       */
       			//        SET_DIAG,					/* Diagnose wird gesetzt    */
				//        NO_MSG_RESPONSE);			/* Keine Rueckmeldung       */
			}
			else
				pSConvert->ulDatum *= usFaktor;        /* Bewertungsfaktor */
			
			ultoa( pSConvert->ulDatum, chDest, DEZIMAL );
			break;

			case 0x102: /*** Dezimal mit Vorzeichen, Word ***************************/
			case 0x202: /*** Dezimal mit Vorzeichen, Long ***************************/
				/* Pruefen, ob das Produkt aus Datum und Bewertungsfaktor mit
				32-Bit ueberhaupt dargestellt werden kann. */
				if ( ( (signed long)pSConvert->ulDatum > (LONG_MAX / usFaktor) ) ||
				( (signed long)pSConvert->ulDatum < (LONG_MIN / usFaktor) ) )
				{ /* Fehler !  Die Zahl ist als 'signed long' nicht mehr darstellbar */
					;
					//set_diag( TERM_SOFT_ERROR+10, /* Fehler: 4910, Display: 95        */
					//CLC_ERROR,					/* Achsindex 0 ==> CLC-Fehler       */
       				//      SET_DIAG,            	/* Diagnose wird gesetzt    */
					//      NO_MSG_RESPONSE);		/* Keine Rueckmeldung       */
				}
				else
				{
					/* Wenn signed word: Erst Konvertierung von	*/
					/* pSConvert->ulDatum auf signed short, dann auf long	*/
					if (usDatenTyp == 0x102)		/* signed word			*/
						pSConvert->ulDatum = (signed long)((signed short)pSConvert->ulDatum);
					
					//(long) pSConvert->ulDatum *= usFaktor;				/* Bewertungsfaktor */
					//WR
					pSConvert->ulDatum =(long)(pSConvert->ulDatum* usFaktor); /* Bewertungsfaktor */
				}
				
				ltoa( (long) pSConvert->ulDatum, chDest, DEZIMAL );
				break;

			case 0x103: /*** Hexadezimal (ohne Vorzeichen), Word ********************/
			case 0x203: /*** Hexadezimal (ohne Vorzeichen), Long ********************/
				/* Pruefen, ob das Produkt aus Datum und Bewertungsfaktor mit
				32-Bit ueberhaupt dargestellt werden kann. */
				if ( pSConvert->ulDatum > ( ULONG_MAX / usFaktor ) )
				{ /* Fehler !  Die Zahl ist als 'unsigned long' nicht mehr darstellbar */
					;
					//set_diag( TERM_SOFT_ERROR+11, /* Fehler: 4911, Display: 95        */
					//CLC_ERROR,					/* Achsindex 0 ==> CLC-Fehler       */
       				//      SET_DIAG,            	/* Diagnose wird gesetzt    */
					//      NO_MSG_RESPONSE);		/* Keine Rueckmeldung       */
				}
				else
					pSConvert->ulDatum *= usFaktor;    /* Bewertungsfaktor */

				strcpy( chDest, "0x" );
				/* Buffer loeschen */
				memset(chBuffer, 0, 40);
				itoa( pSConvert->ulDatum, chBuffer, HEXADEZIMAL );
				/* 
				ucStringLength = 0, Anzeige mit allen verfuegbaren Stellen                    

⌨️ 快捷键说明

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