Евгений. Я разорался....
Спасибо за помощь. Не ломайте голову.
Сейчас напишу что было не так...
Код, который ловит спад состояния флага xExecute работал неправильно. И не переводил по спаду функциональный блок в исходное состояние. А из-за этого флаг xDone оставался поднятым. Поэтому автомат работал некорректно.
В функциональном блоке functionBlock (исправленный правильный код):
Код:
// Логика xExecute
IF xExecute AND NOT xExecuteTrig THEN // Передний фронт xExecute
// Сброс в исходное состояние и запуск
xDone := FALSE;
statusFB := 010;
ELSIF NOT xExecute AND xExecuteTrig THEN // Задний фронт xExecute
// Сброс в исходное состояние и остановка
xDone := FALSE;
statusFB := 000;
END_IF
xExecuteTrig := xExecute;