PDA

Просмотр полной версии : Контролируем аквариум на ПЛК63



tanatholog
20.01.2014, 19:14
Доброго времени суток.
Прошу сильно в меня камнями не кидать.
Есть большое желание наваять программу для контроля аквариума.
Что хотелось бы там видеть:
1. 4 цикла работы системы жизнеобеспечения
1.1 День (вкл. дневной свет, помпу, компрессор)
1.2 Вечер (наступает через 10 часов, откл. дневной свет, включаем ночную подсветку)
1.3 Ночь (отключаем "шумящие" приборы-помпу и компрессор, подсветка включена)
1.4 Глубокая ночь (отключаем подсветку)
2. Контроль температуры в аквариуме с выводом на ЖКИ
2.1 Включение вентиляторов при превышении температуры.
Ну и самое страшное для меня:
3.1 Вывод на ЖКИ текущего режима работы, времени, температуры.
3.2 Возможность запрограммировать время запуска с панели.
3.3 Возможность ручного переключения данных режимов с панели.
3.4 Возможность программирования уставок температуры.

Сам я впервые столкнулся с codesys и очень многое для меня непонятно. Так что прошу помощи.
Очень непонятно как работать с системным временем, как ввести уставки, как лучше запускать циклы (по таймеру от старта или по определенному времени).
Добавлю, что ПЛК63 у меня вот такой:РРРРУУ-М

Sergey666
20.01.2014, 19:44
Забавно - включение вентиляторов не охладит воду , ее помешивать надо .
А вот насосиком прогонять через фильтр - охладит.

Если все не понятно - в раздел примеры программ и полезностей , там примеров хватает .

Вот будет конкретный вопрос , обращайтесь.

tanatholog
20.01.2014, 20:11
Тема создана для поиска единомышленников. Может я тут велосипед изобретаю и какие-то наработки уже есть.
Включение вентилятора, направленного на поверхность воды еще как охлаждает воду. Ничего забавного в этом нет =))
Конкретный вопрос №1:
Как правильно сделать таймер начала программы с заданием времени запуска цикла?
Полезности все перерыл. Ничего подходящего не нашел.

rovki
20.01.2014, 20:18
Ваша цель изучить кодесис или управлять аквариумом ?"

