Просмотр полной версии : Управление задвижкой/ клапаном
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
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 нужно будет использовать?!
Благодарю Вас за отклик. А куда же Вы дели обычный цикл по открывались/закрыванию без времени?! И второй вопрос, если разрешите, 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 прежде.
Я имею ввиду, разве не нужен цикл
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
Благодарю! Си++ пойдет?!
Благодарю! Си++ пойдет?!
Не советую. Си++ на 10% состоит из Си, и на 90% - из бесполезной для CoDeSys информации. ST - это почти Паскаль, а Паскаль - это полный близнец Си, но с удобочитаемыми текстами программ.
IT-Johny
05.10.2016, 12:45
Я понял. Поговорил сегодня с одним инженером. Вот он советовал учить visual basic + Pascal.
Я понял. Поговорил сегодня с одним инженером. Вот он советовал учить visual basic + Pascal.
А не логичнее было бы, всё-таки, изучать ST?
IT-Johny
05.10.2016, 16:02
литературы по ST как таковой нет ведь. Вообще по МЭК языкам мало литературы. Петрова 2 книги, Деменков, Парр и еще книга автора с Бауманки.
литературы по ST как таковой нет ведь. Вообще по МЭК языкам мало литературы. Петрова 2 книги, Деменков, Парр и еще книга автора с Бауманки.
С CoDeSys идут pdf - файлы. Они содержат примерно 96% необходимой информации. Остальные авторы - популяризаторы этих файлов. Недостающего в этих файлах нет нигде, оно добывается потом и бессонными ночами.
литературы по 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, остался вопрос касательно фрагмента программы! Будь добр, обьясни пожалуйста!
почему 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))..............
Это я понял, меня смутило именно (not timerON.Q))..............
Пока таймер выключен, timerON.Q = false, а not timerON.Q = true. Это не программирование, это булева алгебра.
IT-Johny
06.10.2016, 19:07
Большое спасибо!
Начал писать код для задвижки 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);
Начал писать код для задвижки https://ibb.co/1Rbmscw выглядит для оператора. Сам код находится ниже. Код запускается без проблем, но он не работает. Почему я не знаю. Помогите пожалуйста.
...
А где сигналы управления с кнопок?
Совет - делайте на SFC, будет проще и нагляднее
Или используйте SWITCH для организации конечного автомата состояний в ST
У вас в первом же условии проверка, после которой может ничего не выполняться.
IF bValveOpenIN AND bValveCloseIN THEN
bPermit := TRUE;
END_IF
Сигналы bValveOpenIN и bValveCloseIN присутствуют? Иначе просто переключится на ручной режим и всё.
Вам на другом форуме дали несколько советов.
В первую очередь формализуйте для себя словами, как должна работать задвижка. Т.е. составить ТЗ.
Представьте, что ваш алгоритм это чёрный ящик. Посмотрите, какие сигналы есть на входе, что есть на выходе. Опишите, что должно быть на выходе, если на входе то и это.
Составьте таблицу истинности в конце концов. Потом пишите код и проверяйте по таблице, всё ли у вас совпадает и все ли возможные комбинации проверены.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot