-> Hier kostenlos registrieren
Das ist ein ziemlich 'geiler' Code für ne S7-300, um 12-stellige BCD Zahlen in einen DINT zu verwandeln.
Sowas kann nur einem (P)C-Programierer eingefallen sein.
Hat da jemand was SPS taugliches zur Hand?
Wozu man das braucht? Ganz einfach! Es gibt 'sehr intelligente' Geräte, die über den Bus Werte als unendliche Lange
BCD Zahlen schicken statt als DINT! Wem so etwas bescheuertes einfällt, weis ich leider auch nicht!
Mein Gefühl sagt mir (P)C-Programmierer
Sowas kann nur einem (P)C-Programierer eingefallen sein.
Hat da jemand was SPS taugliches zur Hand?
Wozu man das braucht? Ganz einfach! Es gibt 'sehr intelligente' Geräte, die über den Bus Werte als unendliche Lange
BCD Zahlen schicken statt als DINT! Wem so etwas bescheuertes einfällt, weis ich leider auch nicht!
Mein Gefühl sagt mir (P)C-Programmierer
Code:
VAR_INPUT
BcdChars : ARRAY[1..6] OF BYTE;
END_VAR
VAR_OUTPUT
diValue : DINT;
END_VAR
VAR
HexString: ARRAY[0..15] OF STRING;
BcdStr : STRING;
END_VAR
BEGIN
HexString[0] := '0';
HexString[1] := '1';
HexString[2] := '2';
HexString[3] := '3';
HexString[4] := '4';
HexString[5] := '5';
HexString[6] := '6';
HexString[7] := '7';
HexString[8] := '8';
HexString[9] := '9';
HexString[10] := 'A';
HexString[11] := 'B';
HexString[12] := 'C';
HexString[13] := 'D';
HexString[14] := 'E';
HexString[15] := 'F';
BcdStr := '';
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[6]) / 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[6]) MOD 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[5]) / 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[5]) MOD 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[4]) / 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[4]) MOD 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[3]) / 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[3]) MOD 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[2]) / 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[2]) MOD 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[1]) / 16]);
BcdStr := CONCAT(IN1 := BcdStr, IN2 := HexString[BYTE_TO_INT(BcdChars[1]) MOD 16]);
IF (LEN(BcdStr) > 1) AND (LEFT(IN := BcdStr, L := 1) = 'F') THEN
BcdStr := DELETE(IN := BcdStr, L := 1, P := 1);
WHILE (LEN(BcdStr) > 1) AND (LEFT(IN := BcdStr, L := 1) = '0') DO
BcdStr := DELETE(IN := BcdStr, L := 1, P := 1);
END_WHILE;
BcdStr := CONCAT(IN1 := '-', IN2 := BcdStr);
END_IF;
diValue:=STRING_TO_DINT(BcdStr);
END