PDA

Просмотр полной версии : Выполнение определенных функциональных блоков в зависимости от выбора



Junoka
23.06.2020, 13:17
Здравствуйте!

Есть установка, которая должна работать в 3 режимах: постоянный, шаговый, прогон.

В программе ПЛК есть функциональный блок на включение ПЧВ.

В каждом режиме ПЧВ должен работать по собственному алгоритму:
1. Постоянный: ПЧВ запускается с кнопки ПУСК и работает до нажатия кнопки СТОП
2. Шаговый режим: ПЧВ запускается с кнопки ПУСК, делает паузу по оптическому датчику, после паузы продолжает движение, остановка по кнопке СТОП.
3. Прогон: ПЧВ запускается с кнопки ПУСК, оптический датчик посылает сигналы в счетчик, когда счетчик достигает 100, ПЧВ останавливается.

Как для каждого режима работы реализовать выполнение своего алгоритма работы с ПЧВ?

Сейчас я думаю над вариантом создания трех функциональных блоков с алгоритмами режимов для ПЧВ.

В зависимости от выбранного режима работы через оператор CASE в PLC_PRG буду делать вызов нужного мне функционального блока. Будет ли такое решение правильным?

Sulfur
24.06.2020, 12:38
Пишите три ПОУ (не ФБ) для каждого режима работы ПЧ. В ПЛЦ_ПРГ в зависимости от "переключателя" вызываете нужную ПОУ. Следует только продумать механизм контроля работы ПЧ при переключении с одного режима на другой. Т. е. при переключении режима следует завершить действующий режим, и начать новый заданный.
--
ЗЫ: Следует предусмотреть программный принудительный "стоп" для большой красной кнопки. Однако, это не исключает аппаратной реализации отключения по этой кнопке.

Junoka
24.06.2020, 13:48
Sulfur,

При создании POU в программе он предлагает задать имя и выбрать из трех видов: Программа, Функциональный блок, Функция.

В примере http://kipshop.ru/Primeri/Samples_plc1xx/Samples/11_POU.zip есть описание:


(************************************************* *************Какой блок лучше создавать***************************************** ************)
(*Если Вы просто выносите часть вычислений из основной программы - создавайте программу
Если Вам необходимо использовать многократно Вашу подпрограмму - создавайте Функциональный блок
Если нужно вынести вычисления (простой подсчет) - создавайте функцию*)

Из описания я понял, что Функция точно не подходит, а создавать лишние программы мне настоятельно не рекомендовали в ТехПоддержке ОВЕН.

Я наверно немного не уловил смысл многократного вызова, поэтому и выбрал функциональный блок.

На самом деле все 3 функциональных блока используют практически одинаковые блоки (все в основном из библиотеки ПЛК_ПЧВ_v2.lib). А разница лишь в управлении на входе ПУСК, СТОП, датчик положения, счетчик. Когда начал писать, понял, что все функциональные блоки режимов на выходе обращаются к одному Com_Word. Сейчас я предполагаю, что для каждого функционального блока режима стоило создать Com_word1, Com_word2, Com_word3 и в зависимости от выбранного режима делать присвоение к глобальному Com_word. Входные переменные неиспользуемых функциональных блоков режимов жестко блокирую.

P.S. Есть ли какие то средства в CodeSys для сброса функционального блока и исключения его из программы?



ЗЫ: Следует предусмотреть программный принудительный "стоп" для большой красной кнопки. Однако, это не исключает аппаратной реализации отключения по этой кнопке.

Да, я предусмотрел это. Помимо того, что сигнал с красной аварийной кнопки "Грибок" приходит в ПЛК, кнопка так же отключает контакторы всех исполнительных механизмов. ПЛК при этом продолжает работу.

Sulfur
24.06.2020, 17:40
создавать лишние программы мне настоятельно не рекомендовали в ТехПоддержке ОВЕН.
А я-то и не знал, лепил штук по десять-двадцать этих самых "лишних", и работало каким-то чудом. Было бы интересно послушать их аргументы по этому поводу.
---
ФБ имеет смысл делать, если требуется многократно вызывать один и тот же алгоритм.
Можете и ФБ использовать, но со следующими особенностями:
Внутри ФБ объявляется переменная Enable:BOOL; а так же необходимые входа\выхода и промежуточные (вспомогательные) локальные переменные
Далее
IF Enable THEN
==тело алгоритма ФБ без привязки к глобальным переменным==
ELSE
==все выходные и вспомогательные переменные сбрасываются в FALSE==
END_IF;
---
В ПЛЦ_ПРГ выхода ФБ объединяются через элемент OR, выход которого поддается на исполнительное устройство. Копки и датчики на входа экземпляров ФБ подаются так же параллельно.
Кроме сигнала Enable. На этот вход подается сигнал с "переключателя".
В результате в зависимости от положения "переключателя" будет активен только один ФБ.
При таком подходе в данном случае принципиальной разницы между ПОУ и ФБ практически нет, т. к. все равно придется писать три экземпляра ФБ.
Вот, накропал на скорую руку:
49821

Junoka
24.06.2020, 20:48
Спасибо, за подробный ответ.

Если я Вас правильно понял, то переменная Enable:BOOL; объявляется в VAR_INPUT ФБ и потом эта переменная разрешает записывать другие переменные INPUT/OUTPUT, все верно?

Функциональные блоки я уже сделал для каждого режима с локальными переменным INPUT/OUTPUT, только вот на языке CFC. Весь алгоритм выполнен на блоках.

В PLC_PRG выбор режима сделал через операторы IF. Далее для каждого ФБ (PCHV_cont_mode, PCHV_step_mode, PCHV_progon_mode) в зависимости от выбранного режима через оператор CASE присваиваю значения переменным INPUT/OUTPUT для каждого ФБ.

Вот кусок кода из PLC_PRG. Как мне можно интегрировать переменную ENABLE:BOOL;? Можно ли в разных ФБ локальные переменные делать с одинаковым названием? Например, Vybeg, pusk, revers я использую во всех трех ФБ.


IF Rezh_post_dv THEN
Rezhim:=1;
ELSE
IF Rezh_shag THEN
Rezhim:=2;
ELSE
IF Rezh_progon THEN
Rezhim:=3;
END_IF
END_IF
END_IF

CASE Rezhim OF

1: PCHV_cont_mode1 (Cont_mode_avar:=Avaria, (*Сигнал авария из блока аварий*)
vybeg:=Privod_stop, (* Привод конвейера: стоп *)
pusk:=Privod_vpered, (* Привод конвейера: вперед *)
revers:=Privod_nazad, (* Привод конвейера: назад *)
Com_word=>Com_slovo, (*Командное слово*)
Stat_word:=Slovo_sost, (*Слово состояния*)
);

PCHV_prog_mode1(Prog_mode_avar:=FALSE,
Prog_mode_polozh_izlozh:=FALSE,
Prog_mode_Podogrev_Stop=>Prog_mode_podogr_stop,
vybeg:=FALSE,
pusk:=FALSE,
Com_word=>,
Stat_word:=0,
);

PCHV_step_mode1(Step_mode_avar:=FALSE,
Step_mode_pol_izl:=FALSE,
vybeg:=FALSE,
pusk:=FALSE,
revers:=FALSE,
Com_word=>,
Stat_word:=0,
);

2: PCHV_step_mode1(Step_mode_avar:=avaria,
Step_mode_pol_izl:=Polozh_izlozh,
vybeg:=Privod_stop,
pusk:=Privod_vpered,
revers:=Privod_nazad,
Com_word=>Com_slovo,
Stat_word:=Slovo_sost,
);

PCHV_cont_mode1(Cont_mode_avar:=FALSE,
vybeg:=FALSE,
pusk:=FALSE,
revers:=FALSE,
Com_word=>,
Stat_word:=0,
);

PCHV_prog_mode1(Prog_mode_avar:=FALSE,
Prog_mode_polozh_izlozh:=FALSE,
Prog_mode_Podogrev_Stop=>Prog_mode_podogr_stop,
vybeg:=FALSE,
pusk:=FALSE,
Com_word=>,
Stat_word:=0,
);

3: PCHV_prog_mode1(Prog_mode_avar:=Avaria,
Prog_mode_polozh_izlozh:=Polozh_izlozh,
Prog_mode_Podogrev_Stop=>Prog_mode_podogrev_end,
vybeg:=Privod_stop,
pusk:=Privod_vpered,
Com_word=>Com_slovo,
Stat_word:=Slovo_sost,
);

PCHV_cont_mode1(Cont_mode_avar:=FALSE,
vybeg:=FALSE,
pusk:=FALSE,
revers:=FALSE,
Com_word=>,
Stat_word:=0,
);

PCHV_step_mode1(Step_mode_avar:=FALSE,
Step_mode_pol_izl:=FALSE,
vybeg:=FALSE,
pusk:=FALSE,
revers:=FALSE,
Com_word=>,
Stat_word:=0,
);
ELSE
Alarm_ne_vybran_rezhim:=TRUE;
END_CASE

Sulfur
24.06.2020, 21:52
Enable:BOOL; объявляется в VAR_INPUT ФБ и потом эта переменная разрешает записывать другие переменные INPUT/OUTPUT, все верно?

Это обычный бит, к нему привязывается выполнение алгоритма. Бит в 1 - работаем, бит в 0 - стоим. Все просто.
---
На ST в моем примере будет выглядеть примерно так:

FB_1(
Enable:=Rezh_post_dv ,
Start:=pusk ,
Stop:= ,
Alarm:=Avaria ,
Run_VFD=>Run_1 );
FB_2(
Enable:=Rezh_shag ,
Start:=pusk ,
Stop:= ,
Sensor:= ,
Alarm:=Avaria ,
Run_VFD=>Run_2 );
FB_3(
Enable:=Rezh_progon ,
Start:=pusk ,
Stop:= ,
Sensor:= ,
Quantity:=100 ,
Alarm:=Avaria ,
Run_VFD=>Run_3 ,
Counted=> );
Run:=Run_1 OR Run_2 OR Run_3;

Будет работать только тот ФБ, у которого на входе Enable стоит TRUE.
Старт, Стоп, Сенсор - можно сразу назначать (объявлять) в конфигурации ПЛК на конкретные входа. Run можно тоже вывести на выход, и им делать пуск-стоп частотника. Это мне кажется надежнее, чем командным словом.

Sulfur
24.06.2020, 22:16
Вот еще подсказка как можно сделать выбор:

SA_1 и SA_2 - это NO-контакты стандартного переключателя на три положения. В среднем положении оба контакта разомкнуты.

49828

Junoka
25.06.2020, 07:43
Это обычный бит, к нему привязывается выполнение алгоритма. Бит в 1 - работаем, бит в 0 - стоим. Все просто.
---
На ST в моем примере будет выглядеть примерно так:

FB_1(
Enable:=Rezh_post_dv ,
Start:=pusk ,
Stop:= ,
Alarm:=Avaria ,
Run_VFD=>Run_1 );
FB_2(
Enable:=Rezh_shag ,
Start:=pusk ,
Stop:= ,
Sensor:= ,
Alarm:=Avaria ,
Run_VFD=>Run_2 );
FB_3(
Enable:=Rezh_progon ,
Start:=pusk ,
Stop:= ,
Sensor:= ,
Quantity:=100 ,
Alarm:=Avaria ,
Run_VFD=>Run_3 ,
Counted=> );
Run:=Run_1 OR Run_2 OR Run_3;

