Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

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

  1. #1

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

    Здравствуйте!

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

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

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

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

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

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

  2. #2
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

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

  3. #3

    По умолчанию

    Sulfur,

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

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

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

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

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

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


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

  4. #4
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

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

  5. #5

    По умолчанию

    Спасибо, за подробный ответ.

    Если я Вас правильно понял, то переменная 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

  6. #6
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

    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 можно тоже вывести на выход, и им делать пуск-стоп частотника. Это мне кажется надежнее, чем командным словом.

  7. #7
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

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

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

    324324234.png
    Последний раз редактировалось Sulfur; 24.06.2020 в 22:21.

  8. #8

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    Это обычный бит, к нему привязывается выполнение алгоритма. Бит в 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;. Как привязать к этой переменной выполнение алгоритма? Через какую то команду?
    Последний раз редактировалось Junoka; 25.06.2020 в 07:49.

  9. #9

    По умолчанию

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

  10. #10
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

    Что то у меня возникли трудности с применением Enable.
    Я выкладывал экспортные файлы ФБ, импортируйте их в свой проект и посмотрите как там сделана привязка к выполнению алгоритма.
    Как привязать к этой переменной выполнение алгоритма? Через какую то команду?
    Код:
    (*Первая строка тела ФБ*)
    IF Enable THEN *выполняем алгоритм ФБ* 
                 ELSE *душим Run в FALSE*
    END_IF;
    Мои ФБ выдают команду Run (bool) для работы ПЧ. Нужен еще один ФБ, который транслирует эту команду в командное слово.
    Создаете один ФБ, в нем создаете пременную, "режим", и уже с помощью IF или CASE рулите внутри ФБ.
    Режим работы собственно ПЧ не меняется, меняется логика управления.
    Последний раз редактировалось Sulfur; 25.06.2020 в 09:46.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Зависание функциональных кнопок у СПК207
    от Shiryaev Oleg в разделе СПК2хх
    Ответов: 6
    Последнее сообщение: 06.02.2018, 08:07
  2. Макс. число функциональных блоков
    от diman_ob_304 в разделе Программируемые реле
    Ответов: 3
    Последнее сообщение: 18.10.2017, 00:31
  3. Ответов: 1
    Последнее сообщение: 27.04.2017, 21:07
  4. Зона выбора
    от Vitamin в разделе Master SCADA 3
    Ответов: 5
    Последнее сообщение: 16.04.2015, 10:33
  5. Ответов: 13
    Последнее сообщение: 10.07.2009, 18:21

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •