Что-то ни одна ссылка не работает...У меня, или проблемы у всех???
Вид для печати
Что-то ни одна ссылка не работает...У меня, или проблемы у всех???
Наконец, довел большинство своих макросов до стабильной версии.
Буду потихоньку выкладывать наиболее полезные.
Первым идет макрос определения времени программного цикла "dt".
Используется в фильтрах, регуляторах и прочих алгоритмах реального времени.
Макрос и описание к нему во вложении. Исходный файл описания либо файл изображения могу дам по запросу (если например, оное будет полезно для добавления этого макроса в онлайн-библиотеку).
В будущем выложу свои фильтры (скользящая средняя, адаптивная скользящая средняя) и свою реализацию ПИД, а то я часто всем советую делать рукописный ПИД, но ни разу не выложил ту его версию, что я считаю правильной=)
А зачем считать dt , а не использовать сам цикл ПР?
Сам цикл ПР меняется от сложности программы ,но постоянен для данного проекта .То есть цикл ПР является минимальным квантом времени ,меньше его вычислять нет смысла ,а больше -не та будет точность .Ибо дельта Т должна стремится к нулю в идеале , в ПР к времени цикла ...
Я же говорю ,что его можно вообще не вычислять ,а применять . Например ,возьмите ADD на один вход подайте значение ,а второй вход соедините с его же выходом - получите интегратор ,с квантом времени -цикл ПР.
Представьте, что нам нужно компенсировать инерцию датчика, которая составляет 1 секунду. По началу у нас 1000 циклов в секунду, мы пишем t_ист=t_показ+dt*1000 и идем дальше.
По началу это работает, но по мере усложнения программы цикл внезапно становится равен 2 миллисекундам. И наш алгоритм начинает перерегулировать. Если не знать эту тонкость, можно долго не понимать, что происходит, почему при удалении одного элемента все работает, а при добавлении любого нового начинается перерегулирование)
Вот для борьбы с этим и будет полезно автоматическое вычисление dt. В будущем когда программа устаканится, вы всегда можете заменить макрос dt на константу с определенным известным вам значением.
Итак, второй макрос от меня - фильтр "скользящая средняя".
Предвещая вопрос "зачем, если есть встроенная фильтрация входов, которую можно задать в настройках".
1) режим плавного пуска обеспечивает нечувствительность начального состояния фильтра к случайно оказавшемуся на входе значению в момент запуска программы.
2) возможность инициализации в любой момент.
3) фильтр второго порядка (пользователь может при желании построить по аналогии фильтр высших порядков)
4) возможность задать время усреднения из другого алгоритма (алгоритмы адаптивной фильтрации).
5) возможность фильтровать не само значение входа, а значение вычисленное из него.
PS по непонятной мне причине невозможно загрузить в один проект макрос фильтра первого и второго порядка вместе, они созданы один из другого и ОЛ считает их одинаковыми несмотря на разное название)
anthrwpos макросы идентифицируются по ID, откройте один, сделайте сохранить как, и потом его экспортируйте, должно помочь.
Благодарю, поправил во вложении.
Макрос скользящей средней MAVG ревизия 2
Список изменений.
улучшена точность работы: добавлена компенсация потери точности из-за использования в Owen Logic числа с плавающей точкой одинарной точности.
В макросе скользящей средней второго порядка добавлен вывод, дающий первую производную фильтруемой величины без потери точности.
Добавлен макрос скользящей средней третьего порядка с выводами, дающими первую и вторую производную.
«обратная времени фильтра α» заменена на непосредственно время фильтрации.
Добавлена защита от попадания нуля в вывод dt.
Название вывода INIT заменено на ENABLE, чтобы предотвратить путаницу.
Макрос позволяет коммутировать входа с выходами в любой комбинации, с экрана или по сети.
Вложение 31363
Да сложнее трудно придумать, если вообще возможно! Много раз выкладывал проекты с макросами на 32 входа-выхода вставки-чтения бита, выведите на вход значение(0-31) читаемого бита и получится тоже самое что Вы хотите, только в десятки раз проще!
Макросы можно посмотреть здесь: http://www.owen.ru/forum/showthread.php?t=26806
Так Вы же написали, любой выход коммутирует с любым входом, что тут может быть непонятным(так правильнее, чем наоборот, т. к. на выходе не может быть значения сразу с двух входов)?!
А насчет макросов, так средняя часть, где всё сохраняется, запоминается и не понадобится в нашем случае, в макросах проекта есть отдельные макросы для вставки-чтения бита!
Вот посмотрите.Вложение 31365
Можно через элемент или.Цитата:
Так Вы же написали, любой выход коммутирует с любым входом, что тут может быть непонятным(так правильнее, чем наоборот, т. к. на выходе не может быть значения сразу с двух входов)?!
Так если всё так просто, сделайте ваш вариант коммутатора.Цитата:
А насчет макросов, так средняя часть, где всё сохраняется, запоминается и не понадобится в нашем случае, в макросах проекта есть отдельные макросы для вставки-чтения бита!
Вот посмотрите:
Вложение 31366
Вложение 31367
Извиняюсь, мне казалось, это очень просто, что и объяснять не надо, пришлось делать на планшете(неудобно)!
Не знаю во сколько раз проще получилось, наверно минимум раз в 10!!!
Я же возрастные ограничения не выставляю! Обидно даже, выкладываю, выкладываю, никто не смотрит!!!
Если серьёзно, мне кажется подобный макрос сильно искусственно ограниченным, гораздо лучше, на мой взгляд, при любой возможной входной комбинации(всего 256) иметь возможность любой выходной комбинации(тоже всего 256), я уже делал подобное ПЗУ, не знаю нужны такие с оперативным изменением комбинаций(некоторые жаловались на сложность программирования комбинаций), надеюсь, теперь сами сделаете, если начнёте делать и не будет получаться скажите, я теперь сильно вооружён нормальным компом! Или хотя бы как более простой и легко осуществимый вариант(типа промежуточного решения) на вход каждого SEL(выбор входа для выхода) подавать не 1-8, а 0-255(в зависимости от каких входов он срабатывает: 1 - от первого, 2 - от второго, 4 - от третьего и т. д. 3 - от первого и второго, 5 - от первого и третьего, 6 - от второго и третьего, 7 - от первого, второго и третьего и т. д.), для любой входной комбинации, что Вы об этом думаете?
Несколько расширил возможности коммутатора, точнее не стал их ограничивать, т. е. жёстко прописывать куда писать сигнал со входов, теперь и это можно назначать в диапазоне 0-31, если значения разряда куда пишется бит(SELIN) и значения разряда откуда читается бит(SELQ) совпадают(равны), то соответствующие вход и выход будут с коммутированы! Как-то так:
Вложение 31392
Вложение 31393
Может такВложение 31401лучше (удобней) будет?
А я мучился, не знал где его приспособить, здесь Вам и первого варианта достаточно(там прописаны значения соответственно номерам входов 1-8), тут вариант нужен где эти значения меняются и ещё чуть не забыл нельзя на двух и более SELIN выставлять одинаковые значения, только разные в пределах 0-31, два бита в одно место не поместятся, а вот на SELQ можно выставлять одинаковые значения, можно читать один бит сразу на несколько выходов, короче молодцы!!! Я думаю, что для большинства применений достаточно и первого варианта, второй применяйте очень осторожно и когда первого уже не хватает!
Вложение 31406
Приветствую Сергей.
Это я попросил Василия в помощи создания коммутатора.
Применение: коммутация клапанов загрузки сырья на термопласт автоматах.
Есть 8 ТПА (изготовление ПЭТ преформы "мензурки для будущих ПЭТ бутылок", к каждой ТПА подключен 1 клапан с дозировкой 2х видов сырья в 1 бункер (чистый ПЭТ и вторяк)
Так как производители ПЭТ разные то приходится ходить в зону загрузки и постоянно переподключать клапана. Т.е каждая ТПА может работать на разных клапанах, в зависимости от марки сырья. Естественно в работе все 8 ТПА.
С помощью вашего коммутатора, оператор может сам настроить с каким клапаном данная ТПА будет работать а при выходе из строя клапана (заклинил) подключить параллельно или назначить другой. Это очень удобно.
Единственно что мне осталось сделать, это к Скада переменным (сетевым RS485) "Уставки таймера" и "Задатчик выходов" прикрутить к RETAIN переменным, чтоб при аварийном отключении электроэнергии, заново не настраивать коммутатор.
Еще ваш коммутатор можно применить так же в работе ТПА в блоке многоканального терморегулятора. У нас стоят терморегуляторы на 63 зоны в прессформе, правда на базе ПиСи 98года. Тут ваш коммутатор (макрос) может использоваться в регулировки зон нагрева по соседнему датчику температуры, при выходе из строя штатного.
Единственное что придется логику переносить на ПЛК с написанием на ST или CFC.
Да еще много где можно применить.
Вот что я напилил ночью :)
Вот несколько модернизировал(ещё больше разинтегрировал) коммутатор, как мне кажется более подходящий под Ваши задачи:
Вложение 31409
Если это возможно, я бы битовой маской передавал!
На всякий случай (если мой пример брать) .
Задача: К входу I7, подключить выход Q8.
Активируем нужный вход (I7) . Задаем номер входа в параметре задачи выхода (lq8)-задаем 7. Активируется Q8.
Все остальные функции сохраняются, зачем Вам лишних 8 входов, наверно повторюсь, второй вариант для вас избыточен, первого с избытком хватает! Вы лучше попробуйте, затем поспорим, если что не так!!!
Вот поправился:
Вложение 31411
А то не будет учитывать в битовой маске сигналы на переменных f1-f8!
Ну и 7 констант я бы убрал, оставил только одну "1000"
Вложение 31415
Я бы как-то так сделал:
Вложение 31416
А на биты(1-8) в скаде разбил или в OPC!
Да , забыл сказать, если воспользуйтесь, не забудьте удалить лишние сетевые переменные(что появятся), у меня не получается это сделать, градом сыпется масса ошибок!
Скачал выложенный в теме проект и всё(лишние сетевые переменные) без проблем удалились, проект обновил!
Спасибо, лишнее (y1-8) удалил. В симуляторе работает. А как быть с RETAIN для таймеров и уставки выхода не подскажите? В принципе это думаю не сильно критично, если что можно и руками забить.
Ну вообще-то сетевые переменные по умолчанию энергонезависимые, я лично если честно проблему не вижу(не понимаю)! Если не понимаю объясните! Что при выключении ПР и последующим включением сетевые переменные не сохраняются???
Какое у вас максимальное время выдержки? Если не более 2 часов 16 минут я бы передавал все уставки времени одной переменной, 3 старших бита которой использовал для синхронизации, а с настройкой выходов(с каким входом коммутируется) ну это просто напрашивается сделать, получится всего 3 переменные, правда усложнит программу ПР и скада должна такое поддерживать! Я в какой-то теме уже выкладывал подобное с целью экономии сетевых переменных!
http://www.owen.ru/forum/showthread.php?t=23807&page=5