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