1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

IEC_Timer не работает.

ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
Ответить

Автор темы
Spinxaler
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 23 мар 2019, 15:38
Имя: Владимир
Страна: Россия

IEC_Timer не работает.

Сообщение Spinxaler »

подскажите новичку.
Есть вот такая часть кода

Код: Выделить всё

CASE #"Режим налива" OF 
7:  // 
        #"Открыть 2 стадия" := TRUE;
        #"Открыть 1 стадия" := FALSE;
        #"Запуск таймера второго концевика" := TRUE;
        "IEC_Timer_0_DB_20".TON(IN := #"Запуск таймера второго концевика",
                                PT := #"Контрольное время для 2 концевика",
                                Q => #"Отработка концевика полного открытия");
        #"Режим налива" := 8;
    8:  //
        IF #"Отработка концевика полного открытия" THEN
            IF #т_концевик_2 AND NOT #т_концевик_3 AND NOT #т_концевик_1 THEN
                #"Запуск таймера второго концевика" := FALSE;
                #"Режим налива" := 9;
            ELSE
                #"Открыть 2 стадия" := FALSE;
                #"Запуск таймера второго концевика" := FALSE;
                #"Режим налива" := 20;
            END_IF;
        END_IF;
При попадании в cASE 7 все отрабатывается, на таймер in приходит TRUE на PT время. но таймер стоит и не считает. в Forse Table нету даже отсчёта времени ET.
Изображение
Пробовал вынести сам таймер из CASE и запускать его по #"Запуск таймера второго концевика" := TRUE; так он вообще даже IN не получает.
Переменная #"Запуск таймера второго концевика", TEMP типа BOOL.

при этом если поменять переменную #"Запуск таймера второго концевика" на тип INPUT и менять состояние то все работает.

Что за особенности такие? мне как программисту С++ вообще непонятно логики.

Serg_G
здесь недавно
здесь недавно
Сообщения: 59
Зарегистрирован: 04 авг 2018, 07:02
Имя: Сергей
Благодарил (а): 8 раз
Поблагодарили: 2 раза

IEC_Timer не работает.

Сообщение Serg_G »

В каком OB запускаете? Надо запускать в OB1(MAIN).

POV
корифей
корифей
Сообщения: 755
Зарегистрирован: 12 авг 2008, 11:05
Имя: Патрушев Олег Валерьевич
Страна: Россия
город/регион: г. Н.Новгород
Благодарил (а): 93 раза
Поблагодарили: 143 раза

IEC_Timer не работает.

Сообщение POV »

Serg_G писал(а): 23 мар 2019, 21:41 Переменная #"Запуск таймера второго концевика", TEMP типа BOOL.
при этом если поменять переменную #"Запуск таймера второго концевика" на тип INPUT и менять состояние то все работает.
Переменные типа TEMP это временные из стека, требуют обязательной инициализации перед использованием и уничтожаются после окончания работы этого блока/функции, так как стек возвращается на исходную позицию. Прочитайте описание этого типа в руководстве. И при описании проблемы пишите весь код, чтобы были понятны типы переменных и тип блока FB или FC. Также посмотрите разницу в типе OUT у FB и FC - пригодится, чтобы не наступать на грабли.

Автор темы
Spinxaler
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 23 мар 2019, 15:38
Имя: Владимир
Страна: Россия

IEC_Timer не работает.

Сообщение Spinxaler »

Запуская в OB1
Код обрабатывается в FB.
FB включён в OB1.
Подозревал что в переменой типа TEMP что то подобное присутствует. Сделал ради эксперимента ити переменные типа InOut и передаю их в глобальную DB сделанную только для этого. И начало работать большая часть таймеров, но пару таймеров всё равно не хотят работать, видно как на них приходит IN=TRUE, PT=10сек но ET стоит на месте и не считает, из за этого программа дальше не двигается.
всё перепроверил всё абсолютно одинаково что там где таймеры работают что там где не работают. ШАЙТАНАМА.

Код: Выделить всё

"К_Дребезг_концевик_Закрыто".TON(IN:=#Концевик_клапан_закрыт,PT:=#Время_задержки_концевиков);
"К_Дребезг_концевик_20_30".TON(IN:=#Концевик_клапан_20_30,PT:=#Время_задержки_концевиков);
"К_Дребезг_Концевик_100".TON(IN:=#Концевик_клапан_100,PT:=#Время_задержки_концевиков);
#Режим_налива_temp := #Режим_налива;
CASE #Режим_налива OF
    0:  //
        #Запуск_таймера_концевика_100 := FALSE;
        #"Запуск_таймера_ концевика_20_30" := FALSE;
        #Запуск_таймера_налива_первой_стадии := FALSE;
        #Запуск_таймера_третьей_стадии := FALSE;
        #Запуск_таймера_концевик_закрытия := FALSE;
        #Запуск_таймера_вакумсброса := FALSE;
        #Запуск_таймера_концевика_20_30_закрытие:= FALSE;
        IF #Датчик_температуры < #Температура_запрета_работы_клапана THEN
            #Режим_налива_temp := 1;
        ELSE
            #Режим_налива_temp := 2;
        END_IF;
    1:  // 
        #Нагрев_клапана := TRUE;
        IF #Датчик_температуры >= #Температура_разрешения_нагрева THEN
            #Нагрев_клапана := FALSE;
            #Режим_налива_temp := 2;
        END_IF;
    3:  // 
        IF "К_Дребезг_концевик_20_30".Q OR "К_Дребезг_Концевик_100".Q OR NOT "К_Дребезг_концевик_Закрыто".Q THEN
            #Режим_налива_temp := 20;
        END_IF;
    4:  //
        IF #Количество_стадий_открытия THEN
            // Если налив по стадиям
            #Открыть_20_30 := TRUE;
            #"Запуск_таймера_ концевика_20_30" := TRUE;
            #Запуск_таймера_налива_первой_стадии := TRUE;
            #Режим_налива_temp := 5;
        ELSE
            #Режим_налива_temp := 7;
        END_IF;
    5:  // 
        IF "K_Таймер_отработки_концевика_20_30".Q THEN
            IF "К_Дребезг_концевик_20_30".Q AND NOT "К_Дребезг_концевик_Закрыто".Q AND NOT "К_Дребезг_Концевик_100".Q THEN
                #"Запуск_таймера_ концевика_20_30" := FALSE;
                #Режим_налива_temp := 6;
            ELSE
                #Открыть_20_30 := FALSE;
                #"Запуск_таймера_ концевика_20_30" := FALSE;
                #Запуск_таймера_налива_первой_стадии := FALSE;
                #Режим_налива_temp := 20;
            END_IF;
        END_IF;
    6:  //
        IF "K_Таймер_первой_стадии_налива".Q THEN
            IF "К_Дребезг_концевик_20_30".Q AND NOT "К_Дребезг_концевик_Закрыто".Q AND NOT "К_Дребезг_Концевик_100".Q THEN
                #Запуск_таймера_налива_первой_стадии := FALSE;
                #Режим_налива_temp := 7;
            ELSE
                #Открыть_20_30 := FALSE;
                #"Запуск_таймера_ концевика_20_30" := FALSE;
                #Запуск_таймера_налива_первой_стадии := FALSE;
                #Режим_налива_temp := 7;
            END_IF;
            IF NOT "К_Дребезг_концевик_20_30".Q AND "К_Дребезг_концевик_Закрыто".Q AND "К_Дребезг_Концевик_100".Q THEN
                #Открыть_20_30 := FALSE;
                #Запуск_таймера_налива_первой_стадии := FALSE;
                #Режим_налива_temp := 20;
            END_IF;
        END_IF;
    7:  // 
        #Открыть_100 := TRUE;
        #Открыть_20_30 := FALSE;
        #Запуск_таймера_концевика_100 := TRUE;
        #Режим_налива_temp := 8;
    8:  //
        IF "K_Таймер_отработки_концевика_100".Q THEN
            IF NOT "К_Дребезг_концевик_20_30".Q AND NOT "К_Дребезг_концевик_Закрыто".Q AND "К_Дребезг_Концевик_100".Q THEN
                #Запуск_таймера_концевика_100 := FALSE;
                #Режим_налива_temp := 9;
            ELSE
                #Открыть_100 := FALSE;
                #Запуск_таймера_концевика_100 := FALSE;
                #Режим_налива_temp := 20;
            END_IF;
        END_IF;
    9:  // 
        IF "К_Дребезг_концевик_20_30".Q OR "К_Дребезг_концевик_Закрыто".Q OR NOT "К_Дребезг_Концевик_100".Q THEN
            #Открыть_100 := FALSE;
            #Режим_налива_temp := 20;
        END_IF;
    10:  //
        #"Запуск_таймера_ концевика_20_30" := FALSE;
        #Запуск_таймера_налива_первой_стадии := FALSE;
        IF #Количество_стадий_открытия THEN
            #Открыть_100 := FALSE;
            #Открыть_20_30 := TRUE;
            #Запуск_таймера_концевика_20_30_закрытие := TRUE;
            #Запуск_таймера_третьей_стадии := TRUE;
            #Режим_налива_temp := 11;
        ELSE
            #Режим_налива_temp := 13;
        END_IF;
    11:  // 
        IF "К_Таймер_отработки_концевика_20_30_закрытие".Q THEN
            IF "К_Дребезг_концевик_20_30".Q AND NOT "К_Дребезг_концевик_Закрыто".Q AND NOT "К_Дребезг_Концевик_100".Q THEN
                #Запуск_таймера_концевика_20_30_закрытие := FALSE;
                #Режим_налива_temp := 12;
            ELSE
                #Запуск_таймера_концевика_20_30_закрытие := FALSE;
                #Открыть_20_30 := FALSE;
                #Режим_налива_temp := 20;
            END_IF;
        END_IF;
    12:  //
        IF "K_Таймер_третьей_стадии_налива".Q THEN
            IF "К_Дребезг_концевик_20_30".Q AND NOT "К_Дребезг_концевик_Закрыто".Q AND NOT "К_Дребезг_Концевик_100".Q THEN
                #Запуск_таймера_третьей_стадии := False;
                #Режим_налива_temp := 13;
            ELSE
                #Запуск_таймера_третьей_стадии := False;
                #Открыть_20_30 := FALSE;
                #Режим_налива_temp := 20;
            END_IF;
        END_IF;
        IF NOT "К_Дребезг_концевик_20_30".Q OR "К_Дребезг_концевик_Закрыто".Q OR "К_Дребезг_Концевик_100".Q THEN
            #Открыть_20_30 := FALSE;
            #Запуск_таймера_третьей_стадии := False;
            #Режим_налива_temp := 20;
        END_IF;
    13:  // 
        #Запуск_таймера_концевик_закрытия := TRUE;
        #Открыть_20_30 := FALSE;
        #Открыть_100 := FALSE;
        #Режим_налива_temp := 14;
    14:  //
        IF "K_Таймер_отработки_концевика_закрытия".Q THEN
            IF "К_Дребезг_концевик_20_30".Q AND NOT "К_Дребезг_концевик_Закрыто".Q AND NOT "К_Дребезг_Концевик_100".Q  THEN
                #Запуск_таймера_концевик_закрытия := FALSE;
                #Режим_налива_temp := 15;
            ELSE
                #Запуск_таймера_концевик_закрытия := FALSE;
                #Режим_налива_temp := 20;
            END_IF;
        END_IF;
    15:  // 
        IF #Наличие_вакумсброса THEN
            #Вакум_сброс := TRUE;
            #Запуск_таймера_вакумсброса := TRUE;
            #Режим_налива_temp := 16;
        ELSE
            #Режим_налива_temp := 17;
        END_IF;
    16:  //
        IF "K_Таймер_вакумсброса".Q THEN
            #Вакум_сброс := FALSE;
            #Запуск_таймера_вакумсброса := FALSE;
            #Режим_налива_temp := 17;
        END_IF;
    17:  //
        IF NOT "К_Дребезг_концевик_Закрыто".Q OR "К_Дребезг_Концевик_100".Q OR "К_Дребезг_концевик_20_30".Q THEN
            #Режим_налива_temp := 20;
        END_IF;
    20:  //
        #Вакум_сброс := FALSE;
        #Открыть_20_30 := FALSE;
        #Открыть_100 := FALSE;
        IF "К_Дребезг_концевик_Закрыто".Q AND NOT "К_Дребезг_Концевик_100".Q AND NOT "К_Дребезг_концевик_20_30".Q THEN
            #Режим_налива_temp := 21;
        ELSE
            #Режим_налива_temp := 20;
        END_IF;
    21:  //
        IF "К_Дребезг_концевик_Закрыто".Q AND NOT "К_Дребезг_Концевик_100".Q AND NOT "К_Дребезг_концевик_20_30".Q THEN
            #Режим_налива_temp := 21;
        ELSE
            #Режим_налива_temp := 20;
        END_IF;
END_CASE;
"K_Таймер_отработки_концевика_100".TON(IN := #Запуск_таймера_концевика_100,PT := #Контрольное_время_концевика_100);
"K_Таймер_отработки_концевика_20_30".TON(IN := #"Запуск_таймера_ концевика_20_30",PT := #Контрольное_время_концевика_20_30);
"K_Таймер_первой_стадии_налива".TON(IN := #Запуск_таймера_налива_первой_стадии,PT := #Время_1_стадии - #Контрольное_время_концевика_20_30);
"K_Таймер_третьей_стадии_налива".TON(IN := #Запуск_таймера_третьей_стадии,PT := #Время_3_стадии);
"K_Таймер_отработки_концевика_закрытия".TON(IN := #Запуск_таймера_концевик_закрытия,PT := #Контрольное_время_концевика_закрытия);
"K_Таймер_вакумсброса".TON(IN := #Запуск_таймера_вакумсброса,PT := #"Время_вакум_ сброса");
"К_Таймер_отработки_концевика_20_30_закрытие".TON(IN:=#Запуск_таймера_концевика_20_30_закрытие,PT:=#Контрольное_время_концевика_20_30);
#Режим_налива := #Режим_налива_temp;
Работают
"K_Таймер_отработки_концевика_100"
"K_Таймер_отработки_концевика_20_30"
"K_Таймер_первой_стадии_налива"

Не работают
"К_Таймер_отработки_концевика_20_30_закрытие"
"K_Таймер_третьей_стадии_налива"

Изображение

POV
корифей
корифей
Сообщения: 755
Зарегистрирован: 12 авг 2008, 11:05
Имя: Патрушев Олег Валерьевич
Страна: Россия
город/регион: г. Н.Новгород
Благодарил (а): 93 раза
Поблагодарили: 143 раза

IEC_Timer не работает.

Сообщение POV »

Spinxaler писал(а): 24 мар 2019, 13:13 Подозревал что в переменой типа TEMP что то подобное присутствует
То есть я правильно понимаю, что теорию по программированию Simatic-ов вы не читали совсем? Вас ждет много сюрпризов. Сложно что-то посоветовать в вашем случае, так как понять что и как вы пишите и что нужно получить очень сложно. Может коллеги чего посоветуют.

Автор темы
Spinxaler
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 23 мар 2019, 15:38
Имя: Владимир
Страна: Россия

IEC_Timer не работает.

Сообщение Spinxaler »

Знаком плотно с программированием ARDUINO, там чтоб функция отказывалась считать когда ей приходит команда на запуск, это нонсенс.
По диагонали конечно же почитал. Буду читать более пристально. Но я думаю я не найду там ответа почему таймер не работает когда у неё на входе IN:=TRUE. Когда застрял на таймерах прочитал про них много в мануалах, не слово про такое поведение.
Вот по этому скриншоту видно что таймеры взведены но не считают.
Изображение
Я конечно же буду дальше читать изучать, это без спорно. Но в данном проекте всё уже сделано и как только заработают таймеры проект готов. А сроки горят. Это тестовый проект, для того чтоб показать что я хоть что то понимаю в ПЛК. Реально после ардуино я в лёгком шоке от этого сименса.
ПОМОГИТЕ, не бросайте.

Отправлено спустя 38 минут 36 секунд:
Разобрался. ура. спасибо :ges_clap2:
Оказалось как обычно сам дурак. Получалось что в каждом цикле другой функциональный блок отвечающий за безопасность, взводил режим выше чем положено и так по кругу. а за счёт инертности Forse table видно что только IN=TRUE. а по факту он взводится каждый цикл OB1(Main), вот и счёта нету. ET всегда один цикл OB1 :o

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3559
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

IEC_Timer не работает.

Сообщение Михайло »

Spinxaler писал(а): 24 мар 2019, 15:54 Но я думаю я не найду там ответа почему таймер не работает когда у неё на входе IN:=TRUE.
Мониторинг (режим "очки") не способен передавать значения тегов в реальном времени. Соответственно, если тег в пределах одного прогона программы несколько раз меняет свое значение - Вы все это не увидите, увидите только последнее значение. Отсюда делайте вывод - если произошло что-то из ряда вон выходящее, то значит Вы в этой ситуации и Вам нужно включить мозг, анализируя результаты мониторинга тегов.
Аватара пользователя

petr2off
эксперт
эксперт
Сообщения: 1602
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Страна: Россия
город/регион: Красноярск
Благодарил (а): 69 раз
Поблагодарили: 185 раз

IEC_Timer не работает.

Сообщение petr2off »

Тут есть еще одна тонкость. Есть некоторый барьер, который нужно в себе преодолеть - переход от логики императивных языков - к логике МЭКовских. Фактор цикличности процесса требует некоторого осознания. Именно наличие цикла PLC делает, например возможным импульсную логику, для примера - сработка по переднему фронту. В сущности - значение переменной стало 1 и более не меняется, но значение функции детектор переднего фронта изменилось в следующем цикле. Далее, один и тот же алгоритм можно реализовать через классические логические функции, а можно с использованием импульсных. Почитайте литературу по PLC, посмотрите примеры. Здесь нет ничего запредельного и супер сложного - просто нужно осознать существующую специфику.

Автор темы
Spinxaler
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 23 мар 2019, 15:38
Имя: Владимир
Страна: Россия

IEC_Timer не работает.

Сообщение Spinxaler »

Активно двигаюсь в направление перестройки мышления в разрезе цикличности процесса, мне как программисту JAVA и С++, приходится реально ломать мышление алгоритмизации. Я думаю есчё не раз буду на этом форуме с разными вопросами. Спасибо всем за помощь.
Ответить

Вернуться в «Simatic TIA Portal»