1. LockDevice(0); надо делать 1 раз, а не каждый цикл ПЛК.
2. А вот считывать ответ - как можно чаще, а не раз в 10 мс. А то посылаете раз в 30 мс, читаете по 1 символу раз в 10 мс. Что тут можно получить с порта?
3.
Процедура считывания должна происходить до исчерпания символов в буфере или до нахождения ликв. пачки
p:=GetByte(0);
while (p<>0) do

p:=GetByte(0);
Вот тут должна быть проверка на наличие символа
IF p<>0 then
c:=RBDATA_TO_STRING(p);
А вот тут должна находится машина состояний для поиска символа начала, складывания символов в буфер до прихода символа конца или
превышения размера буфера, а после проверка CRC и только потом считывание значения (на забываем проверить код команды, вдруг не та команда!)


all_str:=CONCAT(all_str,c);
END_IF
END_WHILE

Надеюсь поможет