Просмотр полной версии : Контролируем аквариум на ПЛК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:
Как правильно сделать таймер начала программы с заданием времени запуска цикла?
Полезности все перерыл. Ничего подходящего не нашел.
Ваша цель изучить кодесис или управлять аквариумом ?"
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
таким же образом делать часы .
Да , значения секунд , мин , час - ретайн.
Это самый удобный способ.
можно и так
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 - Лох .
тут и ИП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
КАК это делается? Пытаюсь прикрутить по примеру датчик температуры, но компилятор ругается на эти идентификаторы.В программе-примере они в конфигурации устройства прописаны, а я у себя не могу такое сделать.
А вы не заметили разницу в приведённых примерах? Вы забыли присвоить своим переменным имена.
11479
КАК это делается? Пытаюсь прикрутить по примеру датчик температуры, но компилятор ругается на эти идентификаторы.В программе-примере они в конфигурации устройства прописаны, а я у себя не могу такое сделать.
11480
Нажать на картинку для просмотра анимации.
Только если имена переменным задаете в конфигурации, то не должны их определять в в разделе объявления переменных в программе!
tanatholog
21.01.2014, 12:38
Вот я недалекий =)))
Я полностью на строку нажимал, и конечно же ничего не получалось.
Пока отвечали я все это в глобальные переменные вписал. Тоже все работает.
tanatholog
21.01.2014, 15:07
11480
Нажать на картинку для просмотра анимации.
Только если имена переменным задаете в конфигурации, то не должны их определять в в разделе объявления переменных в программе!
Вот таким людям благодарность надо объявлять!
Все четко и понятно. На все вопросы сопливого новичка ответил.
tanatholog
22.01.2014, 10:22
Последний вопрос:
Как запрограммировать кнопку "пуск/стоп" на запуск программы?
На все вопросы сопливого новичка ответил.
--- а что - наличие соплей не позволяет пройти курсы обучения по КоДеСис или почитать литературу?
tanatholog
22.01.2014, 10:58
А наличие клавиатуры подразумевает написание не относящихся к теме топиков?
Литературу читаю, но охватить все в сжатые сроки нереально.
На данный момент в изучении работа с вводом/выводом.
На диске есть пример работы с клавиатурой
tanatholog
23.01.2014, 19:57
Крик души!
Дайте код, чтобы при нажатии клавиши "пуск/стоп" на выходе блока, допустим rezh1 выдавалось значение 31,32,33,34 по круговой. А в случае, если на клавишу не нажимали 2 секунды, то 0.
В чем только не пробовал рисовать. То клавиша не нажимается, то цикл не слушается.
Крик души!
Дайте код, чтобы при нажатии клавиши "пуск/стоп" на выходе блока, допустим rezh1 выдавалось значение 31,32,33,34 по круговой. А в случае, если на клавишу не нажимали 2 секунды, то 0.
В чем только не пробовал рисовать. То клавиша не нажимается, то цикл не слушается.
пробуйте, если что то не так, извиняйте, таково ТЗ значит было
Крик души!
Дайте код, чтобы при нажатии клавиши "пуск/стоп" на выходе блока, допустим 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
Как-то так сделать?
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, то наоборот и нажатие кнопки хоть и проходит, но не запускает чертов таймер на выдержку. То получалось, что помпа отключалась при нажатии, но на подхват не вставала при отпускании кнопки и таймер опять таки
не запускался.
Помогите!
Все равно плохо у меня в понимании таймеров.
Не получается сформировать вот такой блок:
IN1-кнопка на дискретном входе (настроить её работу получилось);
IN2:BOOL-вход, на который приходит разрешение на включение помпы по расписанию;
Q1:BOOL-выход, который подключен к питанию помпы.
Надо реализовать кормление. Смысл такой:
Q1 повторяет работу IN2 (получается, что помпа работает по расписанию)
При нажатии на IN1 выход Q1=false (отключается помпа) на 5 минут, после чего Q1 опять повторяет вход IN2.
У меня то Q1 всегда FALSE, то наоборот и нажатие кнопки хоть и проходит, но не запускает чертов таймер на выдержку. То получалось, что помпа отключалась при нажатии, но на подхват не вставала при отпускании кнопки и таймер опять таки
не запускался.
Помогите!
Так ни кто не сможет найти ошибку в Вашей программе,
выкладывать нужно хотя бы фрагмент кода.
tanatholog
27.01.2014, 07:15
Так ни кто не сможет найти ошибку в Вашей программе,
выкладывать нужно хотя бы фрагмент кода.
Извиняюсь, поторопился и не вставил код...
Вечером выложу.
Если я правильно понял вход 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 часа утра следующих суток)
Тут вся логика и затыкается.
Подскажите, что можно сделать?
Программировать!
Варианта минимум 2:
1. RS триггер, если считать, что ПЛК работает круглосуточно всегда.
2. Ещё одно условие на сравнение времени начала и окончания с обработкой перехода через 0.
Простейшая школьная задачка.
tanatholog
12.04.2020, 10:12
Программировать!
Простейшая школьная задачка.
Вместо пафоса можете привести пример решения простейшей школьной задачки?
Оживлю свою старую тему.
Решил переписать свою программу управления злополучным аквариумом. Основной критерий: суточное переключение света, газа, воздуха. Режимы, в общем.
Привязано все к реальному времени. И в этом проблема.
Захотел я сделать так, чтобы в уставках вводилась основная информация: время запуска основного света и продолжительность, а остальной суточный режим пересчитывался сам. Добился, чтобы все переменные были в диапазоне 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 из времени выключения? Я правильно понимаю?
В случае с 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
Спасибо! Дошло)))
а на кой тут case ?
Для солидности. ;)
1.3 Ночь (отключаем "шумящие" приборы-помпу и компрессор, подсветка включена)
1.4 Глубокая ночь (отключаем подсветку)
Кто же на ночь в аквариуме компрессор отключает? Вы живым обитателям аквариума устраиваете газовую камеру!
Если в аквариуме имеется достаточное количество живых растений, то допускается отключение компрессора днем, тогда, когда в аквариуме есть свет и растения вырабатывают кислород. На ночь, в такой ситуации, наоборот, компрессор нужно включать, потому как при отсутствии света фотосинтез прекращается, соответственно и выработка кислорода тоже, и растения при этом сами начинают потреблять растворенный в воде кислород. При отсутствии в аквариуме живых растений, компрессор должен работать круглосуточно!
Установите себе флейту и будет Вам счастье, 2 в 1: перемешивание воды и подача воздуха, бонусом (ИМХО) успокаивающий звук воды.
Извиняюсь, что ответ не совсем в тему, но не смог "пройти мимо".
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot