Страница 10 из 20 ПерваяПервая ... 89101112 ... ПоследняяПоследняя
Показано с 91 по 100 из 194

Тема: СП310+пр200

  1. #91

    По умолчанию

    Цитата Сообщение от Viktor D Посмотреть сообщение
    Спасибо за подсказки.
    Собственно говоря я уже это читал, просто некотрые моменты не понятны (учился давно по другой специальности (ТМС) и тогда комп был редкость. Проги писали на Фортране на листочке и сдавали преподу, а он окидывал взглядом и выносил вердикт - будет работать или нет).

    Цель моих действий сделать ФБ который будет осуществлять следующий алгоритм: вращение вперёд-пауза-вращение назад и всё это повторять в течении определённого времени.
    Делаю это для общего развития. На стандартных ФБ из овенлоджика уже сделано, теперь хочу освоить хотя бы в общих чертах ST. Привязаться хочу к функции DT потому как делала в ОЛ на BLINK и CTN и столкнулся с тем, что на длительных выдержках время уходит от встроенных часов из за конечной скорости работы программы. Приходилось вводить коррекцию.
    Предлагаю взять этот пример за основу и доработать под Ваши желания:
    Owen.jpg

    Код:
    function_block FPRP
    
        var_input
           OnOff : bool;    // Управление блоком
        end_var
    
        var_output
           FW, RW : bool;   // Сигналы вперед и назад
        end_var
    
        var
           State : udint;   // Текущее состояние
           t : udint;       // Метка времени события в мс
        end_var
    
        if OnOff then
            case State of
                0:  // Пауза 1 сек перед пуском вперед
                    if time_to_udint(get_time()) - t >= 1000 then
                        State := 1; FW := true; RW := false; t := time_to_udint(get_time());    // Пуск вперед
                    end_if
                1:  // Вращение вперед 2 сек перед паузой
                    if time_to_udint(get_time()) - t >= 2000 then
                        State := 2; FW := false; RW := false; t := time_to_udint(get_time());   // Пауза
                    end_if
                2:  // Пауза 1 сек перед пуском назад
                    if time_to_udint(get_time()) - t >= 1000 then
                        State := 3; FW := false; RW := true; t := time_to_udint(get_time());    // Пуск назад
                    end_if
                3:  // Вращение назад 2 сек перед паузой
                    if time_to_udint(get_time()) - t >= 2000 then
                        State := 0; FW := false; RW := false; t := time_to_udint(get_time());   // Пауза
                    end_if
            end_case
        else
            FW := false; RW := false; State := 0; t := 0;
        end_if
    end_function_block

  2. #92
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,053

    По умолчанию

    почему не просто
    t : time;
    ?

    вангую что в else тоже
    t := time_to_udint(get_time());
    Последний раз редактировалось Валенок; 16.10.2024 в 08:41.

  3. #93

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    почему не просто
    t : time;
    ?

    вангую что в else тоже
    t := time_to_udint(get_time());
    Хорошо. Как скажите:
    Код:
    function_block FPRP
    
        var_input
           OnOff : bool;    // Управление блоком
        end_var
    
        var_output
           FW, RW : bool;   // Сигналы вперед и назад
        end_var
    
        var
           State : udint;   // Текущее состояние
           t : time;        // Метка времени события
        end_var
    
        if OnOff then
            case State of
                0:  // Пауза 1 сек перед пуском вперед
                    if get_time() - t >= T#1s then
                        State := 1; FW := true; t := get_time();    // Пуск вперед
                    end_if
                1:  // Вращение вперед 2 сек перед паузой
                    if get_time() - t >= T#2s then
                        State := 2; FW := false; t := get_time();   // Пауза
                    end_if
                2:  // Пауза 1 сек перед пуском назад
                    if get_time() - t >= T#1s then
                        State := 3; RW := true; t := get_time();    // Пуск назад
                    end_if
                3:  // Вращение назад 2 сек перед паузой
                    if get_time() - t >= T#2s then
                        State := 0; RW := false; t := get_time();   // Пауза
                    end_if
            end_case
        else
            FW := false; RW := false; State := 0; t := T#0s;
        end_if
    end_function_block
    Последний раз редактировалось EFrol; 16.10.2024 в 09:11.

  4. #94
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,053

    По умолчанию

    Цитата Сообщение от EFrol Посмотреть сообщение
    Хорошо. Как скажите:
    где ж хорошо ? time - это просто дело вкуса не принципиальное, а в else - кранты потенциальные

  5. #95

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    где ж хорошо ? time - это просто дело вкуса не принципиальное, а в else - кранты потенциальные
    Сейчас весь мир на пороге "крантов потенциальных"!

  6. #96

    По умолчанию

    Ну в принципе я так делаю.

    Код:
    Time_1 := GET_DATE_TIME();
        curr_t := DT_TO_UDINT (Time_1);
        
        
        
        if strt then
            trgt_t := curr_t + ust;
         end_if
         
         if trgt_t <= curr_t  then
            out_dsb := true;
            out_enb := false;
            else
            out_dsb := false;
            out_enb := true;
         end_if
    Это просто выдержка времени привязанная к секундам.

    Насчёт точности - сравнивал время насчитанное моим макросом в пр с временем панели сп310. Там было расхождение. Опять же сейчас я не решаю какую то конкретную задачу, а учусь писать код на ST. Ну естественно надо что то конкретное делать - вот и практикуюсь.
    Последний раз редактировалось Viktor D; 16.10.2024 в 09:36.

  7. #97

    По умолчанию

    За пример спасибо - буду разбираться.

  8. #98
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,053

    По умолчанию

    Цитата Сообщение от EFrol Посмотреть сообщение
    Сейчас весь мир на пороге "крантов потенциальных"!
    Дык шаг 0 после стопа будет 1 цикл или 1.5 месяца же - как звезды сложатся

  9. #99

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Дык шаг 0 после стопа будет 1 цикл или 1.5 месяца же - как звезды сложатся
    Вы хотите сказать, что get_time() - T#0s будет < T#1s в течении 1.5 месяцев?
    Я думал, Вас беспокоит, что при быстром сбросе OnOff при State := 3; произойдет смена вращения без паузы.
    А вообще, я бы с Вами согласился, если бы арифметика была бы со знаком!!!
    Давайте предупредим новичков, что get_time() каждые 1.5 месяца обнуляется.
    И да, при get_time() = Tmax, какое-то состояние будет выдержано не полностью.

    Предлагаю безопасный вариант с предварительной паузой:
    Код:
    function_block FPRP
    
        var_input
           OnOff : bool;    // Управление блоком
        end_var
    
        var_output
           FW, RW : bool;   // Сигналы вперед и назад
        end_var
    
        var
           State : udint;   // Текущее состояние
           t : SYS.TON;     // Таймер
        end_var
    
        if OnOff then
            case State of
                0:  // Пауза 1 сек перед пуском вперед
                    t(I:=true, T:=T#1s);
                    if t.Q then
                        State := 1; FW := true; t(I:=false);    // Пуск вперед
                    end_if
                1:  // Вращение вперед 2 сек перед паузой
                    t(I:=true, T:=T#2s);
                    if t.Q then
                        State := 2; FW := false; t(I:=false);   // Пауза
                    end_if
                2:  // Пауза 1 сек перед пуском назад
                    t(I:=true, T:=T#1s);
                    if t.Q then
                        State := 3; RW := true; t(I:=false);    // Пуск назад
                    end_if
                3:  // Вращение назад 2 сек перед паузой
                    t(I:=true, T:=T#2s);
                    if t.Q then
                        State := 0; RW := false; t(I:=false);   // Пауза
                    end_if
            end_case
        else
            FW := false; RW := false; State := 0; t(I:=false);
        end_if
    end_function_block
    Последний раз редактировалось EFrol; 16.10.2024 в 12:48.

  10. #100
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,053

    По умолчанию

    Цитата Сообщение от EFrol Посмотреть сообщение
    Вы хотите сказать, что get_time() - T#0s будет < T#1s в течении 1.5 месяцев?
    Я думал, Вас беспокоит, что при быстром сбросе OnOff при State := 3; произойдет смена вращения без паузы.
    Не. С 1.5мес я погорячился. Не в этом случае.

    Потенциальный крантец (в старом варианте) остается из-за практически всегда отсутствия задержки шага 0 после подъема OnOff.
    При шаблонном использовании такой конструкции в шаге 0 могут быть какие-то подготовительные действия которые пойдут лесом. Смысл в таймере шага 0?
    TON тут не причем, простое t := get_time(); (а не := 0) в else эту проблему решает.


    Ну и лично я (дело вкуса) предпочитаю выходы привязывать не в шаге, а к шагу
    Код:
    ..
    end_case
    FW := State = 1;
    RW := State = 3;
    Там где есть ENUM это максимально наглядно, да и здесь чуть очевидней.

    А когда шагов много, еще и
    Код:
    ..
    end_case
    if State <> State_ then //State_  - прошлое значение
      State_ := State;
      t := get_time();
    end_if
    Т.е. самовзвод таймера шагов после любого перехода. Но это норм когда само состояние OnOff = false тоже шаг, а не IF (внешний if для case не использую)
    Последний раз редактировалось Валенок; 16.10.2024 в 16:51.

Страница 10 из 20 ПерваяПервая ... 89101112 ... ПоследняяПоследняя

Похожие темы

  1. Не получается опросить пр200 панелью сп310
    от дск в разделе Панели оператора (HMI)
    Ответов: 20
    Последнее сообщение: 24.01.2023, 10:13
  2. Подключение СП310 к пр200
    от Jakan в разделе Панели оператора (HMI)
    Ответов: 3
    Последнее сообщение: 22.08.2019, 23:23
  3. ПР200+СП310 в качестве МПР51
    от mouc1k в разделе Среда программирования OWEN Logic
    Ответов: 3
    Последнее сообщение: 25.12.2018, 11:30
  4. СП310 Сервер по Модбас ТСР + СП310 Слейв по Модбас RTU
    от Global в разделе Панели оператора (HMI)
    Ответов: 7
    Последнее сообщение: 19.04.2018, 11:16
  5. пр200+сп310
    от zamnarzanom в разделе Программируемые реле
    Ответов: 5
    Последнее сообщение: 10.10.2016, 09:13

Ваши права

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