Продолжаю изучать OwenLogic.
Добрался до ПИД-регулятора.
Делаю все как в видео - https://www.youtube.com/watch?v=tPvsR0BCv6w
Но у меня ничего не работает.
Вложение 66690
Подскажите почему не получается?
Вид для печати
Продолжаю изучать OwenLogic.
Добрался до ПИД-регулятора.
Делаю все как в видео - https://www.youtube.com/watch?v=tPvsR0BCv6w
Но у меня ничего не работает.
Вложение 66690
Подскажите почему не получается?
Я делаю все по видео(гляньте, оно коротенькое), на выходе ПИД ничего не меняется что бы я не задавал на входе AI1.
Ничего не пойму... Или без подключения физики ничего не получится?
Нарисовал (фото) в принципе тоже самое, только на ПИД из библиотеки, ведет себя по другому, но тоже реакции ноль.
Я конечно понимаю что нужно коэффициенты вводить, но я пока не особо понимаю как работает ПИД.
Хотел по примерам хотя бы что-то сделать, но даже по примерам не получается.
Вложение 66699
Неа... Мне кажется это ГЛЮК... :p
Вложение 66700
С нулем в Kp вряд ли что-то увидите...
Вложение 66701
Для начала гляньте видео https://youtu.be/wxB7Yn1dZnI жалко, что продолжение не выпустили.
Чтобы глянуть ПИД в эмуляции поставьте интегральный и дифференциальный коэффициенты в ноль, а пропорциональный, ну скажем, 5, тогда на каждую разность в градус у вас по 5% будет добавляться
Вложение 66703
Огромное спасибо!
Да, причина именно в пропорциональном коэффициенте. Все равно странно, почему не получалось как на видео... :cool:
Вложение 66711
Продолжу двигаться дальше. :)
Стенд практически собрал.
Точно так. Спасибо!
Хоть что-то стало изменяться.
Вложение 66712
Только недавно закончил всю программу, все проверил, запустил, работат как надо. Но постала новая задача, хочется иметь возможность работы по графику, но с множеством периодов вкл/выкл. То есть для примера, вкл с 8 до 10 ч, с 14 до 16, с 20 до 22, в остальные периоды выкл. Или каждые 2-3 часа, но лучше задавать конкретные промежутки времени. Макрос Clock_Week вроде как подходит, но как задавать разные промежутки времени, если там только один промежуток можно задать? Или для этого нужно совсем другое? Тут даже не обязательно иметь расписание на каждый день, как в макросе Clock_Week, главное чтобы при достижении нужного времени срабатывал сценарий на вкл/выкл.
В данном случае это будет применено для вентиляции, чтобы она вкл/выкл по заданному времени. Из того что можно сделать быстрее, можно взять умное реле, которое настраивается через смартфон, там задавать нужный график вкл/выкл, и через какое-то промежуточное реле подавать 0/1 на DI пр200. Но все же хотелось бы сделать это программно, если не очень сложно.
На предыдущей странице есть подобная программа от petera, на таймерах с временем работы и паузами между ними. https://owen.ru/forum/showthread.php...&page=296#2954
Первый раз можно сделать и по макросу Clock_Week.
Когда-то в кодесис делал программу для управления освещением с включения N количества ламп в одном из K интервалов суток
Сделал функцию Scheduler_Ex, где число интервалов времени заранее не известно и может быть очень большим (в примере ограничено 100)
Расписание - массив структур
Каждая строка массива
Программа PLC_PRG может выглядеть такКод:TYPE Schedule :
STRUCT
On: TOD; (*Время включения*)
Off: TOD; (*Время выключения*)
amount: UINT; (*Количество включенных светильников*)
END_STRUCT
END_TYPE
Легко заметить, что интервалы где amount:=0(все выкл) можно не указывать.Код:PROGRAM PLC_PRG
VAR RETAIN PERSISTENT
Shedule1:ARRAY[0..7] OF Schedule:=
(On:=TOD#00:00, Off:=TOD#01:30, amount:=1),
(On:=TOD#02:00, Off:=TOD#03:30, amount:=2),
(On:=TOD#04:00, Off:=TOD#05:30, amount:=3),
(On:=TOD#06:00, Off:=TOD#07:30, amount:=1),
(On:=TOD#08:00, Off:=TOD#09:30, amount:=2),
(On:=TOD#10:00, Off:=TOD#12:00, amount:=3),
(On:=TOD#16:00, Off:=TOD#18:00, amount:=2),
(On:=TOD#20:00, Off:=TOD#22:00, amount:=1);
END_VAR
VAR
Lamp1: BOOL;
Lamp2: BOOL;
Lamp3: BOOL;
amount: UINT; (*Количество включеных светильников*)
END_VAR
amount:=Scheduler_Ex(pt_Shedule:=ADR(Shedule1) , size:=SIZEOF(Shedule1) );
CASE amount OF
0: Lamp1:=FALSE; Lamp2:=FALSE; Lamp3:=FALSE;
1: Lamp1:=TRUE; Lamp2:=FALSE; Lamp3:=FALSE;
2: Lamp1:=TRUE; Lamp2:=TRUE; Lamp3:=FALSE;
3: Lamp1:=TRUE; Lamp2:=TRUE; Lamp3:=TRUE;
END_CASE
Универсальность в том, что очень просто добавлять интервалы или менять в расписании кол.включеных ламп, не меняя при этом самой программы.
В будущем очень просто будет изменить общее количество ламп.
Код функции Scheduler, с моим любимым способом поиска попадания в заданный диапазон методом деления интервала пополам
Scheduler_Ex:
Жалко, что в ОЛ нельзя работать с указателями.
Функцию можно адаптировать для ОЛ, но с конечным, заданным числом интервалов в расписании.
вот можно переделать под себя https://owen.ru/forum/showthread.php...l=1#post358595
Вот вариант с суточным расписанием из макс. 10 интервалов включенного состояния
В начале некоторые соглашения
Время включения и время выключения для каждого интервала будем задавать с экрана ПР в виде целых чисел типа
1235 для времени 12:35
1841 для времени 18:41
это упростит задачу ввода с экрана ПР
Вложение 66738
Да и количество переменных для расписания будет меньше
Вложение 66739
Включением выключением будет заниматься функция на ST
Вложение 66740Код:function Scheduler: bool; // Интервальный суточный таймер
//(c) Petera для форума ОВЕН
var_input //объявление входных переменных
Enbl: bool; //Разрешение работы функции
curHH: udint; //Текущее время - часы
curMM: udint; //Текущее время - минуты
//Далее расписание только интервалы включенного состояния
//Формат времени вкл/выкл в виде 1230 - для 12:30 чч:мм
TODon1: udint;
TODoff1: udint;
TODon2: udint;
TODoff2: udint;
TODon3: udint;
TODoff3: udint;
TODon4: udint;
TODoff4: udint;
TODon5: udint;
TODoff5: udint;
TODon6: udint;
TODoff6: udint;
TODon7: udint;
TODoff7: udint;
TODon8: udint;
TODoff8: udint;
TODon9: udint;
TODoff9: udint;
TODon10: udint;
TODoff10: udint;
end_var
var //объявление локальных переменных
Schedule: array [0..9] of udint; // Для упакованного расписание
curTOD: udint; //текущее время в виде 1230 - для 12:30 чч:мм
i: udint;
tmp_on: udint;
tmp_off: udint;
end_var
if not Enbl then Scheduler := false;
else
curTOD := curHH * 100 + curMM; //текущее время в виде 1230 - для 12:30 чч:мм
//Т.к. двухмерные массивы не поддерживаются
//упаковываем интервалы в одномерный массив
//получаем формат времени вкл - выкл в виде 12301445 - для вкл в 12:30 и выкл в 14:45
Schedule[0] :=TODon1 *10000 + TODoff1;
Schedule[1] :=TODon2 *10000 + TODoff2;
Schedule[2] :=TODon3 *10000 + TODoff3;
Schedule[3] :=TODon4 *10000 + TODoff4;
Schedule[4] :=TODon5 *10000 + TODoff5;
Schedule[5] :=TODon6 *10000 + TODoff6;
Schedule[6] :=TODon7 *10000 + TODoff7;
Schedule[7] :=TODon8 *10000 + TODoff8;
Schedule[8] :=TODon9 *10000 + TODoff9;
Schedule[9] :=TODon10 *10000 + TODoff10;
Scheduler := false;
//ищем попадание текущего времени в интервалы расписания
for i := 0 to 9 do
tmp_on := Schedule[i] / 10000;
tmp_off := Schedule[i] mod 10000;
if tmp_on < tmp_off then
if curTOD >= tmp_on and curTOD < tmp_off then // исправил curTOD <= tmp_of на curTOD < tmp_of. Иначе выключалось на 1 мин. позже
Scheduler := true;
exit;
end_if
end_if
end_for
end_if
end_function
Как видно - интервалы могут быть не отсортированными, т.е. с экрана можно вводить или редактировать в любом порядке
даже могут быть задействованы не все 10.
В процессе работы для исключения интервала из работы можно просто сделать начало = концу или сделать начало = конец = 0
ЗЫ.
Количество интервалов можно увеличить добавляя необходимое кол. входных переменных TODon и TODoff и добавив шагов в цикл for i := 0 to 9
ЗЫ.
Исправил строку
if curTOD >= tmp_on and curTOD <= tmp_off then
на
if curTOD >= tmp_on and curTOD < tmp_off then
Всем спасибо, буду смотреть.
Ребят кто то сталкивался с проблемой опроса трм 32 в пр200 . Проблема такая , вынул измеренное значение темп гвс - все хорошо , вынул уставку гвс ( только чтение 716 регистр ) - все хорошо .Но когда пытаюсь добавить регистр записи уставки гвс ( 10 регистр ) на холст в owen logic , то трм 32 становится не кликабельной ( что не нажмешь на ней , всегда возвращается в u-11 параметр как раз это 10 регистр ) . Убираю регистр с холста , все сразу нормально . Никак не могу вынуть эту переменную с овенклауд чтобы не было такой проблемы , хотя все работает запись и чтение с овенклауда . уже сломал всю голову . может кто поможет ?
Добрый день!
Напишите, пожалуйста, на support@owen.ru. Приложите Ваш проект Owen Logic и заводской номер ТРМ32.
Добрый день. Как-то не очень точно работает функция "Scheduler", включение по расписанию включается почно по времени, а выключение по расписанию почему-то спустя 1 минуту:
Вложение 66838
Вложение 66839
Вложение 66840
Хотя должно выключаться точно по указанному времени, может я где-то ошибся?
прислал вам 2 дня назад ...
P.S.
Имеется пр200 и трм32 щ7 и передача данных через пе210 в owencloud .
Нужно изменять данные в трм32 удаленно , все сделал всё читается и записывается , но с есть проблема , в трм32 нельзя в программировании листать и толком лазить по настройкам , всегда возвращается к одному параметру как будто идет вечная запись настроек с овенклауда .
Не знаю как обьяснить , приложу видео и тестовый проект ( кусок из основного проекта )
Задумался над реализацией нажатия только одной кнопки из 10-ти.
Если нажато более одной любой клавиши, на выходе 0, при нажатии только одной, любой клавиши, на выходе 1.
Реализовал, все работает, но мне кажется, что я сделал через заднее место.
Пробовал через логические операторы, не смог осилить мозгом.
Пробовал через двоичную систему, получается громоздко.
Хочу услышать рекомендации, правильным путем пошел или нет?
Вложение 66961
ProRus тут больше вопрос зачем это если на выходе при любой кнопке 1-ца?
petera это понятно, что при любой ОДНОЙ, но зачем? или еще будет код проверки какая кнопка нажата и что она нажата одна (этот код) и тогда выполняем какое-то действие?
Например вот так Вложение 66965
Это Вы проходной выключатель сделали включения из 10 мест, автор совсем не такой алгоритм хотел, насколько его понимаю!
Мой вариант:
Вложение 66966
Вложение 66967
Даже так, попроще:
Вложение 66972
Вложение 66973
И, совсем забыл сказать: легко расширяется до 32 входов, в смысле, просто добавить на входе второй макрос вставки(записи) бит, макрос с расширением(имеется специальный вход) и настройками(в свойствах макроса), короче, даже дополнительных макросов не потребуется!
Это не работает, чтобы ТОЛЬКО при любой ОДНОЙ кнопке, а не при двух, трех и т.д.
ЗЫ.
Семь включенных
Вложение 66968
Пять включенных
Вложение 66969
Еще могу комбинаций добавить...
Берете любой сумматор бит и немного допиливаете.
Этот - до 32 бит:
Вложение 66971
Спасибо! Тоже интересное решение.
Понял, что я в принципе сделал более менее нормально (решил оставить так).
Благодаря вашему примеру стало ясно, что SEL в принципе лишняя и ее можно удалить.
Вложение 67005
Какие программы можно использовать для анализа того куда, на какие сервера (сайты) обращается и передает данные приложение?
MAX12360 WireShark
Доброго всем дня! Имеется ПР200 в режиме мастера, к ней подключено 8 ПР200 в слейве и 8 китайских релейных модуля Modbus. Всего 16 устройств. У меня вопрос - можно ли как-то программно реализовать блокировку опроса устройства, которое по какой-либо причине отвалилось и не отвечает на запросы мастера, чтобы не увеличивалось время опроса других устройств? Что-то не могу пока придумать как это сделать...
Можно попробовать оперировать переменными Статуса и Опроса - если Статус "в обрыве", то переменная Опрос начинает включаться периодически, чтобы проверить, не появилась ли связь (перешёл ли Статус в норму). При Статусе "в норме" то переменная Опрос включена постоянно.
Не знаю, правда, отключает ли переменная Опрос функции записи.