Показано с 1 по 10 из 10

Тема: функциональный блок для управления перекидным клапаном

  1. #1
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию функциональный блок для управления перекидным клапаном

    добрый вечер всем написал функциональный блок для управления перекидным клапаном это двух позиционный механизм приводимый в движение электромотором 380В, конечные положения определяющийся индуктивными датчиками сенсоровскими ВБИ. Имеется два режима работы ручной и автомат. В ручном режиме оператор нажимает экранные кнопки в скаде входы A:BOOL; (*Кнопка положение A*) B:BOOL; (*Кнопка положение B*) после чего запускаться таймер настроенный на время перехода механизма от одного в другое конечное положение иначе авария. Выходы OUT_A:BOOL; (*Выход положение A*) OUT_B:BOOL; (*Выход положение B*) управляют реверсивным магнитным пускателем электродвигателя. В автоматическом режиме сигнал AVTO:BOOL; (*Автоматический режим работы FALSE-ручное TRUE-автомат*) механизм управляться сигналами C:BOOL; (*РЕЖИМ АВТОМАТ положение A*) D:BOOL; (*РЕЖИМ АВТОМАТ положение B*) это сигналы от технологического процесса различные механизмы с которыми связан этот клапан.

    В общем есть две проблемы первая не могу добиться нормальной работы с тех пор как добавил автоматический режим вроде и правильно все но хз. Вторая как оптимизировать код может что то улучшить а то у меня ощущение что я написал индусский код.
    ************************************************** *******
    FUNCTION_BLOCK PK(*Функциональный блок для управления перекидным клапаном*)
    (*двух позиционный механизм*)
    VAR_INPUT(*Входные переменные датчики кнопки и тп*)
    AVTO:BOOL; (*Автоматический режим работы FALSE-ручное TRUE-автомат*)
    A:BOOL; (*Кнопка положение A*)
    B:BOOL; (*Кнопка положение B*)
    C:BOOL; (*РЕЖИМ АВТОМАТ положение A*)
    D:BOOL; (*РЕЖИМ АВТОМАТ положение B*)
    SENSOR_A:BOOL; (*Датчик положение A*)
    SENSOR_B:BOOL; (*Датчик положение B*)
    ALARM_RES: BOOL; (*Сигнал сброса аварии*)
    END_VAR
    VAR_OUTPUT(*выходные переменные пускатели аварии и тп*)
    OUT_A:BOOL; (*Выход положение A*)
    OUT_B:BOOL; (*Выход положение B*)
    ALARM_OUT:BOOL; (*Выход авария перекидного клапана*)
    END_VAR
    VAR(*Внутрении переменные для собственных нужд ФБ таймеры и прочее*)
    tim1:TON;
    tim2:TON;
    END_VAR

    ************************************************** ****
    IF AVTO THEN
    (*-------------------------------------------------------------------------*)
    IF C=TRUE AND D=FALSE THEN
    OUT_A:=TRUE;
    END_IF

    IF C=FALSE AND D=TRUE THEN
    OUT_B:=TRUE;
    END_IF
    (*-------------------------------------------------------------------------*)
    ELSE
    (*-------------------------------------------------------------------------*)
    IF A=TRUE AND B=FALSE THEN
    OUT_A:=TRUE;
    END_IF

    IF A=FALSE AND B=TRUE THEN
    OUT_B:=TRUE;
    END_IF

    (*-------------------------------------------------------------------------*)
    END_IF

    IF OUT_A=TRUE THEN
    tim1(IN:=OUT_A, PT:=T#5s);
    ALARM_OUT:=tim1.Q;
    END_IF

    IF SENSOR_A=TRUE THEN
    OUT_A:=FALSE;
    END_IF
    (*-------------------------------------------------------------------------*)
    IF OUT_B=TRUE THEN
    tim2(IN:=OUT_B, PT:=T#5s);
    ALARM_OUT:=tim2.Q;
    END_IF

    IF SENSOR_B=TRUE THEN
    OUT_B:=FALSE;
    END_IF

    IF OUT_A=TRUE THEN
    tim1(IN:=OUT_A, PT:=T#5s);
    ALARM_OUT:=tim1.Q;
    END_IF

    IF SENSOR_A=TRUE THEN
    OUT_A:=FALSE;
    END_IF
    (*-------------------------------------------------------------------------*)
    IF OUT_B=TRUE THEN
    tim2(IN:=OUT_B, PT:=T#5s);
    ALARM_OUT:=tim2.Q;
    END_IF

    IF SENSOR_B=TRUE THEN
    OUT_B:=FALSE;
    END_IF


    (*-------------------------------------------------------------------------*)
    IF OUT_A=TRUE AND OUT_B=TRUE THEN
    ALARM_OUT:=TRUE ;
    END_IF
    (*-------------------------------------------------------------------------*)
    IF ALARM_OUT=TRUE THEN
    OUT_A:=FALSE;
    OUT_B:=FALSE;
    END_IF
    (*-------------------------------------------------------------------------*)
    IF ALARM_RES=TRUE THEN
    ALARM_OUT:=FALSE;
    tim1(IN:=FALSE, PT:=T#5s);
    tim2(IN:=FALSE, PT:=T#5s);
    OUT_A:=FALSE;
    OUT_B:=FALSE;
    END_IF
    Последний раз редактировалось alexval2006; 28.11.2010 в 00:48.

  2. #2
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию

    прилагаю файл проекта с визуализацией в коде сисе для наглядности
    Вложения Вложения
    • Тип файла: zip 55.ZIP (337.2 Кб, Просмотров: 46)

  3. #3
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию

    я так и думал что индуский код написал ваш первый вариант вроде понятен, с остальными надо разобратса. большое спасибо.
    Последний раз редактировалось alexval2006; 28.11.2010 в 09:50.

  4. #4
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию

    можете обяснить работу Sel а то у петрова и. в нету в книге. я знаю что это оператор выбора но хз как он работает

  5. #5

    По умолчанию

    Sel описан в хелпе.

  6. #6
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию

    Я тут набросал еще один функциональный блок для управления вертикальным транспортёром Норией хотелось бы чтобы прокомментировали правильно ли я все сделал может что можно сделать лучше хотя вроде все работает но хочется все сделать хорошо
    во вложении проект с визуализацией для тестирования таджеты если нужно в предыдущем вложение

    FUNCTION_BLOCK EL(*Функциональный блок для управления Норией*)
    VAR(*Внутрении переменные для собственых нужд ФБ таймеры и прочее*)
    step : ( stop, start, alarm_reset, alarm_reidi, alarm_sped, alarm_podpor, alarm_tok);(*Обявляем Функцию step*)
    timer1:TON; (*Обявляем ФБ таймер аварии по контролю включения*)
    timer2:TON; (*Обявляем ФБ таймер аварии по контролю скорости*)
    timer3:TON; (*Обявляем ФБ таймер аварии по подпору продуктом*)
    END_VAR

    VAR_INPUT(*Входные переменные датчики кнопки и тп*)
    auto:BOOL; (*Автоматический режим работы*)
    man_start, man_stop:BOOL; (*Экранные кнопки СТАРТ и СТОП*)
    auto_start, auto_stop:BOOL; (*Сигналы в режиме автомат СТАРТ и СТОП*)
    sens_reidi:BOOL; (*Контроль включения механизма*)
    sens_sped:BOOL; (*Контроль скорости механизма*)
    sens_podpor:BOOL; (*Контроль подпора механизма прдуктом*)
    sens_tok:BOOL; (*Контроль токовой нагрузки электродвигателя*)
    reset: BOOL; (*Сигнал сброса аварии*)
    END_VAR

    VAR_OUTPUT(*выходные переменые пускатели аварии и тп*)
    out:BOOL; (*Выходы на пускатель*)
    out_alarm: WORD; (*Выход аварии нории*)
    END_VAR

    ******************************************

    CASE step OF

    stop:
    step:=SEL(SEL(auto, man_start, auto_start), step, start); (*Обработка кнопок ручного и автоматического режима СТАРТ*)
    timer1(in:=FALSE); (*Обнуляем таймер 1*)
    timer2(in:=FALSE); (*Обнуляем таймер 2*)
    timer3(in:=FALSE); (*Обнуляем таймер 3*)

    start:
    step:=SEL(SEL(auto, man_stop, auto_stop), step, stop); (*Обработка кнопок ручного и автоматического режима СТОП*)
    IF out =TRUE THEN
    timer1(in:=TRUE, pt:=T#1s);
    timer2(in:=TRUE, pt:=T#3s);
    timer3(in:=sens_podpor, pt:=T#3s);

    step:=SEL(timer1.Q, SEL(sens_reidi, step, start), alarm_reidi);
    step:=SEL(timer3.Q, step, alarm_podpor);

    step:=SEL(timer2.Q, step, alarm_sped);

    step:=SEL(sens_tok, step, alarm_tok);
    ELSE
    timer1(in:=FALSE);
    timer2(in:=FALSE);
    timer3(in:=FALSE);
    END_IF
    IF sens_reidi =TRUE THEN
    timer1(in:=FALSE);
    END_IF
    IF sens_sped =TRUE THEN
    timer2(in:=FALSE);
    END_IF

    alarm_reset:
    timer1(in:=FALSE); (*Обнуляем таймер 1*)
    timer2(in:=FALSE); (*Обнуляем таймер 2*)
    timer3(in:=FALSE); (*Обнуляем таймер 3*)
    out_alarm:=0; (*Обнуляем АВАРИИ*)
    step:=stop; (*Стоп механизма*)

    alarm_reidi:
    out_alarm:=1; (*Присваиваем переменной out_alarm аварию №1*)
    step:=SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии*)
    out:=step=stop; (*Стоп механизма*)

    alarm_sped:
    out_alarm:=2; (*Присваиваем переменной out_alarm аварию №2*)
    step:=SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии*)
    out:=step=stop; (*Стоп механизма*)

    alarm_podpor:
    out_alarm:=3; (*Присваиваем переменной out_alarm аварию №3*)
    step:=SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии*)
    out:=step=stop; (*Стоп механизма*)

    alarm_tok:
    out_alarm:=4; (*Присваиваем переменной out_alarm аварию №4*)
    step:=SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии*)
    out:=step=stop; (*Стоп механизма*)
    END_CASE
    out:=step=start; (*Старт механизма*)
    Вложения Вложения
    • Тип файла: zip 22.ZIP (37.2 Кб, Просмотров: 26)
    Последний раз редактировалось alexval2006; 03.12.2010 в 01:12.

  7. #7
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию

    Помогите разобраться значит в чём суть проблемы при включении механизма его не удается отключить кнопками стоп
    в результате экспериментов удалось выяснить что при комментировании строки
    step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, start), alarm_reidi);
    механизм отключить удается но я остаюсь тогда без контроля включения механизма не могу понять что не так в этой строке помогите пожалуста



    FUNCTION_BLOCK EL (* Управление Норией *)

    VAR_INPUT
    auto : BOOL; (* Автоматический режим работы *)
    man_start,
    man_stop : BOOL; (* Экранные кнопки СТАРТ и СТОП *)
    auto_start,
    auto_stop : BOOL; (* Сигналы в режиме автомат СТАРТ и СТОП *)
    sens_reidi : BOOL; (* Включение (обратная связь ?) *)
    sens_sped : BOOL; (* Контроль скорости *)
    sens_podpor : BOOL; (* Подпор продуктом*)
    sens_tok : BOOL; (* Контроль токовой нагрузки электродвигателя *)
    reset : BOOL; (* Сигнал сброса аварии*)
    END_VAR
    VAR_OUTPUT
    out : BOOL; (* Выходы на пускатель*)
    out_alarm : WORD; (* Выход аварии нории *)
    END_VAR
    VAR
    step : (stop, start, alarm_reset, (* Состояние управляющего процесса*)
    alarm_reidi, alarm_sped,
    alarm_podpor, alarm_tok);

    timer_reidi : TON; (* Контроль включения *)
    timer_sped : TON; (* Контроль скорости*)
    timer_podpor : TON; (* Контроль по подпору продуктом*)
    END_VAR
    ************************************************** *******
    CASE step OF
    stop:
    (*Обработка кнопок ручного и автоматического режима СТАРТ*)
    step := SEL(SEL(auto, man_start, auto_start), step, start);
    timer_reidi(in:=FALSE); (* Сброс аварийных таймеров *)
    timer_sped(in:=FALSE);
    timer_podpor(in:=FALSE);

    start:
    (*Обработка кнопок ручного и автоматического режима СТОП*)
    step :=SEL(SEL(auto, man_stop, auto_stop), step, stop);
    timer_reidi(in:= NOT sens_reidi, pt:=T#1s);
    timer_sped(in:=NOT sens_sped, pt:=T#3s);
    timer_podpor(in:=sens_podpor, pt:=T#3s);

    step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, start), alarm_reidi);(*проблемная строка при коментировании ее удаётса выключить механизм иначе невыключаетса*)
    step := SEL(timer_podpor.Q, step, alarm_podpor);
    step := SEL(timer_sped.Q, step, alarm_sped);
    step := SEL(sens_tok, step, alarm_tok);


    alarm_reset:
    out_alarm := 0; (* Обнуляем АВАРИИ *)
    step := stop; (* Стоп механизма *)

    alarm_reidi:
    out_alarm := 1; (* Присваиваем переменной out_alarm аварию №1 *)
    step := SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии *)

    alarm_sped:
    out_alarm := 2; (* Присваиваем переменной out_alarm аварию №2 *)
    step := SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии *)

    alarm_podpor:
    out_alarm := 3; (* Присваиваем переменной out_alarm аварию №3 *)
    step := SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии *)

    alarm_tok:
    out_alarm := 4; (* Присваиваем переменной out_alarm аварию №4 *)
    step := SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии *)

    END_CASE
    out := step=start; (* Старт механизма*)



    http://alexval2007.ucoz.ru/dowanloads/1.zip

  8. #8
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию

    да я хотел его использовать но некомпилитса ошибки
    вот этот код если нетрудно поправите ошибку я не найду что то.
    проект по ссылке
    http://alexval2007.ucoz.ru/dowanloads/2.zip

  9. #9
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию

    большое спасибо заработало. Кстати преведущую проблему победил методом научного тыка step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, start, ), alarm_reidi); заменил на step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, step, ), alarm_reidi); как ни странно всё заработало но последний вариант кода куда как приятней

  10. #10
    Пользователь
    Регистрация
    23.01.2008
    Адрес
    Белгородская область, Валуйки
    Сообщений
    274

    По умолчанию

    Спасибо понял надобыло просто упростить эту конструкцию просто я уже подзабыл к чему и что там недают заниматса одним и темже каждый день чтото новое мы ведь эксплуатационщики.

Ваши права

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