Добрый день, уважаемые форумчане!
У меня стоит следующая задача:
К ПЛК подключен датчик, который по каналу RS232 постоянно шлет данные с частотой 10Гц в виде 'FF FF 75 2A 4B 9C', обращаться к датчику не нужно, только открыть порт и читать. В пересылаемых данных всегда присутствует "FF FF" остальные значения меняются.
При помощи каких программных средств CoDeSys можно извлекать из этого пакета данных только "75 2А" и писать это значение в переменную. Далее мне нужно это преобразовать в десятичный формат, так как данные в шестнадцатеричном формате. Я написал программку, которая преобразует шестнадцатеричное число в десятичное, но как мне кажется программа очень медленно работает, может есть у кого другое решение, буду очень признателен за помощь!

Вот собственно программка:
PROGRAM PLC_PRG
VAR
HEX_INPUT:STRING; (*ВВОДИМОЕ ШЕСТНАДЦАТЕРИЧНОЕ ЧИСЛО*)
DEC_OUTPUT:REAL; (*ПОЛУЧЕННОЕ ДЕСЯТИЧНОЕ ЧИСЛО*)
DEC_VALUE:REAL;
EXPONENT:WORD; (*СТЕПЕНЬ*)
STAGE:WORD;
X:INT;
START:BOOL;
STOP: BOOL;
HEX_VALUE:STRING;
I:WORD;
TRIG_I:R_TRIG;
LETTER:ARRAY [1..6] OF STRING := 'A', 'B', 'C', 'D', 'E', 'F';
NUMBER: ARRAY [1..6] OF INT := 1, 2, 3, 4, 5, 6;
J:WORD;
END_VAR

(*ЭТА ЧАСТЬ НУЖНА ДЛЯ АВТОМАТИЧЕСКОГО ПЕРЕСЧЕТА В СЛУЧАЕ ВВЕДЕННОГО НОВОГО ЗНАЧЕНИЯ*)
IF HEX_VALUE <> HEX_INPUT THEN
DEC_VALUE := 0;
STOP := FALSE;
START := FALSE;
TRIG_I(CLK := FALSE);
END_IF

EXPONENT := LEN(HEX_INPUT);
IF EXPONENT > 0 THEN
START := TRUE;
TRIG_I(CLK := TRUE);
IF TRIG_I.Q THEN
I := EXPONENT - 1;
END_IF
END_IF
(*ДО ЭТОГО МОМЕНТА*)
(*ДАЛЕЕ САМО ПРЕОБРАЗОВАНИЕ*)
IF START AND NOT STOP THEN
IF I >= 0 THEN
J := 0;
WHILE J<6 DO
J := J + 1;
IF LETTER[ J ] = MID(HEX_INPUT,1,(EXPONENT - I)) THEN
X := NUMBER[J];
EXIT;
END_IF
END_WHILE

CASE X OF
0: DEC_VALUE := DEC_VALUE + STRING_TO_REAL(MID(HEX_INPUT,1,(EXPONENT - I)))*EXPT(16,I);
1: DEC_VALUE := DEC_VALUE + 10*EXPT(16,I);
2: DEC_VALUE := DEC_VALUE + 11*EXPT(16,I);
3: DEC_VALUE := DEC_VALUE + 12*EXPT(16,I);
4: DEC_VALUE := DEC_VALUE + 13*EXPT(16,I);
5: DEC_VALUE := DEC_VALUE + 14*EXPT(16,I);
6: DEC_VALUE := DEC_VALUE + 15*EXPT(16,I);
END_CASE
IF I > 0 THEN
I := I - 1;
ELSE
I := 0;
DEC_OUTPUT := DEC_VALUE;
STOP := TRUE;
END_IF
X := 0;
END_IF
END_IF
HEX_VALUE := HEX_INPUT;