Не придумаешь столько библиотек
Попробуйте для начала оформить графически и выстроить автомат состояний, то есть оформить стрелками(переходами) и шариками(состояниями)
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;




Ответить с цитированием
