Страница 478 из 480 ПерваяПервая ... 378428468476477478479480 ПоследняяПоследняя
Показано с 4,771 по 4,780 из 4800

Тема: разные вопросы новичка

  1. #4771

    По умолчанию

    Цитата Сообщение от Van0lik Посмотреть сообщение
    Добрый день!
    Имеется задача написать программу для ПР на установку мойки КЕГ по заданной циклограмме (во вложении)
    ]
    то есть вы даже не потрудилсь таблицу перевести в нормальный вид и предлагаете разбирать в мятой бумажке?
    Перерыл форум нашёл похожий проект https://owen.ru/forum/showthread.php...l=1#post106727 , но к сожалению файлы уже не доступны и связи с авторами нет.
    то есть вы для себя поставили задачу так - найти чьёто готовое, отрихтовать малось под себя и готово?
    и установка по мойке кег - это коммерция, это даже не ленивый студент, который может встретить понимание
    по нажатию кнопки "ПУСК" (I1) происходит запуск цикла из последовательных 40 шагов, у каждого шага своё время на которое должны открываются заданные клапана соответствующие выходам (Q1-Q8)
    и в чём проблема?
    вы не сделали ни единого куска кода?

  2. #4772

    По умолчанию

    Цитата Сообщение от Van0lik Посмотреть сообщение
    Добрый день!
    Имеется задача написать программу для ПР на установку мойки КЕГ по заданной циклограмме (во вложении)
    Сначала попробовал написать на основе логистических функций, но понял что будет очень громоздко.
    Перерыл форум нашёл похожий проект https://owen.ru/forum/showthread.php...l=1#post106727 , но к сожалению файлы уже не доступны и связи с авторами нет.
    Суть работы установки: по нажатию кнопки "ПУСК" (I1) происходит запуск цикла из последовательных 40 шагов, у каждого шага своё время на которое должны открываются заданные клапана соответствующие выходам (Q1-Q8)
    В теории понимаю, что нужно использовать макросы ПЗУ, так же нашёл на форуме https://owen.ru/forum/showthread.php...l=1#post322919, но не хватает тяма адаптировать их под свой проект.
    Буду очень признателен за помощь.
    На 40 шагов, лучше использовать язык ST, тут пример на 6 режимов по 0+12 шагов, или Шаговик - можно сделать и 40 шагов.
    И ещё помочь, это не значит сделать за вас, так что делайте сами и спрашивайте, что не понятно.

    Простой шаговый автомат, новый TON с паузой_____ https://owen.ru/forum/showthread.php...39&page=43#424
    Прогр. управление 6 нагрузками 6 реж. 12 шагов _ФБ_фунции_____https://owen.ru/forum/showthread.php...39&page=11#105
    Последний раз редактировалось kondor3000; 20.04.2026 в 09:54.

  3. #4773
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,069

    По умолчанию

    Цитата Сообщение от Van0lik Посмотреть сообщение
    Добрый день!
    Имеется задача...
    Вот пример на 5 шагов
    Вложения Вложения

  4. #4774

    По умолчанию

    Добрый день!
    Можете использовать подобные конструкции :
    FUNCTION_BLOCK STE_P
    VAR_INPUT
    U : BOOL; // Сигнал запуска / импульс
    Res : BOOL; // Сброс
    END_VAR

    VAR_OUTPUT
    Q : UDINT; // Текущее значение счётчика
    I1, I2, I3, I4: BOOL; // Выходы таймеров
    En_d : BOOL; // Флаг завершения (CounterValue = 5)
    END_VAR

    VAR
    CounterValue : UDINT := 0;

    // Фронты
    FTrig, FTriga, FTrigb, FTrigc, FTrigd : BOOL;

    // Таймеры
    TP1, TP2, TP3, TP4 : SYS.TP;
    FT1, FT2, FT3, FT4 : SYS.FTRIG;
    END_VAR

    // Сброс счётчика и состояний
    IF Res THEN
    CounterValue := 0;
    FTrig := FALSE;
    FTriga := FALSE;
    FTrigb := FALSE;
    FTrigc := FALSE;
    FTrigd := FALSE;
    En_d := FALSE;
    END_IF;

    // Шаг 1: Приход импульса U (фронт) — установка счётчика в 1
    IF U AND NOT FTrig THEN
    FTrig := TRUE;
    IF NOT Res THEN
    CounterValue := 1;
    END_IF;
    END_IF;

    // Сброс фронта U после отпускания
    IF NOT U THEN
    FTrig := FALSE;
    END_IF;

    // Таймер TP1: активен при U и счётчике = 1
    TP1(I := (CounterValue = 1), T := T#3s, Q => I1);

    // Фиксируем завершение TP1
    FT1(I := TP1.Q);
    IF FT1.Q THEN
    FTriga := TRUE; // Готов к шагу 2
    END_IF;

    // Шаг 2: после TP1.Q и если счётчик = 1 → увеличиваем до 2
    IF FTriga AND (CounterValue = 1) THEN
    CounterValue := 2;
    FTriga := FALSE; // Сброс флага, чтобы не повторить
    END_IF;

    // Таймер TP2: активен при счётчике = 2
    TP2(I := (CounterValue = 2), T := T#4s, Q => I2);

    // Фиксируем завершение TP2
    FT2(I := TP2.Q);
    IF FT2.Q THEN
    FTrigb := TRUE;
    END_IF;

    // Шаг 3: переход к 3
    IF FTrigb AND (CounterValue = 2) THEN
    CounterValue := 3;
    FTrigb := FALSE;
    END_IF;

    // Таймер TP3: при счётчике = 3
    TP3(I := (CounterValue = 3), T := T#5s, Q => I3);

    FT3(I := TP3.Q);
    IF FT3.Q THEN
    FTrigc := TRUE;
    END_IF;

    // Шаг 4: переход к 4
    IF FTrigc AND (CounterValue = 3) THEN
    CounterValue := 4;
    FTrigc := FALSE;
    END_IF;

    // Таймер TP4: при счётчике = 4
    TP4(I := (CounterValue = 4), T := T#6s, Q => I4);

    FT4(I := TP4.Q);
    IF FT4.Q THEN
    FTrigd := TRUE;
    END_IF;

    // Шаг 5: переход к 5
    IF FTrigd AND (CounterValue = 4) THEN
    CounterValue := 5;
    FTrigd := FALSE;
    END_IF;

    // Выход Q — текущее значение счётчика
    Q := CounterValue;

    // Сигнал завершения
    IF CounterValue = 5 THEN
    En_d := TRUE;
    ELSE
    En_d := FALSE;
    END_IF;

    END_FUNCTION_BLOCK
    А с выхода Q udint зная номер шага через CASE можно как угодно

  5. #4775
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,069

    По умолчанию

    Цитата Сообщение от Рогов Алексей Посмотреть сообщение
    Добрый день!
    Можете использовать подобные конструкции :
    Не очень
    1. Если у нас таймеры не работают одновременно, то можно использовать только 1 таймер
    2. Конструкция
    Код:
    // Шаг 1: Приход импульса U (фронт) — установка счётчика в 1
    IF U AND NOT FTrig THEN
        FTrig := TRUE;
        IF NOT Res THEN
            CounterValue := 1;
        END_IF;
    END_IF;
    
    // Сброс фронта U после отпускания
    IF NOT U THEN
        FTrig := FALSE;
    END_IF;
    это вы реализовали в целом детектор переднего фронта (RTRIG)
    да и эта часть масло маслено
    Код:
    // Фиксируем завершение TP1
    FT1(I := TP1.Q);
    IF FT1.Q THEN
    FTriga := TRUE; // Готов к шагу 2
    END_IF;
    
    // Шаг 2: после TP1.Q и если счётчик = 1 → увеличиваем до 2
    IF FTriga AND (CounterValue = 1) THEN
    CounterValue := 2;
    FTriga := FALSE; // Сброс флага, чтобы не повторить
    END_IF;
    3. После прихода сигнала сброс (RES), таймеры ТП продолжат отсчет и запустив алгоритм заново можно очень удивиться

  6. #4776
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,069

    По умолчанию

    В последнем Лоджике массивы завезли, так что можно так сделать
    Код:
    function_block Control
        
        var_input
            StepIn : udint; //текущий шаг (нужен для реализации энергонезависимости)
            Start : bool; //кнопка запуска (НО)
            Stop : bool; //кнопка останова (НЗ)
            arTm : array[1..40] of udint; //массив уставок таймера
            StepNum : udint := 40; //задание количества шагов
        end_var
        
        var_output 
            StepOut : udint; //текущий шаг
            Inwork : bool; //флаг работы
            Done : bool; //флаг окончания работы
        end_var
        
        var 
            TmConst : udint := 1000; //множитель для уставки таймера (1000 - сек, 60000 - мин)
            TmStep : SYS.TON; //таймер
            bTm : bool; //флаг окончания отсчета таймера
            bSt : SYS.RTRIG; //защита от залипания кнопки Start (можно и без неe)
        end_var
        
        //проверка корректности задания StepNum
        if StepNum > 40 then StepNum := 40; end_if
        //обработка нажатия кнопки Start    
        bSt(I := Start and (StepNum > 0));
        //остановка или запуск программы
        if not Stop or (StepNum = 0) then 
            StepIn := 0; 
            Done := false;
        elsif bSt.Q then
            StepIn := 1; 
            Done := false;
        end_if    
        //определение уставки таймера 
        if StepIn > 0 then TmStep.T := udint_to_time(arTm[StepIn] * TmConst); end_if   
        //управление таймером
        TmStep(I := not bTm and (StepIn > 0), Q => bTm);
        //управление шагами
        if bTm then
            StepIn := StepIn + 1;
            if StepIn > StepNum then
                StepIn := 0;
                Done := true;
             end_if
        end_if    
        Inwork := StepIn > 0;
        StepOut := StepIn;
        
    end_function_block

  7. #4777

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Не очень
    1. Если у нас таймеры не работают одновременно, то можно использовать только 1 таймер
    2. Конструкция
    Код:
    // Шаг 1: Приход импульса U (фронт) — установка счётчика в 1
    IF U AND NOT FTrig THEN
        FTrig := TRUE;
        IF NOT Res THEN
            CounterValue := 1;
        END_IF;
    END_IF;
    
    // Сброс фронта U после отпускания
    IF NOT U THEN
        FTrig := FALSE;
    END_IF;
    это вы реализовали в целом детектор переднего фронта (RTRIG)
    да и эта часть масло маслено
    Код:
    // Фиксируем завершение TP1
    FT1(I := TP1.Q);
    IF FT1.Q THEN
    FTriga := TRUE; // Готов к шагу 2
    END_IF;
    
    // Шаг 2: после TP1.Q и если счётчик = 1 → увеличиваем до 2
    IF FTriga AND (CounterValue = 1) THEN
    CounterValue := 2;
    FTriga := FALSE; // Сброс флага, чтобы не повторить
    END_IF;
    3. После прихода сигнала сброс (RES), таймеры ТП продолжат отсчет и запустив алгоритм заново можно очень удивиться
    Это пример, я выше писал, как одно из решений, по поводу обнуления таймеров, согласен, но не совсем, повторный запуск отдельная тема - как конструктор решит и какие защиты от этого поставит. По поводу защёлок - если не ошибаюсь, нечто похожее на линию задержки, нет?

  8. #4778

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    В последнем Лоджике массивы завезли, так что можно так сделать
    Только из not Stop, not надо убрать, иначе он при включённом стопе работает.

  9. #4779
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,069

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Только из not Stop, not надо убрать, иначе он при включённом стопе работает.
    В принципе, так и задумано было. Не удачно вход обозвал

  10. #4780

    По умолчанию

    А если запихнуть и уставки таймера и состояние выходов в массив?
    Код:
    function_block Washing
        
        var_input
            OnOff : bool;   // Запуск/остановка программы
        end_var
        
        var_output 
            K1, K2, K3, K4, K5, K6, K7, K8 : bool;  // Выхода
            t1, t2 : udint;                         // Прошедшие минуты и секунды с момента старта
        end_var
        
        var 
            tb, i : udint;      // Время старта и номер режима
            rb : SYS.RTRIG;     // Фиксатор старта
            
            Mode : udint;               // Текущий режим
            // Упаковка биты 15-8 - состояние выходов Kx, 7-2 - секунда, 1-0 - минута
            Modes : array [1..40] of udint :=
                [256, 34600, 316, 34600, 356, 1400, 396, 160, 39080, 40136,
                4316, 38913, 39977, 4157, 38993, 40037, 5241, 4237, 161, 34729,
                477, 34562, 1322, 318, 82, 57434, 58490, 16546, 57526, 58590,
                16407, 57387, 58451, 17511, 16507, 143, 33687, 34743, 1483, 479];
        end_var
        
        rb(I:=OnOff);                     // Фиксируем момента старта
        if rb.Q then 
            tb := time_to_udint(get_time()) / 1000;     // Старт программы
        end_if
    
        if OnOff then      // Программа в работе
            t2 := time_to_udint(get_time()) / 1000 - tb;// Прошло времени после старта
            t1 := t2 / 60; t2 := t2 - (t1 * 60);        // в минутах и секундах
            
            if t1 < 4 then
                for i := 1 to 40 do                         // Для каждой строчки
                    Mode := Modes[i];                           // Извлекаем данные
                    if shr(shl(Mode, 30), 30) = t1 then         // Сравним минуты
                        if shr(shl(Mode, 24), 26) = t2 then         // Сравним секунды
                            // Выставим выхода в случае совпадения
                            K1 := Mode.8; K2 := Mode.9; K3 := Mode.10; K4 := Mode.11;
                            K5 := Mode.12; K6 := Mode.13; K7 := Mode.14; K8 := Mode.15;
                            exit;
                        end_if
                    end_if
                end_for
            end_if
        else                // Программа остановлена
            K1 := false; K2 := false; K3 := false; K4 := false; K5 := false; K6 := false; K7 := false; K8 := false;
        end_if
        
    end_function_block
    Последний раз редактировалось EFrol; 22.04.2026 в 07:43.

Страница 478 из 480 ПерваяПервая ... 378428468476477478479480 ПоследняяПоследняя

Похожие темы

  1. ПЛК 110 - Вопросы новичка?
    от di-s в разделе ПЛК1хх
    Ответов: 21
    Последнее сообщение: 15.04.2025, 16:38
  2. Вопросы новичка!!!
    от sau в разделе ПЛК1хх
    Ответов: 42
    Последнее сообщение: 02.05.2022, 19:57
  3. Вопросы новичка по MasterScada
    от MrNobody в разделе Master SCADA 3
    Ответов: 4
    Последнее сообщение: 04.09.2014, 14:39
  4. Вопросы полного новичка
    от Korion в разделе ПЛК1хх
    Ответов: 11
    Последнее сообщение: 09.02.2010, 10:08
  5. Вопросы новичка по ПЛК
    от Ollegator в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 07.07.2009, 09:29

Ваши права

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