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

Прерывания OB30

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

Автор темы
svr444
здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 05 апр 2023, 14:55
Имя: Сергей

Прерывания OB30

Сообщение svr444 »

Доброго вечера!
Пожалуйста подскажите, просветите.

В OB30 (настроен на 25мс) произвожу вызов функции. Внутри функции через таймер TON (уставка 500мс) вызывается FB.

Правильно ли я понимаю механику работы,
Выполняется OB1, каждые 25мс выполнение программы OB1 приостанавливается и запускается подпрограмма (функция) вызываемая в OB30. Когда подпрограмма (функция) выполнится, продолжится выполнение программы OB1. Через 25мс все повторится.

Не пойму, в функции есть таймер на 500мс, это же дольше чем прерывания. Как это работает?

Joshua
здесь недавно
здесь недавно
Сообщения: 76
Зарегистрирован: 21 мар 2023, 02:12
Имя: Владимир
Страна: РФ
город/регион: Псков
Благодарил (а): 2 раза
Поблагодарили: 9 раз

Прерывания OB30

Сообщение Joshua »

Таймер TON без разницы где запускать. А вот проверять его желательно в основном цикле. Фактически, если вы его (таймер) не вызываете каждый раз, то и проверки не будет, он выход Q никогда не поднимет. А если поставить таймер на 500мс, а вызвать его повторно через 1000мс (например в прерывании 1с), то и выход таймера обновится через 1с, а не через 500мс. Другими словами, когда вы вызываете таймер, вы просто спрашиваете "а прошло ли уже заданное время?", он ответит только прошло или нет, это не значит, что прошло ровно 500мс.
В Вашем случае, вы 20 раз вызвали TON в OB30, на 21 вызов TON поднимет выход Q.
В прерываниях нежелательно выполнять тяжелый код. Возможно для вашей задачи будет проще инкрементить в OB30 переменную нужное количество раз, а проверять её уже в основном цикле.

Автор темы
svr444
здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 05 апр 2023, 14:55
Имя: Сергей

Прерывания OB30

Сообщение svr444 »

Извините, возможно глупость пишу, но все же спрошу.

При возникновении прерывания (25мс), запускается функция вызываемая в OB30. Внутри функции начинает считать таймер. Как таймер досчитает, начнет выполнятся ФБ.

Вот с этого места нет четкого понимания работы!

Вы написали: «В Вашем случае, вы 20 раз вызвали TON в OB30, на 21 вызов TON поднимет выход Q.»

т.е. в первом прерывании таймер начнет считать.
Во-втором и последующих продолжит счет пока не досчитает до уставки?
Я думал, что в каждом новом прерывании таймер начинает заново счет…

Подскажите, вот возникло прерывание, вызвалась на обработку функция… а когда будет считаться,что можно выходить из прерывания и продолжить выполнять главную программу (об1).

Joshua
здесь недавно
здесь недавно
Сообщения: 76
Зарегистрирован: 21 мар 2023, 02:12
Имя: Владимир
Страна: РФ
город/регион: Псков
Благодарил (а): 2 раза
Поблагодарили: 9 раз

Прерывания OB30

Сообщение Joshua »

