Просмотр полной версии : Вызов программы по событию TRUE->FALSE
День добрый!
Возникла задача измерить длительность сигнала на выходе ПЛК внешним прибором. Для этого решил взять другой ПЛК и добавить две задачи, первая по приходу на вход TRUE, для фиксирования момента включения. Вторая по пропаданию сигнала, для фиксирования момента выключения и расчета длительности. Однако столкнулся с проблемой вызова программы по пропаданию сигнала. Какие могут быть варианты вызова программы по заднему фронту на входе без использования циклической программы?
День добрый!
Возникла задача измерить длительность сигнала на выходе ПЛК внешним прибором. Для этого решил взять другой ПЛК и добавить две задачи, первая по приходу на вход TRUE, для фиксирования момента включения. Вторая по пропаданию сигнала, для фиксирования момента выключения и расчета длительности. Однако столкнулся с проблемой вызова программы по пропаданию сигнала. Какие могут быть варианты вызова программы по заднему фронту на входе без использования циклической программы?
Две задачи в Вашем случае -мазохизм.
Используйте в основной программе функцию TIME().
Запоминаете значение TIME() по фронту прихода значения "TRUE", по спаду получите новое значение TIME() и вычитаете из него ранее запомненное.
PROGRAM PLC_PRG
VAR
R_TRIG1: R_TRIG;
In: BOOL;
tmp: TIME;
F_TRIG1: F_TRIG;
Delta: TIME;
END_VAR
R_TRIG1(CLK:=In);
IF R_TRIG1.Q THEN
tmp:=TIME();
END_IF
F_TRIG1(CLK:=In);
IF F_TRIG1.Q THEN
Delta:=TIME()-tmp;
END_IF
20872
Две задачи в Вашем случае -мазохизм.
Используйте в основной программе функцию TIME().
Запоминаете значение TIME() по фронту прихода значения "TRUE", по спаду получите новое значение TIME() и вычитаете из него ранее запомненное.
Через основную программу все уже давно проверено и перепроверено. Вот только непонятки в работе оборудования иногда все равно проскакивают, поэтому и приходится заниматься "мазохизмом".
Две задачи в Вашем случае -мазохизм.
Используйте в основной программе функцию TIME().
Запоминаете значение TIME() по фронту прихода значения "TRUE", по спаду получите новое значение TIME() и вычитаете из него ранее запомненное.
Не совсем верно сразу понял, т.е. засунуть в одну циклическую триггеры и ловить переходы? Да, в данном случае это подойдет, быстродействия хватит. Т.к. надо отловить изменения кратные мсек. Но вопрос как вызывать программу по переходу сигнала из TRUE в FALSE интересен теперь уже сам по себе
.. Но вопрос как вызывать программу по переходу сигнала из TRUE в FALSE интересен теперь уже сам по себе
п#3 внимательно смотрим
Не совсем верно сразу понял, т.е. засунуть в одну циклическую триггеры и ловить переходы? Да, в данном случае это подойдет, быстродействия хватит. Т.к. надо отловить изменения кратные мсек. Но вопрос как вызывать программу по переходу сигнала из TRUE в FALSE интересен теперь уже сам по себе
Нету там ни какой цикличности. Программа всего одна -PLC_PRG. Диспетчер (конфигурация) задач в моем варианте не используется!
п#3 внимательно смотрим
я ведь еще в теме написал изначально:
Какие могут быть варианты вызова программы по заднему фронту на входе без использования циклической программы?
+
Но вопрос как вызывать программу по переходу сигнала из TRUE в FALSE интересен теперь уже сам по себе
Нету там ни какой цикличности. Программа всего одна -PLC_PRG. Диспетчер (конфигурация) задач в моем варианте не используется!
и что? это не отменяет того факта что PLC_PRG вызывается самостоятельно циклически.
Вопрос сейчас стоит так:
Но вопрос как вызывать программу по переходу сигнала из TRUE в FALSE интересен теперь уже сам по себе
Написать NOT и вызывать точно так же, как по переходу из FALSE в TRUE, нет?
Да не, вера не позволяет. Вера в мифические прерывания из таск. Типо если не будет циклического вызова это чёто сэкономит.
Но вопрос как вызывать программу по переходу сигнала из TRUE в FALSE интересен теперь уже сам по себе
Привяжите на Di : через сухой контакт киньте катушку реле, а на этот Di заведите н.з. контакт этого реле. Или предполагаете что железо это не программа ?
Написать NOT и вызывать точно так же, как по переходу из FALSE в TRUE, нет?
Так не получается. Ругается не то, что пробелы нельзя использовать в имени события.
ЗЫ.
На вопрос, который стал интересен сам по себе.
Кроме двух задач по событию, добавить задачу с типом свободная с приоритетом 0.
В свободной задаче добавить программу с одной строчкой
notDI_1:=NOT DI_1;
где DI_1 -физический вход ПЛК
notDI_1 -глобальная переменная.
notDI_1 использовать как событие по переходу сигнала из TRUE в FALSE.
Да не, вера не позволяет. Вера в мифические прерывания из таск. Типо если не будет циклического вызова это чёто сэкономит.
Привяжите на Di : через сухой контакт киньте катушку реле, а на этот Di заведите н.з. контакт этого реле. Или предполагаете что железо это не программа ?
Да, можно инвертировать сигнал. Вот только у реле есть время сработки, а тут вопрос кратный 10 мсек стоит. Как вариант можно транзистор с обвязкой на 24В использовать. Но хотелось бы обойтись без таких вещей.
Так не получается. Ругается не то, что пробелы нельзя использовать в имени события.
ЗЫ.
На вопрос, который стал интересен сам по себе.
Кроме двух задач по событию, добавить задачу с типом свободная с приоритетом 0.
В свободной задаче добавить программу с одной строчкой
notDI_1:=NOT DI_1;
где DI_1 -физический вход ПЛК
notDI_1 -глобальная переменная.
notDI_1 использовать как событие по переходу сигнала из TRUE в FALSE.
Спасибо за ответ.
А что именно ПЛК понимает под типом "свободная"?
Свободный циклический вызов ))
а тут вопрос кратный 10 мсек стоит.
Програмный вызов по условию и не компостируйте себе же моск.
Не надейтесь получить через таски что-то более кратное чем прог.таймеры.
Спасибо за ответ.
А что именно ПЛК понимает под типом "свободная"?
20894http://www.owen.ru/forum/attachment.php?attachmentid=11963&d=1392751579
Свободная задача будет выполняться все время между событиями и прерываться только на время выполнения циклических задач.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot