Страница 67 из 70 ПерваяПервая ... 17576566676869 ... ПоследняяПоследняя
Показано с 661 по 670 из 700

Тема: Функциональные блоки на языке ST

  1. #661

    По умолчанию

    да, таймеры внутри условий
    Код:
    function_block PhaseLoadControl
        
        var_input
            Current : REAL;
            Hight_level : REAL;
            Low_level : REAL;
        end_var
        
        var_output 
           Auto1Cmd, Auto2Cmd : BOOL := TRUE; (* Команды управления автоматами *)
        end_var
        
        var 
         TimerOn1, TimerOn2, TimerOff1, TimerOff2 : sys.TON;
        T_On, T_Off : TIME := T#5S;
        end_var
    
    (* Отключение автоматов, если ток выше Hight_level *)
    IF Current > Hight_level THEN
        TimerOff1(I := Auto1Cmd, T := T_Off);
        IF TimerOff1.Q THEN Auto1Cmd := FALSE; END_IF;
    
        TimerOff2(I := (NOT Auto1Cmd) AND Auto2Cmd AND (Current > Hight_level), T := T_Off);
        IF TimerOff2.Q THEN Auto2Cmd := FALSE; END_IF;
    END_IF;
    
    (* Включение автоматов, если ток ниже Low_level *)
    IF Current < Low_level THEN
        TimerOn1(I := NOT Auto1Cmd, T := T_On);
        IF TimerOn1.Q THEN Auto1Cmd := TRUE; END_IF;
    
        TimerOn2(I := Auto1Cmd AND NOT Auto2Cmd, T := T_On);
        IF TimerOn2.Q THEN Auto2Cmd := TRUE; END_IF;
    END_IF;
    
    (* Удержание состояния в диапазоне Low_level-Hight_level *)
    IF (Current >= Low_level) AND (Current <= Hight_level) THEN
        (* Ничего не делаем, автоматы остаются в текущем состоянии *)
    END_IF;
    
    
    end_function_block

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

    По умолчанию

    Если в 1-ом условии таймер TimerOff1 еще не сработал, и всё ушло в середину, то таймер как запомнил время старта (и состояние работы), так оно там и осталось. А при возврате в 1-е условие (если Auto1Cmd не упал), таймер смотрит прошедшее время с момента старта в прошлом (а может и позапрошлом (а может поза-поза ..(..))) входе в 1-ое условие.

    Вынос из IF типа
    Код:
    TimerOff1(I := (Current > Hight_level) and Auto1Cmd, T := T_Off);
    TimerOn1(I := (Current < Low_level) and NOT Auto1Cmd, T := T_On);
    Auto1Cmd := not TimerOff1.Q and (Auto1Cmd or TimerOn1.Q);
    Аналогично и с другими

  3. #663

    По умолчанию

    да, таймеры внутри условий
    Ага. Оно самое. Причина в этом. Рекомендую мою статью пробежать глазами.
    Почему-то, с тех пор как в ПРках появился ST, все темы про вызов таймеров стали снова актуальны...
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  4. #664

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Почему-то, с тех пор как в ПРках появился ST, все темы про вызов таймеров стали снова актуальны...
    С этим всё просто - дешевизна прибора обеспечила массовое применение, а с применением и спрос на программистов - что привело в сферу так называемых "самоучек" без образования (нахватчиков).
    Отсюда и запрос на автонастройку ПИД, и разные предложения на введение gcc в языки программирования, и требования пояснить как включить датчик, и неумение читать документацию...
    Я не издеваюсь, просто констатирую, что сейчас программируют случайные люди между выполнением монтажных и прочих физических работ, им реально некогда системно учиться, нужно быстрее сдать работу.

  5. #665

    По умолчанию

    Спасибо всем за ответы, действительно не знал об этой особенности.

  6. #666

    По умолчанию

    Побитовые операции типа & | в ST макросах owen logic я так понимаю не поддерживаются?

  7. #667

    По умолчанию

    Цитата Сообщение от Schneider Посмотреть сообщение
    Побитовые операции типа & | в ST макросах owen logic я так понимаю не поддерживаются?
    Ну можно маску приделать:
    bit:= word1 and word2 and mask
    Думаю будет работать... Или нет?

  8. #668

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Ну можно маску приделать:
    bit:= word1 and word2 and mask
    Думаю будет работать... Или нет?
    пишет AND только для булевых переменных

  9. #669
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от Schneider Посмотреть сообщение
    пишет AND только для булевых переменных
    можно реализовать самостоятельно
    Вложения Вложения

  10. #670

    По умолчанию

    Цитата Сообщение от Schneider Посмотреть сообщение
    пишет AND только для булевых переменных
    Здесь реализованы функции побитового AND и XOR, от Валенок остальные аналогично
    https://owen.ru/forum/showthread.php...l=1#post447957
    Вариантов на самом деле полно, каждый делает как ему нравится.
    Последний раз редактировалось kondor3000; 10.06.2025 в 10:07.

Страница 67 из 70 ПерваяПервая ... 17576566676869 ... ПоследняяПоследняя

Похожие темы

  1. ПЛК73 (Функциональные кнопки)
    от necro в разделе ПЛК63/73
    Ответов: 8
    Последнее сообщение: 18.05.2022, 10:03
  2. Функциональные блоки
    от ribamuka в разделе СПК2xx (архив)
    Ответов: 4
    Последнее сообщение: 08.04.2018, 15:01
  3. Функциональные блоки насосов в CoDeSys
    от Алексей Ермолаев в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 28.03.2017, 13:50
  4. Функциональные блоки- где искать?
    от Xops в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 01.03.2016, 11:07
  5. СПК функциональные клавиши
    от Lyohin в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 30.03.2015, 15:10

Ваши права

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