svr444 писал(а): 25 авг 2023, 22:39 т.е. в первом прерывании таймер начнет считать.
Во-втором и последующих продолжит счет пока не досчитает до уставки?
TON в общем-то, не считает время в прямом смысле. Просто при каждом вызове он проверяет, прошло ли указанное время или нет, при условии, что вы вызываете его с единицей на входе. А где вы его вызываете(проверяее) - неважно. На доп выходе еще можно прочитать сколько ему еще осталось, это разница между тем, сколько задано и сколько прошло, счётчиков нет.
svr444 писал(а): 25 авг 2023, 22:39 Я думал, что в каждом новом прерывании таймер начинает заново счет…
Таймер начнёт считать только после первого вызова с единицей на входе. Пока держите едииницу и вызываете - он считает (сравнивает прошло/не прошло). Досчитал до конца при очередном вызове - перестаёт считать и держит выход в единице, пока на входе тоже единица. Для обнуления нужно вызвать TON ещё раз с 0 на входе и ещё раз с 1, чтобы он начал считать заново. Сбросили единицу раньше срока (обнулили) и проверили - перестаёт считать. Сбросили единицу, но не проверили (не вызвали таймер), а потом вернули единицу обратно и на этот раз проверили - будет считать дальше, как будто и не обнуляли.
Не важно, где и как запущен таймер. Важны только значения в момент вызова его в коде программы.
svr444 писал(а): 25 авг 2023, 22:39 Я думал, что в каждом новом прерывании таймер начинает заново счет…
В каждом прерывании вы его только проверяете. Прерывания предназначены для других целей и к таймерам отношения не имеют.
svr444 писал(а): 25 авг 2023, 22:39 Подскажите, вот возникло прерывание, вызвалась на обработку функция… а когда будет считаться,что можно выходить из прерывания и продолжить выполнять главную программу (об1).
Из прерывания выйдете в OB1 сразу же, как только закончится код в OBxx прерывания. Если у вас в прерывании крутится какой-то тяжелый код в цикле, то можете и ПЛК в стоп уронить по сторожевому таймеру WatchDog.

Автор темы
svr444
здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 05 апр 2023, 14:55
Имя: Сергей

Прерывания OB30

Сообщение svr444 »

Joshua писал(а): 25 авг 2023, 21:29 В каждом прерывании вы его только проверяете. Прерывания предназначены для других целей и к таймерам отношения не имеют.
Вот тут-то я и плаваю…
Как работает таймер TON я понимаю, но я не понимаю как он работает в прерывании…
Из OB1 (каждые 25мс) уходим на обработку прерывания, из OB30 вызвали функцию, внутри функции вызвали FB11, внутри FB11 начал считать таймер TON (у него на EN сформировалась true), уставка таймера 1000ms, досчитав 1с таймер поднимет выход и запустится FB12, выполнится код и только тогда функция, которую мы вызывали в прерывании будет считаться выполненой.
Но это же произойдет через 1с с небольшим, а у меня каждые 25мс прерывания….

Не понимаю, пожалуйста объясните мне

Алгоритм на бумаге прикрепил

Отправлено спустя 2 минуты 27 секунд:
а когда я вышел с обработки прерывания, это значит, что функция не активна?
Другими словами, я вызываю функцию только в момент прерывания?

Отправлено спустя 41 минуту 52 секунды:
Т.е. пока таймер не скажет, что прошла одна секунда FB12 не запустится. А пока не запустится и не выполнится FB12 я не выйду из ob30
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Joshua
здесь недавно
здесь недавно
Сообщения: 76
Зарегистрирован: 21 мар 2023, 02:12
Имя: Владимир
Страна: РФ
город/регион: Псков
Благодарил (а): 2 раза
Поблагодарили: 9 раз

Прерывания OB30

Сообщение Joshua »

svr444 писал(а): 26 авг 2023, 07:52 Как работает таймер TON я понимаю
Ещё не понимаете. И как работают прерывания в OBxx тоже видимо не понимаете. Это у Вас накладывается друг на друга и получается каша. Прерывания и таймеры это разные сущности и работают независимо.
Представьте, что таймер TON это будильник на смартфоне в беззвучном режиме. Вы его запустили и каждые 25 милисекунд (в прерывании) смотрите на экран, сработал он или нет, вы знаете, что он запущен, но не видите время. Между просмотрами вы можете заниматься другими делами (OB1), чтобы через 25 милисекунд (OB30) в очередной раз посмотреть на экран. На 21 раз вы увидите, что будильник сработал. Если вы не будете смотреть на экран (хоть в основном цикле OB1 или в прерывании, неважно), вы не узнаете, сработал будильник или нет, даже если время уже вышло. Запущенный таймер работает независимо от того, смотрите вы на экран или нет, но узнать вышло ли время вы сможете только проверив его. Смотреть на экран по прерыванию 25мс вы можете незавимисо от того, запущен таймер или нет, вы просто это делаете.
Прерывание прерывает основной цикл OB1 через равные промежутки времени, выполняет внутри себя свой код и возвращает выполнение цикла OB1 с того месте, где прервал. Таймер это не задержка, как например delay на ардуине, он не блокирует работу цикла. Когда вы его запустили код продолжает выполняться дальше, а таймер необходимо периодически вызывать (это такая же функция, как и остальные) для опроса вышло время или нет. Поэтому в прерывании вы проверяете вышло ли время таймера (а не ждёте, пока он досчитает), если время еще не прошло, то ваш FC4 не выполняется, происходит выход в OB1 до следующего прерывания.
Что произойдёт, если в прерывании на 25мс будет выполняться код за 100мс?

Автор темы
svr444
здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 05 апр 2023, 14:55
Имя: Сергей

Прерывания OB30

Сообщение svr444 »

Спасибо большое, теперь я правильно понимаю?

Т.е. в ob31 вызывается fc4, в fc4 вызывается fb11. Когда первый раз вызвали fb11 запустится таймер. Далее по условию должен быть вызван fb12 если таймер досчитал до уставки. Но в первом прерывании этого не случится (случится в 21, при уставке 500мс), соответственно fb12 не «запустится».
На этом произойдет выход из прерывания обратно в ob1 и программа продолжится до следующего прерывания…

На 21 прерывании таймер досчитает, «поднимет» выход «засетит» катушку (av_imp), далее произойдет сброс таймера.
Т.к. катушка была «засечена» ее контакт в состоянии “истина» (на один скан), следовательно запустится fb12.
Когда выполнится код в fb12 произойдет выход (fc12-fb11-fc4) из прерывания обратно в ob1..и т.д.

Я думал, что когда происходит выход из прерывания функция fc4 отключается (грубо говоря, на ножке включения функции EN устанавливается «false», следовательно все значения переменных прекращают существовать. При повторном прерывании функция вызывается снова и таймер ТON(вызывается снова) опять начинает считать время с нуля

Отправлено спустя 13 минут 1 секунду:
svr444 писал(а): 26 авг 2023, 13:16 При повторном прерывании функция вызывается снова и таймер ТON(вызывается снова) опять начинает считать время с нуля
Или же пока я не произвожу сброс таймера (RT), насчитанное время остается в переменной в экземп. блоке данных таймера?

Joshua
здесь недавно
здесь недавно
Сообщения: 76
Зарегистрирован: 21 мар 2023, 02:12
Имя: Владимир
Страна: РФ
город/регион: Псков
Благодарил (а): 2 раза
Поблагодарили: 9 раз

Прерывания OB30

Сообщение Joshua »

Вот теперь вроде правильно.
svr444 писал(а): 26 авг 2023, 13:29 Я думал, что когда происходит выход из прерывания функция fc4 отключается (грубо говоря, на ножке включения функции EN устанавливается «false», следовательно все значения переменных прекращают существовать.
Все значения локальных переменных (объявленных внутри функции FC) прекращают существовать в момент выхода из этой функции. Они существуют только пока выполняется функция. Переменные в DB и глобальные остаются. Функциональные блоки имеют свои собственные экземплярные блоки данных, в которых они сохраняют своё состояние до следующего вызова.
Таймер TON является FB, и имеет свой экз.блок, время между вызовами сохраняется, пока вы его не сбросите.

Автор темы
svr444
здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 05 апр 2023, 14:55
Имя: Сергей

Прерывания OB30

Сообщение svr444 »

Спасибо вам большое за подробное и «разжеванное» объяснение. Спасибо!

Отправлено спустя 6 минут 27 секунд:
svr444 писал(а): 26 авг 2023, 17:20 Таймер TON является FB, и имеет свой экз.блок, время между вызовами сохраняется, пока вы его не сбросите.
По таймеру. Обычно, я видел и составлял алгоритмы на языке FBD.
Таймер TON, в FBD не требует явного сброса, т.е. просто снимаю сигнал на вызов таймера (ножка EN), а при следующем вызове, таймер начинает счет заново (в экземплярном дб все обнуляется при снятии сигнала с EN).
Ответить

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