📄 convert.cpp
字号:
// 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 + -