Sergey666
20.01.2014, 20:21
Делаете секундный таймер
Tmr_1s(In:=not Tmr_1s.Q,Pt:=t#1s);

Считаете секунды
if Tmr_1s.Q then Count_s:=Count_s+1 ; End_if

Делаете минуты
if Count_s>=60 then Min_wrk:=Min_wrk+1;Count_s:=0;end_if

таким же образом делать часы .
Да , значения секунд , мин , час - ретайн.

Это самый удобный способ.

capzap
20.01.2014, 20:58
можно и так
IF tik.Q THEN
count:=count+1;
countSec:= count MOD 60;
IF count <> 0 AND countSec=0 THEN
countMin:=countMin+1;
END_IF;
END_IF;
tik(IN:=NOT tik.Q,PT:=T#1s);
можно таким образом
IF flag AND flag<>oldFlag THEN
toe:=TIME_TO_DWORD(TIME());
ELSIF flag THEN
tiktak:=DWORD_TO_TIME(TIME_TO_DWORD(TIME()) - toe);
countSec:= (TIME_TO_DWORD(TIME()) - toe) MOD 60;
IF (TIME_TO_DWORD(TIME()) - toe) <> 0 AND countSec=0 THEN
countMin:=countMin+1;
END_IF;END_IF;
oldFlag:=flag;
на счет удобства вопрос спорный и на самом деле если десятичесовые таймеры стоят, то нужно как во втором варианте только привязываться к часам реального времени и вслучае пропадания питания сети, временные интервалы сохранятся, а в первых двух вариантах нужно продумывать подстройку

Sergey666
20.01.2014, 21:10
Да , первый вариант для выполнения по любому , т.е выключалось питание или нет , например УФ лампа должна отгореть 45 мин .

Если отсчитывать какой-либо более-менее короткий (ну.. разумный что-ли интервал) можно таймеры запускать .
Если как описано в 1м посте ,(Утро,день,вечер,ночь) это уже называется суточный планировщик и там привязываться надо к RTC.

lara197a
20.01.2014, 21:24
не эффективное решение, это дорого..!!!!

Sergey666
20.01.2014, 22:05
не эффективное решение, это дорого..!!!!

Да нормально .
Аналоги из Овен - Пр114+Ми+СП270+БП24 почти то же самое по цене .
ТРМ-хх+какой-нибудь УТ24 +еще че нибудь - Г...

Вообще оптимально для Logo или AL2 ,а Zelio - Лох .

rovki
20.01.2014, 22:15
тут и ИП320 за глаза(с ПР114) ,прям умный дом какой то,надо за рыбами наблюдать ,а не за режимами .Че их смотреть ,какие задал ,такие и будут на автомате .Для аквариума все уже придумано,это я к тому ,что экспериментов надо минимум ,технологии описаны подробно.

tanatholog
21.01.2014, 04:33
Ваша цель изучить кодесис или управлять аквариумом ?"
Стартовый топик Вам в ответ. Одно другому не мешает.


Делаете секундный таймер
Tmr_1s(In:=not Tmr_1s.Q,Pt:=t#1s);

Считаете секунды
if Tmr_1s.Q then Count_s:=Count_s+1 ; End_if

Делаете минуты
if Count_s>=60 then Min_wrk:=Min_wrk+1;Count_s:=0;end_if

таким же образом делать часы .
Да , значения секунд , мин , час - ретайн.

Это самый удобный способ.
Спасибо за совет. Попробую реализовать.

не эффективное решение, это дорого..!!!!
Да мне по случаю достался этот ПЛК. Потому затраты минимальны =)



тут и ИП320 за глаза(с ПР114) ,прям умный дом какой то,надо за рыбами наблюдать ,а не за режимами .Че их смотреть ,какие задал ,такие и будут на автомате .Для аквариума все уже придумано,это я к тому ,что экспериментов надо минимум ,технологии описаны подробно.

За рыбами надо не только наблюдать, но и организовать им нормальные условия жизни. А когда дома сутками не бываешь, то и автоматизация не помешает, но и её я тоже должен держать под контролем. И для смены параметров не собираюсь подключать его к компьютеру.

tanatholog
21.01.2014, 07:04
Помогите сделать кнопку "пуск/стоп" и управлять выходами с панели!

tanatholog
21.01.2014, 11:57
11479
КАК это делается? Пытаюсь прикрутить по примеру датчик температуры, но компилятор ругается на эти идентификаторы.В программе-примере они в конфигурации устройства прописаны, а я у себя не могу такое сделать.

Василий Кашуба
21.01.2014, 12:24
11479
КАК это делается? Пытаюсь прикрутить по примеру датчик температуры, но компилятор ругается на эти идентификаторы.В программе-примере они в конфигурации устройства прописаны, а я у себя не могу такое сделать.
А вы не заметили разницу в приведённых примерах? Вы забыли присвоить своим переменным имена.

petera
21.01.2014, 12:27
11479
КАК это делается? Пытаюсь прикрутить по примеру датчик температуры, но компилятор ругается на эти идентификаторы.В программе-примере они в конфигурации устройства прописаны, а я у себя не могу такое сделать.
11480
Нажать на картинку для просмотра анимации.

Только если имена переменным задаете в конфигурации, то не должны их определять в в разделе объявления переменных в программе!

tanatholog
21.01.2014, 12:38
Вот я недалекий =)))
Я полностью на строку нажимал, и конечно же ничего не получалось.
Пока отвечали я все это в глобальные переменные вписал. Тоже все работает.

tanatholog
21.01.2014, 15:07
11480
Нажать на картинку для просмотра анимации.

Только если имена переменным задаете в конфигурации, то не должны их определять в в разделе объявления переменных в программе!

Вот таким людям благодарность надо объявлять!
Все четко и понятно. На все вопросы сопливого новичка ответил.

tanatholog
22.01.2014, 10:22
Последний вопрос:
Как запрограммировать кнопку "пуск/стоп" на запуск программы?

AVF
22.01.2014, 10:36
На все вопросы сопливого новичка ответил.
--- а что - наличие соплей не позволяет пройти курсы обучения по КоДеСис или почитать литературу?

tanatholog
22.01.2014, 10:58
А наличие клавиатуры подразумевает написание не относящихся к теме топиков?

Литературу читаю, но охватить все в сжатые сроки нереально.
На данный момент в изучении работа с вводом/выводом.

жекон
22.01.2014, 17:26
На диске есть пример работы с клавиатурой

tanatholog
23.01.2014, 19:57
Крик души!
Дайте код, чтобы при нажатии клавиши "пуск/стоп" на выходе блока, допустим rezh1 выдавалось значение 31,32,33,34 по круговой. А в случае, если на клавишу не нажимали 2 секунды, то 0.
В чем только не пробовал рисовать. То клавиша не нажимается, то цикл не слушается.

capzap
23.01.2014, 20:45
Крик души!
Дайте код, чтобы при нажатии клавиши "пуск/стоп" на выходе блока, допустим rezh1 выдавалось значение 31,32,33,34 по круговой. А в случае, если на клавишу не нажимали 2 секунды, то 0.
В чем только не пробовал рисовать. То клавиша не нажимается, то цикл не слушается.

пробуйте, если что то не так, извиняйте, таково ТЗ значит было

amn
23.01.2014, 21:23
Крик души!
Дайте код, чтобы при нажатии клавиши "пуск/стоп" на выходе блока, допустим rezh1 выдавалось значение 31,32,33,34 по круговой. А в случае, если на клавишу не нажимали 2 секунды, то 0.
В чем только не пробовал рисовать. То клавиша не нажимается, то цикл не слушается.

Еще вариант.

tanatholog
24.01.2014, 06:08
Спасибо огромное. Буду пробовать. Подкорректировать сам смогу. Главное алгоритм понять!
Посмотрел оба примера. Как же все элементарно, а я сам себя перемудрил =)

tanatholog
24.01.2014, 10:59
Еще вариант.

А как показать, что in-это клавиша "пуск/стоп" клавиатуры?
kbrd-это у меня так клавиатура в конфигурации ПЛК обзывается.

IF kbrd=32 THEN
in:=TRUE;
ELSE
in:=FALSE;
END_IF

Как-то так сделать?

kgsh82
24.01.2014, 16:40
in := (kbrd = 32);

tanatholog
24.01.2014, 17:09
in := (kbrd = 32);

Мда... Так гораздо короче )))

tanatholog
26.01.2014, 20:29
Все равно плохо у меня в понимании таймеров.
Не получается сформировать вот такой блок:
IN1-кнопка на дискретном входе (настроить её работу получилось);
IN2:BOOL-вход, на который приходит разрешение на включение помпы по расписанию;
Q1:BOOL-выход, который подключен к питанию помпы.

Надо реализовать кормление. Смысл такой:
Q1 повторяет работу IN2 (получается, что помпа работает по расписанию)
При нажатии на IN1 выход Q1=false (отключается помпа) на 5 минут, после чего Q1 опять повторяет вход IN2.

У меня то Q1 всегда FALSE, то наоборот и нажатие кнопки хоть и проходит, но не запускает чертов таймер на выдержку. То получалось, что помпа отключалась при нажатии, но на подхват не вставала при отпускании кнопки и таймер опять таки
не запускался.
Помогите!

petera
26.01.2014, 20:37
Все равно плохо у меня в понимании таймеров.
Не получается сформировать вот такой блок:
IN1-кнопка на дискретном входе (настроить её работу получилось);
IN2:BOOL-вход, на который приходит разрешение на включение помпы по расписанию;
Q1:BOOL-выход, который подключен к питанию помпы.

Надо реализовать кормление. Смысл такой:
Q1 повторяет работу IN2 (получается, что помпа работает по расписанию)
При нажатии на IN1 выход Q1=false (отключается помпа) на 5 минут, после чего Q1 опять повторяет вход IN2.

У меня то Q1 всегда FALSE, то наоборот и нажатие кнопки хоть и проходит, но не запускает чертов таймер на выдержку. То получалось, что помпа отключалась при нажатии, но на подхват не вставала при отпускании кнопки и таймер опять таки
не запускался.
Помогите!
Так ни кто не сможет найти ошибку в Вашей программе,
выкладывать нужно хотя бы фрагмент кода.

tanatholog
27.01.2014, 07:15
Так ни кто не сможет найти ошибку в Вашей программе,
выкладывать нужно хотя бы фрагмент кода.
Извиняюсь, поторопился и не вставил код...
Вечером выложу.

amn
27.01.2014, 09:07
Если я правильно понял вход in2 включает q. Вход in1 выключает выход q на 5 минут.


VAR_INPUT
in1, in2:BOOL;
END_VAR
VAR_OUTPUT
q:BOOL;
END_VAR
VAR
TOF1: TOF;
END_VAR
-------------------------
TOF1(IN:=in1 , PT:=t#5m);
q:=in2 AND NOT TOF1.Q;

tanatholog
27.01.2014, 10:04
Спасибо! Попробую. Я что-то нагородил там с таймером =)

tanatholog
12.04.2020, 08:32
Оживлю свою старую тему.
Решил переписать свою программу управления злополучным аквариумом. Основной критерий: суточное переключение света, газа, воздуха. Режимы, в общем.
Привязано все к реальному времени. И в этом проблема.
Захотел я сделать так, чтобы в уставках вводилась основная информация: время запуска основного света и продолжительность, а остальной суточный режим пересчитывался сам. Добился, чтобы все переменные были в диапазоне 0-23, чтобы привязать к часам. И тут незадача:
IF clock>=time_start AND clock< time_end THEN
day_light:=TRUE;
Вся беда в том, что по расчётам может получиться так:
time_start=19
time_end=3 (3 часа утра следующих суток)
Тут вся логика и затыкается.
Подскажите, что можно сделать?

ASo
12.04.2020, 08:55
Программировать!
Варианта минимум 2:
1. RS триггер, если считать, что ПЛК работает круглосуточно всегда.
2. Ещё одно условие на сравнение времени начала и окончания с обработкой перехода через 0.
Простейшая школьная задачка.

tanatholog
12.04.2020, 10:12
Программировать!
Простейшая школьная задачка.
Вместо пафоса можете привести пример решения простейшей школьной задачки?

petera
12.04.2020, 13:07
Оживлю свою старую тему.
Решил переписать свою программу управления злополучным аквариумом. Основной критерий: суточное переключение света, газа, воздуха. Режимы, в общем.
Привязано все к реальному времени. И в этом проблема.
Захотел я сделать так, чтобы в уставках вводилась основная информация: время запуска основного света и продолжительность, а остальной суточный режим пересчитывался сам. Добился, чтобы все переменные были в диапазоне 0-23, чтобы привязать к часам. И тут незадача:
IF clock>=time_start AND clock< time_end THEN
day_light:=TRUE;
Вся беда в том, что по расчётам может получиться так:
time_start=19
time_end=3 (3 часа утра следующих суток)
Тут вся логика и затыкается.
Подскажите, что можно сделать?

PROGRAM PLC_PRG
VAR
on_Hour: WORD; (*время включения: часы*)
on_Minute: WORD; (*время включения: минуты*)
on_Second: WORD; (*время включения: секунды*)

of_Hour: WORD; (*время выключения: часы*)
of_Minute: WORD; (*время выключения: минуты*)
of_Second: WORD; (*время выключения: секунды*)

uptime: SysTime64;
datetime: SystemTimeDate;
clock: CurTimeEx;
time_on:DWORD; (*время включения в секундах*)
time_of:DWORD; (*время отключения в секундах*)
current_time:DWORD; (*текущее время в секундах*)
enable: BOOL; (*разрешение на включение*)
day_light: BOOL; (*выход*)
END_VAR
VAR CONSTANT
nulldt: SystemTimeDate; (*нужна для обнуления параметров*)
END_VAR

(*получить текущее время в секундыах*)
datetime := nulldt;(*обнуляем переменные времени*)
clock(SystemTime := uptime, (*текущее время в микросекундах*)
TimeDate := datetime); (*текущее время и дата в развернутом формате*)
current_time:=(datetime.Hour * 60 + datetime.Minute) * 60 + datetime.Second; (*текущее время*)
(*----------------------------------------------------------------*)

(*для уставок собираем часы, минуты и секунды в одну кучу - в секунды*)
time_on:=(on_Hour * 60 + on_Minute) * 60 + on_Second; (*время включения*)
time_of:=(of_Hour * 60 + of_Minute) * 60 + of_Second; (*время отключения*)
(*----------------------------------------------------------------*)

(*-----------РЕШЕНИЕ ЗАДАЧИ-----------------*)
(*ВОПРОС:
Вся беда в том, что по расчётам может получиться так:
time_start=19
time_end=3 (3 часа утра следующих суток)
Тут вся логика и затыкается.
*)
(*Вот ответ на задачу*)
CASE BOOL_TO_INT(time_on <= time_of) OF
0: day_light:=enable AND NOT(current_time >= time_of AND current_time < time_on);
1: day_light:=enable AND current_time >= time_on AND current_time < time_of;
END_CASE

(*Или такой вариант
IF time_on <= time_of THEN
day_light:=enable AND current_time >= time_on AND current_time < time_of;
ELSE
day_light:=enable AND NOT(current_time >= time_of AND current_time < time_on);
END_IF
*)

Для проекта нужна библиотека SysLibTime

tanatholog
12.04.2020, 13:17
В случае с RS нужно на Set подать TRUE, которое берём из сравнения времени с уставкой старта, а на Reset дать TRUE из времени выключения? Я правильно понимаю?

petera
12.04.2020, 13:27
В случае с RS нужно на Set подать TRUE, которое берём из сравнения времени с уставкой старта, а на Reset дать TRUE из времени выключения? Я правильно понимаю?

Вот без всяких триггеров


CASE BOOL_TO_INT(ime_start <= time_end) OF
0: day_light:=NOT(clock >= time_end AND clock < ime_start); (* 0 ------I________I------ 24 *)
1: day_light:=clock >= ime_start AND clock < time_end; (* 0 _____I----------I_____ 24 *)
END_CASE

СМ. предыдущий пост

tanatholog
12.04.2020, 13:28
PROGRAM PLC_PRG
VAR
on_Hour: WORD; (*время включения: часы*)
on_Minute: WORD; (*время включения: минуты*)
on_Second: WORD; (*время включения: секунды*)

of_Hour: WORD; (*время выключения: часы*)
of_Minute: WORD; (*время выключения: минуты*)
of_Second: WORD; (*время выключения: секунды*)

uptime: SysTime64;
datetime: SystemTimeDate;
clock: CurTimeEx;
time_on:DWORD; (*время включения в секундах*)
time_of:DWORD; (*время отключения в секундах*)
current_time:DWORD; (*текущее время в секундах*)
enable: BOOL; (*разрешение на включение*)
day_light: BOOL; (*выход*)
END_VAR
VAR CONSTANT
nulldt: SystemTimeDate; (*нужна для обнуления параметров*)
END_VAR

(*получить текущее время в секундыах*)
datetime := nulldt;(*обнуляем переменные времени*)
clock(SystemTime := uptime, (*текущее время в микросекундах*)
TimeDate := datetime); (*текущее время и дата в развернутом формате*)
current_time:=(datetime.Hour * 60 + datetime.Minute) * 60 + datetime.Second; (*текущее время*)
(*----------------------------------------------------------------*)

(*для уставок собираем часы, минуты и секунды в одну кучу - в секунды*)
time_on:=(on_Hour * 60 + on_Minute) * 60 + on_Second; (*время включения*)
time_of:=(of_Hour * 60 + of_Minute) * 60 + of_Second; (*время отключения*)
(*----------------------------------------------------------------*)

(*-----------РЕШЕНИЕ ЗАДАЧИ-----------------*)
(*ВОПРОС:
Вся беда в том, что по расчётам может получиться так:
time_start=19
time_end=3 (3 часа утра следующих суток)
Тут вся логика и затыкается.
*)
(*Вот ответ на задачу*)
CASE BOOL_TO_INT(time_on <= time_of) OF
0: day_light:=enable AND NOT(current_time >= time_of AND current_time < time_on);
1: day_light:=enable AND current_time >= time_on AND current_time < time_of;
END_CASE

(*Или такой вариант
IF time_on <= time_of THEN
day_light:=enable AND current_time >= time_on AND current_time < time_of;
ELSE
day_light:=enable AND NOT(current_time >= time_of AND current_time < time_on);
END_IF
*)

Для проекта нужна библиотека SysLibTime

Спасибо! Дошло)))

IVM
12.04.2020, 19:15
а на кой тут case ?

Для солидности. ;)

Spawn
22.06.2020, 02:27
1.3 Ночь (отключаем "шумящие" приборы-помпу и компрессор, подсветка включена)
1.4 Глубокая ночь (отключаем подсветку)


Кто же на ночь в аквариуме компрессор отключает? Вы живым обитателям аквариума устраиваете газовую камеру!

Если в аквариуме имеется достаточное количество живых растений, то допускается отключение компрессора днем, тогда, когда в аквариуме есть свет и растения вырабатывают кислород. На ночь, в такой ситуации, наоборот, компрессор нужно включать, потому как при отсутствии света фотосинтез прекращается, соответственно и выработка кислорода тоже, и растения при этом сами начинают потреблять растворенный в воде кислород. При отсутствии в аквариуме живых растений, компрессор должен работать круглосуточно!

Установите себе флейту и будет Вам счастье, 2 в 1: перемешивание воды и подача воздуха, бонусом (ИМХО) успокаивающий звук воды.

Извиняюсь, что ответ не совсем в тему, но не смог "пройти мимо".