Вход

Просмотр полной версии : Пара вопросов



vakim
27.07.2011, 11:01
Я начинающий, есть вопросы
1. Возможно ли писать программу и отлаживать а КодеСус не имея ПЛК? Т.е. написал, проверил, а потом купил ПЛК и залил в него. У меня при старте проекта, пишет ошибку подключения. (когда пытаюсь запустить пример работы таймера с форума)
РЕШЕНО: нашел кнопку эмуляция

2. ПЛК сейчас под рукой нет, хочу спросить по таймеру
Такой код:

TP1(IN:=TRUE, PT:=t#5s);
var_A:=TP1.Q;
Правильно я понял, что таймер как-бы уходит в фон, программа продлжает выполняться, а выход инициализируется через указанное время?

Mangust
27.07.2011, 11:22
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.

vakim
27.07.2011, 11:43
Спасибо!
Я исходный пост уже поправить успел. :o

Mangust
27.07.2011, 12:05
Правильно я понял, что таймер как-бы уходит в фон, программа продлжает выполняться, а выход инициализируется через указанное время?

1.Юридически и теоретически не чисто:), но для наглядного образа можно так себе представить. Причем все остальные виды таймеров, счетчики, триггеры и т.д. выполняются также.
2.Но в данном конкретном коде, повторяю: у Вас на входе таймера константа (ТРУЕ), т. е. при старте контроллера переменная var_A станет 1 на 5 сек, потом выключится в 0. Почитайте в справке есть диаграммы срабатывания по всем таймерам.

vakim
27.07.2011, 18:24
Необычно, но проясняется... еще вопрос, тут 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)

vakim
27.07.2011, 18:32
ЕСЛИ бочка_заполняется ТО не_делать_ничего
ИНАЧЕ
ЕСЛИ бочка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;