Не придумаешь столько библиотек
Попробуйте для начала оформить графически и выстроить автомат состояний, то есть оформить стрелками(переходами) и шариками(состояниями)
https://fast-project.ru/engineering/.../algoritm.html
1. Пишете перечень состояний в каком может находиться установка в каждый из моментов времени (шарики)
2. Продумываете перечень условий переходов из состояния в состояние (стрелки)
au05hxjke5l2hndsob89uj7c267hn45o.png
Ниже пример кода
Код:
CASE State OF
0:(*Закрыт*)
BLINK(ENABLE:=1 , TIMELOW:=TIMEINT.FALSETIME , TIMEHIGH:=TIMEINT.TRUETIME );
Q_Open :=FALSE;
Q_Close:=BLINK.OUT;
IF SP_Position>Position AND Delta>1 THEN State:=2; END_IF;
IF Position>99 THEN State:=4; END_IF;
STS := STS OR 2;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;
2:(*Открывается*)
BLINK1(ENABLE:=1 , TIMELOW:=TIMEINT.FALSETIME , TIMEHIGH:=TIMEINT.TRUETIME );
Q_Open :=BLINK1.OUT;
Q_Close:=FALSE;
IF Delta<1 THEN State:=3; END_IF;
IF Position>99 THEN State:=4; END_IF;
IF SP_Position<Position AND Delta>1 THEN State:=5; END_IF; (*Убавили уставку, закрываем*)
STS := STS OR 4;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;
3:(*Частично открытое состояние*)
Q_Open :=FALSE;
Q_Close:=FALSE;
IF SP_Position>Position AND Delta>1 THEN State:=2; END_IF;
IF SP_Position<Position AND Delta>1 THEN State:=5; END_IF;
IF Position>99 THEN State:=4; END_IF;
IF Position<1 THEN State:=0; END_IF;
STS := STS OR 4;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;
4:(*Открыт*)
BLINK(ENABLE:=1 , TIMELOW:=TIMEINT.FALSETIME , TIMEHIGH:=TIMEINT.TRUETIME );
Q_Open :=BLINK.OUT;
Q_Close:=FALSE;
IF SP_Position<Position AND Delta>1 THEN State:=5; END_IF;
IF Position<1 THEN State:=0; END_IF;
STS := STS OR 1;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;
5:(*Закрывается*)
BLINK1(ENABLE:=1 , TIMELOW:=TIMEINT.FALSETIME , TIMEHIGH:=TIMEINT.TRUETIME );
Q_Open :=FALSE;
Q_Close:=BLINK1.OUT;
IF Delta<1 THEN State:=6; END_IF;
IF Position<1 THEN State:=0; END_IF;
IF SP_Position>Position AND Delta>1 THEN State:=2; END_IF; (*Прибавили уставку, открываем*)
STS := STS OR 4;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;
6:(*Частично закрытое состояние*)
Q_Open :=FALSE;
Q_Close:=FALSE;
IF SP_Position>Position AND Delta>1 THEN State:=2; END_IF;
IF SP_Position<Position AND Delta>1 THEN State:=5; END_IF;
IF Position>99 THEN State:=4; END_IF;
IF Position<1 THEN State:=0; END_IF;
STS := STS OR 4;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;
7:(*Заблокирован на закрытое состояние*)
Q_Open :=FALSE;
Q_Close:=TRUE;
STS := STS OR 32;
IF INTLK_OFF THEN State:=0; END_IF;
8:(*Заблокирован на открытое состояние*)
Q_Open :=TRUE;
Q_Close:=FALSE;
STS := STS OR 16;
IF INTLK_ON THEN State:=0; END_IF;
END_CASE;