Регистрация | Последние сообщения | Персональный список | Поиск | Настройка конференции | Личные данные | Правила конференции | Список участников | Top 64 | Статистика раздела | faq | Что нового v.2.3 | Чат
Skunk Forum - Техника, Наука, Общество » АСУТП »
помогите решить задачу в Codesys

Версия для печати (настроить)

Новая тема | Написать ответ

Подписаться

Автор Тема:   помогите решить задачу в Codesys
kohausen
Junior Member

Сообщений: 23
Регистрация: Декабрь 2006

написано 13 Июля 2007 10:26ИнфоПравкаОтветитьIP

Помогите решить в Codesys следующую задачу:
Требуется постоянно вычислять время (реальное, в секундах---причем велична его будет изменятся), прошедшее со момента первого срабатывания датчика до второго срабатывания этого же датчика. язык реализации не важен.

Pike
Junior Member

Сообщений: 29
Откуда: Москва, РФ
Регистрация: Декабрь 2006

написано 13 Июля 2007 11:17ИнфоПравкаОтветитьIP

Не знаю как это реализовано в Codesys, но в других средах программирования есть понятие Totalising Timer. Соотвественно, один сигнал на входе на подсчет (пока Вкл таймер считает), второй на сброс таймера.

[Это сообщение изменил Pike (изменение 13 Июля 2007 12:46).]

IP
Member

Сообщений: 90
Откуда: Russia
Регистрация: Июнь 2006

написано 13 Июля 2007 12:25ИнфоПравкаОтветитьIP

Если бы было нужно мерить время пока датчик стоит в 1, то стандартным таймером. В данном случае вся сложность в том, нужно выделить сработки датчика, по ним сделать такой импульс, который уже легко померить.

Пример на ST:

VAR
bInput1: BOOL; (*Датчик*)
bImpuls: BOOL; (*Вспом. переменная для выделения импульса*)
dwMyTime: DWORD; (*Результат - длит. в секундах*)
TRIG1: R_TRIG; (*Детектор фронта датчика*)
TP1: TON := (PT:=T#10d); (* Таймер. Считаем что длительность
импульса не бывает больше 10 дней*)
END_VAR

(*1 Выделяем передние фронты (сработки) датчика триггером,
переменная bImpuls будет = TRUE между двумя сработками*)
TRIG1(CLK:= bInput1);
IF TRIG1.Q THEN
bImpuls := NOT bImpuls;
END_IF

(*2 Измеряем длительность bImpuls стандартным таймером *)
TP1(IN := bImpuls);

(*3 Постоянно во время импульса преобразуем длительность типа TIME в целое - секунды*)
IF bImpuls THEN
dwMyTime := TIME_TO_DWORD(TP1.ET)/1000;
END_IF

По таймерам подробнее см. статью 'Программируем временные сложности' тут ссылка

kohausen
Junior Member

Сообщений: 24
Регистрация: Декабрь 2006

написано 13 Июля 2007 13:24ИнфоПравкаОтветитьIP

IP
пока ждал, набраосал свой вариант, что скажите?
VAR
rise_front: R_TRIG;
C: USINT; (*используется как счетчик срабатываний датчика*)
rise_out_1: R_TRIG;
rise_out_2: R_TRIG;
bOut_1: BOOL;
bOut_2: BOOL;
counter: TOF;
bwMy_Time: TIME; (*время между срабатываниями датчика*)
END_VAR
VAR_OUTPUT
bQ_1: BOOL;
bQ_2: BOOL;
END_VAR
VAR_INPUT
bSensor: BOOL;
END_VAR

- - - - - - - - - -
rise_front (CLK:= bSensor); (*ловим передний фронт входного сигнала с датчика*)

IF rise_front.Q AND C=0 (*ловим первый импульс *)
THEN
C:=1;
bOut_1:= TRUE; (*активируем соответсующий выход*)
rise_out_1(CLK:=bOut_1 , Q=>bQ_1 );
bOut_2:=FALSE;
ELSIF rise_front.Q AND C=1 (*ловим второй импульс*)
THEN
C:=0;
bOut_2:=TRUE; (*активируем соответсвующий выход*)
rise_out_2(CLK:=bOut_2, Q=>bQ_2 );
bOut_1:= FALSE;
END_IF;

counter (IN:= rise_out_1.Q, PT:=T#800s); (*начинаем считать время, максимальное время примем 800 сек*)
IF rise_out_2.Q (*записываем искомое время в переменную bwMy_Time только по второму срабатыванию датчика*)
THEN
bwMy_Time:=counter.PT;
END_IF;

IP
Member

Сообщений: 91
Откуда: Russia
Регистрация: Июнь 2006

написано 13 Июля 2007 15:07ИнфоПравкаОтветитьIP

> пока ждал, набраосал свой вариант, что скажите?

1) TOF – будет мерить паузы, надо TON
2) Переменной bwMy_Time присваивается вход PT, т.е. входная константа, нужно ET
3) Зачем вообще нужны rise_out_1, rise_out_2, bQ_1 и bQ_2? По условию задачи их нет.
4) Выходной переменной bwMy_Time значение присваивается только в конце измерения, а не постоянно, как требовалось в условии. Если так и надо то:

rise_front (CLK:= bSensor); (*ловим передний фронт входного сигнала с датчика*)

IF rise_front.Q THEN (*ловим импульс *)
IF NOT bOut_1 THEN (*он первый*)
bOut_1:= TRUE; (*активируем выход*)
ELSE (*второй*)
bOut_1:= FALSE; (*сбрасываем выход*)

bwMy_Time:=counter.ET; (*записываем искомое время в переменную bwMy_Time только по второму срабатыванию датчика*)
END_IF
END_IF

counter (IN:= bOut_1, PT:=T#800s); (*начинаем считать время, максимальное время примем 800 сек*)

* ';' после END_IF лишняя совсем
* в каждом цикле вызова таймера пихать в него уставку-константу 800 сек не зачем, можно задать ее 1 раз при инициализации (См. первый пример)

Вообще сделайте новый проект с одним этим блоком и проверьте хорошенько все в эмуляторе. Добейтесь чтобы он работал, так как надо, затем вставьте в рабочий проект.

Ушел в отпуск. Надеюсь все уже получилось

Павел Мощицкий
Member

Сообщений: 2013
Откуда: Израиль. Бат-Ям
Регистрация: Январь 2004

написано 14 Июля 2007 01:05ИнфоПравкаОтветитьIP

IP
Ушел в отпуск.
В отпуск без доступа в Инет? Не верю.

staff1189
Junior Member

Сообщений: 1
Откуда: Россия
Регистрация: Ноябрь 2010

написано 16 Ноября 2010 14:22ИнфоПравкаОтветитьIP

помогите решить задачу прозвонки 10 проводов на плк 63

Ваш ответ:

Коды форума
Смайлики


Ник:    Пароль       
Отключить смайлики

Все время MSK

Склеить | Разбить | Закрыть | Переместить | Удалить

Новая тема | Написать ответ
Последние сообщения         
Перейти к:

Свяжитесь с нами | skunksworks.net

Copyright © skunksworks.net, 2000-2018

Разработка и техническая поддержка: skunksworks.net


Рейтинг@Mail.ru Яндекс.Метрика