Цитата Сообщение от Евгений Кислов Посмотреть сообщение
Код:
ELSIF fb_Serial_Request.xError THEN
   bNeedReset:=TRUE; // флаг необходимости очистки буферов
   fb_Serial_Request(xExecute:=FALSE);
END_IF
В момент вызова fb_Serial_Request(xExecute:=FALSE); выходы "сбрасываются".
Поэтому глазами вы не видите xError и eError - к концу цикла, в котором они детектированы, они уже сброшены.

Вы можете добавить внутрь ELSIF счетчик ошибок для наглядности.
Или запускать таймер от NOT(fb_Serial_Request.xDone) - в стиле "успешных транзакций не было уже 5 секунд, пора бы зажечь аварийную лампу".
Цитата Сообщение от Александр Пинэко-Скворцов Посмотреть сообщение
Как Вы проверяете, что на выходе eError нет ошибки?
Добавьте по флагу xError запись выхода fb_Serial_Request.eError в промежуточную переменную. Что записывается?


Скрытый текст:
VAR
eReqError : OCL.ERROR;
END_VAR

...
ELSIF fb_Serial_Request THEN
eReqError := fb_Serial_Request.eError;
bNeedReset:=TRUE;
fb_Serial_Request(xExecute:=FALSE);
END_IF
Спасибо за консультацию, именно это и происходило. Добавил запись события fb_Serial_Request.xError = TRUE в промежуточную переменную bCommunicationError, а также счётчик таких событий. При отключении провода от платы эта переменная уходит в TRUE, счетчик растёт. При подключении провода обратно - всё восстанавливается. Привязал переменную-индикатор связи дополнительно к этой промежуточной переменной.
Заодно выяснил, что при таймауте в 100 мс и интервале задачи 20 мс ошибки появляются и при подключенной линии (хотя буфер вычитывается), а при таймауте в 101мс ошибки пропадают. Похоже, связано с интервалом задачи, при его уменьшении до 15 мс при таймауте 90 мс все работает стабильно.