Будет работать только тот ФБ, у которого на входе Enable стоит TRUE.
Старт, Стоп, Сенсор - можно сразу назначать (объявлять) в конфигурации ПЛК на конкретные входа. Run можно тоже вывести на выход, и им делать пуск-стоп частотника. Это мне кажется надежнее, чем командным словом.

Что то у меня возникли трудности с применением Enable. Судя по Вашим примерам, нужно в VAR_INPUT каждого ФБ добавить строчку Enable:BOOL;. Как привязать к этой переменной выполнение алгоритма? Через какую то команду?

Andrew_Stranger
25.06.2020, 08:00
Что-то замудрили. Зачем 3 ФБ городить? Если бы у Вас было три частотника, тогда да, на каждый частотник свой экземпляр ФБ. Создаете один ФБ, в нем создаете пременную, "режим", и уже с помощью IF или CASE рулите внутри ФБ.

Sulfur
25.06.2020, 09:40
Что то у меня возникли трудности с применением Enable.
Я выкладывал экспортные файлы ФБ, импортируйте их в свой проект и посмотрите как там сделана привязка к выполнению алгоритма.

Как привязать к этой переменной выполнение алгоритма? Через какую то команду?


(*Первая строка тела ФБ*)
IF Enable THEN *выполняем алгоритм ФБ*
ELSE *душим Run в FALSE*
END_IF;

Мои ФБ выдают команду Run (bool) для работы ПЧ. Нужен еще один ФБ, который транслирует эту команду в командное слово.

Создаете один ФБ, в нем создаете пременную, "режим", и уже с помощью IF или CASE рулите внутри ФБ.
Режим работы собственно ПЧ не меняется, меняется логика управления.

Andrew_Stranger
25.06.2020, 09:43
Режим работы собственно ПЧ не меняется, меняется логика управления. Это не одно и тоже по сути?

Sulfur
25.06.2020, 09:49
В моем понимании это две большие разницы. Режим ПЧ - скорость, момент, разгон, торможение и прочие радости. Логика управления - старт\стоп, вперед\назад.

Andrew_Stranger
25.06.2020, 10:01
Можно обозвать это "алгоритм" работы, как Вам угодно. Но зачем 3 ФБ придумывать, почти одинаковые по содержанию?

Sulfur
25.06.2020, 10:16
По желанию клиента.
Можно и в одном все накрутить, но там много "отключателей" делать надо, легко запутаться. А в виде отдельных ПОУ все это делается легко и элегантно.
Лично я в своих проектах ПЛЦ_ПРГ использую практически как конфигуратор логики работы всей установки, а конкретные алгоритмы для конкретных узлов пишу в отдельных ПОУ. Мне такой подход нравится тем, что можно структурировать проект, а не валить все в одну кучу. Особенно когда есть отключаемые части алгоритма работы.

Junoka
25.06.2020, 10:40
Sulfur,

Спасибо, по такому же пути пошел и я. Кроме привода, в программе есть еще несколько механизмов, у них не меняется логика управления, а просто устанавливается запрет на работу.
Сейчас попробую воспользоваться Вашим советом из сообщения #10 и напишу результат.

Andrew_Stranger
25.06.2020, 11:42
По желанию клиента.
Можно и в одном все накрутить, но там много "отключателей" делать надо, легко запутаться. А в виде отдельных ПОУ все это делается легко и элегантно.
Лично я в своих проектах ПЛЦ_ПРГ использую практически как конфигуратор логики работы всей установки, а конкретные алгоритмы для конкретных узлов пишу в отдельных ПОУ. Мне такой подход нравится тем, что можно структурировать проект, а не валить все в одну кучу. Особенно когда есть отключаемые части алгоритма работы. Не знаю, насколько это элегантно. Если бы на каждую абстрактную установку отдельный POU, то да. Возможно кому как удобнее, лишь бы не материли вас те, кто будет в вашем коде копаться.