Вход

Просмотр полной версии : Управление задвижкой/ клапаном



IT-Johny
04.10.2016, 19:39
Ребят, думаю, как реализовать процесс управления задвижкой/клапаном на открытие/закрытие соответственно, именно на языке ST. Так как только начинаю изучать этот язык. Промежуточного положения быть не должно, и к примеру, по истечению 10 секунд, он должен автоматически выключаться/закрываться (не важно). Что-то написал, наставьте на верный путь, уважаемые! Буду очень благодарен, ибо запутался!
PROGRAM PLC_PRG
VAR
Zadvizh_ON: BOOL
timer: TOF (*задержка выключения*)
END_VAR

IF Zadvizh_ON then
Zadvizh_ON:= True;
OUT:= True;
ELSE
Zadvizh_ON:= False;
OUT:= False;
END_IF;
timer(IN := Zadvizh_ON, PT := T#10s);
OUT:=timer.Q

rwg
04.10.2016, 23:43
PROGRAM PLC_PRG

VAR_IN
Zadvizh_ON : bool;
end_var

VAR_OUT
OUT_ON : bool;
OUT_OFF: bool;
END_VAR



VAR
timerON: TON (*таймер открытия*)
timerOFF: TON (*таймер закрытия*)
END_VAR



timerON(IN := Zadvizh_ON, PT := T#10s);
timerOFF(IN := (not Zadvizh_ON), PT := T#10s);
OUT_ON := (Zadvizh_ON and (not timerON.Q)); (*10 секунд открытия*)
OUT_OFF := ((not Zadvizh_ON) and (not timerOFF.Q)); (*10 секунд закрытия*)

IT-Johny
05.10.2016, 08:35
Благодарю Вас за отклик. А куда же Вы дели обычный цикл по открывались/закрыванию без времени?! И второй вопрос, если разрешите, TON это таймер по включению, насколько я знаю, разве не TOf нужно будет использовать?!

rwg
05.10.2016, 08:54
Благодарю Вас за отклик. А куда же Вы дели обычный цикл по открывались/закрыванию без времени?! И второй вопрос, если разрешите, TON это таймер по включению, насколько я знаю, разве не TOf нужно будет использовать?!

Вариант с TOF:

PROGRAM PLC_PRG

VAR_IN
Zadvizh_ON : bool;
end_var

VAR_OUT
OUT_ON : bool;
OUT_OFF: bool;
END_VAR

VAR
timerON: TOF (*таймер открытия*)
timerOFF: TOF (*таймер закрытия*)
END_VAR

timerON(IN := Zadvizh_ON, PT := T#10s);
timerOFF(IN := (not Zadvizh_ON), PT := T#10s);
OUT_ON := (Zadvizh_ON and timerOFF.Q); (*10 секунд открытия*)
OUT_OFF := ((not Zadvizh_ON) and timerON.Q); (*10 секунд закрытия*)


Что Вы называете "обычный цикл по открывались/закрыванию без времени" я даже не догадываюсь. Пришла команда открыть - открылись. Кончилась команда открыть - закрылись.

IT-Johny
05.10.2016, 10:25
Я имею ввиду, разве не нужен цикл

IF Zadvizh_ON then
Zadvizh_ON:= True;
OUT:= True;
ELSE
Zadvizh_ON:= False;
OUT:= False;
END_IF;
Простите, если не до конца понимаю, изучал лишь python прежде.

rwg
05.10.2016, 10:42
Я имею ввиду, разве не нужен цикл

IF Zadvizh_ON then
Zadvizh_ON:= True;
OUT:= True;
ELSE
Zadvizh_ON:= False;
OUT:= False;
END_IF;
Простите, если не до конца понимаю, изучал лишь python прежде.

Вашу программу можно переписать в одну строчку: OUT := Zadvizh_ON; , не вижу никакого цикла. Попробуйте изучить Паскаль или си.

IT-Johny
05.10.2016, 12:10
Благодарю! Си++ пойдет?!

rwg
05.10.2016, 12:25
Благодарю! Си++ пойдет?!
Не советую. Си++ на 10% состоит из Си, и на 90% - из бесполезной для CoDeSys информации. ST - это почти Паскаль, а Паскаль - это полный близнец Си, но с удобочитаемыми текстами программ.

IT-Johny
05.10.2016, 12:45
Я понял. Поговорил сегодня с одним инженером. Вот он советовал учить visual basic + Pascal.

kolyan
05.10.2016, 15:20
Я понял. Поговорил сегодня с одним инженером. Вот он советовал учить visual basic + Pascal.

А не логичнее было бы, всё-таки, изучать ST?

IT-Johny
05.10.2016, 16:02
литературы по ST как таковой нет ведь. Вообще по МЭК языкам мало литературы. Петрова 2 книги, Деменков, Парр и еще книга автора с Бауманки.

rwg
05.10.2016, 16:52
литературы по ST как таковой нет ведь. Вообще по МЭК языкам мало литературы. Петрова 2 книги, Деменков, Парр и еще книга автора с Бауманки.

С CoDeSys идут pdf - файлы. Они содержат примерно 96% необходимой информации. Остальные авторы - популяризаторы этих файлов. Недостающего в этих файлах нет нигде, оно добывается потом и бессонными ночами.

kolyan
05.10.2016, 20:08
литературы по ST как таковой нет ведь. Вообще по МЭК языкам мало литературы. Петрова 2 книги, Деменков, Парр и еще книга автора с Бауманки.


Петров И.В. Программируемые контроллеры. Практическое применение языков стандарта МЭК 61131-3.
Вполне достаточно, наряду с заводскими PDF файлами.

IT-Johny
05.10.2016, 21:35
Спасибо уважаемые друзья за советы, помощь! rwg, остался вопрос касательно фрагмента программы! Будь добр, обьясни пожалуйста!
почему not timerON.Q и not timerOFF.Q?
OUT_ON := (Zadvizh_ON and (not timerON.Q)); (*10 секунд открытия*)
OUT_OFF := ((not Zadvizh_ON) and (not timerOFF.Q)); (*10 секунд закрытия*)

rwg
05.10.2016, 22:31
Спасибо уважаемые друзья за советы, помощь! rwg, остался вопрос касательно фрагмента программы! Будь добр, обьясни пожалуйста!
почему not timerON.Q и not timerOFF.Q?
OUT_ON := (Zadvizh_ON and (not timerON.Q)); (*10 секунд открытия*)
OUT_OFF := ((not Zadvizh_ON) and (not timerOFF.Q)); (*10 секунд закрытия*)

При поступлении команды Открыть/закрыть сразу включится соответствующий выход Открыть или закрыть и запустится соответствующий таймер. Через 10 секунд таймер включится и отключит выход.

IT-Johny
05.10.2016, 22:48
Это я понял, меня смутило именно (not timerON.Q))..............

rwg
05.10.2016, 23:07
Это я понял, меня смутило именно (not timerON.Q))..............

Пока таймер выключен, timerON.Q = false, а not timerON.Q = true. Это не программирование, это булева алгебра.

IT-Johny
06.10.2016, 19:07
Большое спасибо!

Nafis
27.09.2023, 11:05
Начал писать код для задвижки https://ibb.co/1Rbmscw выглядит для оператора. Сам код находится ниже. Код запускается без проблем, но он не работает. Почему я не знаю. Помогите пожалуйста.


FUNCTION_BLOCK GateValve


VAR_INPUT
//--------------------------------------------------------------------
bPermit :BOOL; (*Разрешение*)
bInterlock :BOOL; (*Блокировка*)
bProtect :BOOL; (*Защита*)
//--------------------------------------------------------------------
bManualControl :BOOL; (*Местное управление*)
bRemoteControl :BOOL; (*Дистанционное управление*)
//--------------------------------------------------------------------
bValveOpenIN :BOOL; (*Задвижка открывается*)
bValveCloseIN :BOOL; (*Задвижка закрывается*)
bValveFailureIN :BOOL; (*Задвижка авария*)
bValveOpenedIN :BOOL; (*Задвижка открыта*)
bValveClosedIN :BOOL; (*Задвижка закрыта*)
//--------------------------------------------------------------------
bMonitor :BOOL; (*Активация мониторинга запуска/останова*)
tMonTimeOpen :TIME; (*Время мониторинга запуска*)
tMonTimeClose :TIME; (*Время мониторинга останова*)
bFbkOpen :BOOL; (*Cтатус запуска*)
bFbkClose :BOOL; (*Cтатус останова*)
END_VAR

VAR_OUTPUT
//--------------------------------------------------------------------
bError :BOOL; (*Неисправность общая*)
bErrorFbkOpen :BOOL; (*Неисправность запуска*)
bErrorFbkClose :BOOL; (*Неисправность останова*)
//--------------------------------------------------------------------
bValveOpenOUT :BOOL; (*Открыть задвижку*)
bValveCloseOUT :BOOL; (*Закрыть задвижку*)
bValveStopOUT :BOOL; (*Остановка*)
//--------------------------------------------------------------------
TON_MonRun_ET :TIME; (*Отсчет таймера мон-га запуска*)
TON_MonStop_ET :TIME; (*Отсчет таймера мон-га останова*)
END_VAR

VAR
//--------------------------------------------------------------------
TON_MonitorRun :TON; (*Таймер мониторинга запуска*)
TON_MonitorStop :TON; (*Таймер мониторинга останова*)
END_VAR




//---------------------------------------- Проверка безопасного состояния ------------------------------------

IF bValveOpenIN AND bValveCloseIN THEN
bPermit := TRUE;
END_IF

//----------------------------------------- Открытие задвижки (В дистанционном режиме) ---------------------------

IF bPermit AND NOT bInterlock AND NOT bProtect AND NOT bValveOpenedIN AND NOT bValveFailureIN AND bRemoteControl THEN
bValveOpenOUT := TRUE;
bValveCloseOUT := FALSE;
ELSE
bRemoteControl := FALSE;
bManualControl := TRUE;
END_IF

//------------------------------------------ Закрытие задвижки (В дистанционном режиме) --------------------------

IF bPermit AND NOT bInterlock AND NOT bProtect AND NOT bValveClosedIN AND NOT bValveFailureIN AND bRemoteControl THEN
bValveOpenOUT := FALSE;
bValveCloseOUT := TRUE;
ELSE
bRemoteControl := FALSE;
bManualControl := TRUE;
END_IF


//------------------------------------------ Таймер открытия задвижки ----------------------------------------

TON_MonitorRun ( IN := bValveOpenIN AND bMonitor AND NOT bFbkOpen,
PT := tMonTimeOpen,
Q => bErrorFbkOpen,
ET => TON_MonRun_ET);

//------------------------------------------ Таймер закрытия задвижки ----------------------------------------

TON_MonitorStop ( IN := bValveCloseIN AND bMonitor AND NOT bFbkClose,
PT := tMonTimeClose,
Q => bErrorFbkClose,
ET => TON_MonStop_ET);

1exan
27.09.2023, 12:33
Начал писать код для задвижки https://ibb.co/1Rbmscw выглядит для оператора. Сам код находится ниже. Код запускается без проблем, но он не работает. Почему я не знаю. Помогите пожалуйста.
...

А где сигналы управления с кнопок?

Совет - делайте на SFC, будет проще и нагляднее
Или используйте SWITCH для организации конечного автомата состояний в ST

Khedron
27.09.2023, 12:36
У вас в первом же условии проверка, после которой может ничего не выполняться.

IF bValveOpenIN AND bValveCloseIN THEN
bPermit := TRUE;
END_IF
Сигналы bValveOpenIN и bValveCloseIN присутствуют? Иначе просто переключится на ручной режим и всё.

Вам на другом форуме дали несколько советов.
В первую очередь формализуйте для себя словами, как должна работать задвижка. Т.е. составить ТЗ.
Представьте, что ваш алгоритм это чёрный ящик. Посмотрите, какие сигналы есть на входе, что есть на выходе. Опишите, что должно быть на выходе, если на входе то и это.
Составьте таблицу истинности в конце концов. Потом пишите код и проверяйте по таблице, всё ли у вас совпадает и все ли возможные комбинации проверены.