Просмотр полной версии : Пара вопросов
Я начинающий, есть вопросы
1. Возможно ли писать программу и отлаживать а КодеСус не имея ПЛК? Т.е. написал, проверил, а потом купил ПЛК и залил в него. У меня при старте проекта, пишет ошибку подключения. (когда пытаюсь запустить пример работы таймера с форума)
РЕШЕНО: нашел кнопку эмуляция
2. ПЛК сейчас под рукой нет, хочу спросить по таймеру
Такой код:
TP1(IN:=TRUE, PT:=t#5s);
var_A:=TP1.Q;
Правильно я понял, что таймер как-бы уходит в фон, программа продлжает выполняться, а выход инициализируется через указанное время?
1. Включите режим эмуляции физического контроллера:
Онлайн - Режим эмуляции.
2.Ничего не останавливается, просто по поступлению лог. 1 на вход (у Вас кстати во входе не переменная, а константа "IN:=TRUE"), выход установится в 1, на 5 сек. А остальная программа как выполнялась так и будет дальше выполнятся циклически.
Таймер TP
Входит в standard.lib.
Функциональный блок 'таймер'.
TP(IN, PT, Q, ET) Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME.
Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени (в миллисекундах) на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN.
Временная диаграмма работы TP:смотри справка (Ф1)
3. См. ответ 2.
Спасибо!
Я исходный пост уже поправить успел. :o
Правильно я понял, что таймер как-бы уходит в фон, программа продлжает выполняться, а выход инициализируется через указанное время?
1.Юридически и теоретически не чисто:), но для наглядного образа можно так себе представить. Причем все остальные виды таймеров, счетчики, триггеры и т.д. выполняются также.
2.Но в данном конкретном коде, повторяю: у Вас на входе таймера константа (ТРУЕ), т. е. при старте контроллера переменная var_A станет 1 на 5 сек, потом выключится в 0. Почитайте в справке есть диаграммы срабатывания по всем таймерам.
Необычно, но проясняется... еще вопрос, тут http://www.owen.ru/forum/showthread.php?t=10412 написано, что никак нельзя организовать большие задержки 30-60с.
У меня 5 бочек. Наполнять я могу только одну.
Я проверяю первую - пустая, должен лить туда 30с, потом проверяю - пустая, снова лью 30с, проверяю - полная, перехожу к следующей.
На Паскале это было бы так:
while (бочка1_пустая) do
действие=лить_в_бочку1;
пауза 30с;
действие=не_лить_в_бочку1;
end_while;
while (бочка2_пустая) do
... и т.д.
Пока бочка наполняется делать как бы нечего.
Как такое правильно сделать на ST?
(Девайс ПЛК110)
ЕСЛИ бочка_заполняется ТО не_делать_ничего
ИНАЧЕ
ЕСЛИ бочка1_пуста ТО лить_в_бочку1
ЕСЛИ (бочка1_полна И бочка2_пуста) ТО лить_в_бочку2
и т.д. ....
КОНЕЦ_ЕСЛИ
Только так?
т.е. POU должна каждый "проход" отрабатываться вся, не "зависая" в циклах?
Возникает еще вопрос: сразу после отработки таймера я должен выполнить несколько операций. Как это сделать? Отдельная POU, процедура?
Николаев Андрей
28.07.2011, 08:32
Это основной принцип - ПОУ обрабатывается вся в цикле. Каждый цикл. Так работают все ПЛК. И естественно записывается последнее вычисленное значение каждой переменной.
if бочка1_пуста then
лить в бочку1 := true;
запускаем таймер TON на 30 сек;
end_if;
if (бочка 1 не пуста) или ((бочка 1 пуста) и (выход таймера = true)) then
лить в бочку1 := false;
end_if;
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot