Lancaster, так гораздо лучше. Только это не совсем автомат, т.к. в нём нет условий перехода. Кроме того, это довольно тяжёлый кусок кода в импульсном (событийном) исполнении. Я бы сделал как-то так:
Код:
CASE STATE OF SR:
Rtemp:=TRUE;
Ytemp:= FALSE;
Gtemp:= FALSE;
IF timer.ET > Rtime THEN
STATE:= SRY;
END_IF
SRY:
Rtemp:=TRUE;
Ytemp:= TRUE;
Gtemp:= FALSE;
IF timer.ET > Ytime THEN
STATE:= SG;
END_IF
То есть внешнее условие убираем, CASE работает постоянно. Таймер заводим глобально с условно бесконечным (достаточно большим) PT от состояния автомата (timer(IN := STATE <> _STATE), где _STATE — значение STATE с предыдущего скана), то есть таймер сбрасывается за пределами автомата при каждой смене состояния, и появляется возможность делать переходы по его ET. Побочный эффект визуально выделяющихся блоков IF нам только на руку.
Хотя ясно, что для этого SFC подходит лучше.
Спорный момент. У SFC проблемы с обратным ветвлением — когда из неопределённого (любого) состояния по одному условию надо перейти в какое-то одно. Это вообще проблема традиционного представления автоматов в виде графов конкретных изолированных состояний. Чтобы поставить в светофор пешеходную кнопку, в SFC вам придётся городить огород (что не обязательно плохо и даже немного хорошо, но всё-таки на любителя). А в том же ST вы это сделаете одним условием за пределами CASE.