Усреднитель "скользящим окном"Вложение 26449
Необходимое значение циклов усреднения вводим в константу (кол-во циклов в 2 раза больше введённого)
Вид для печати
Усреднитель "скользящим окном"Вложение 26449
Необходимое значение циклов усреднения вводим в константу (кол-во циклов в 2 раза больше введённого)
3 регистра :
1- накопление (согласно установленному к-ву тактов накопления)
2- хранение
3 - списывание равными частями, кратными к-ву тактов накопления. (из-за особенности построения алгоритм "сглаживает" пиковые значения - если в одном такте пришло значение 900 а в следующем - 100, (при к-ве тактов=2) то списаны они будут равными частями по 500).
Поговорим ещё раз об экспоненциальном сглаживании?
2 умножения, одно сложение, и глубина окна легко настраивается
http://www.owen.ru/forum/showthread....l=1#post201368
Займитесь, если вам нетрудно. Только ширина "окна" должна настраиваться при необходимости.
Рекуррентные методы сглаживания для целочисленных теряют точность. Метод с конвейерным хранением предистории последних выборок с переменным временем выборки дает и точность, и возможность измерять скорость изменения сигнала. Непонятно зачем на относительно большую глубину времени обрабатывать часто, "скользящим окном".
я вам больше скажу - метод со "скользящим окном", где самый старый элемент удаляется не "лично", а "равными долями" - это и есть метод с экспоненциальным сглаживанием.
только вещественная точка искусственно сдвинута (напр. если n=4, то на два двоичных разряда, если n=10, то а 1 десятичный)
PS есть мысль сделать сделать сей алгоритм, смоделировав плавающую точку, но использовать только целочисленную арифметику.
(что-то подобное я уже делал в макросе вычисления квадратного корня в 11году..)
в прогах для форекса много вариантов всяких сглаживающих и во вполне понятных исходниках
Хочу сказать СПАСИБО разработчикам owen logic. Думал будет все намного сложнее :rolleyes:
сделал проект с нуля (впервые установил ПО) на ~100DI/50DO/4AI за 1 неделю и не проклял мир.
СПАСИБО разработчики!
Хотел спросить:
1.На чем написан лоджик?
2.Планируется ли сделать менеджер макросов? (насколько я понимаю, все макросы хранятся в самом проекте, что затрудняет переиспользование макросов: только через импорт/экспорт)
Василий Кашуба http://www.owen.ru/forum/showthread....l=1#post220721 - Не работает с отрицательными числами похоже это Усреднение....
Замените элементы макросов и поставьте для значений с плавающей запятой, там же всё очень просто и понятно!
Вложение 26507
Вместо SEL - FSEL и т. д.
Спасибо, так и поступил.
Вспомнил слова rovki о том, что все должно быть прекрасно. В смысле если уж макрос оперирует с плавающей точкой, так как бы должен это делать всегда с плавающей точкой....
Удивился, что нет округлялки значений с плавающей точкой, может плохо искал и уже было ?
получилось вот такая ерунда, проверьте правильно ли работает ?
Если отбрасываемая цифра больше 5 то увеличивает на 1
Если отбрасываемая 5, а оставляемая четная, то не меняет последнюю, если нечетная то увеличивает.
Правда не городил огород с проверкой наличия цифр после 5-ки
Упрощенный вариант fRounde, соответствует округлению в Exel (без 3-его правила, см. ниже описание), подсмотрел у AI! как получать 1 и -1 :)
Вынужден с Вами не согласиться, только совсем недавно обсуждали, по моему вроде как разрулили или что не устраивает?
http://www.owen.ru/forum/showthread.php?t=9398&page=263
Вложение 26521
Сергей0308 не видел его, только не понял, где там округление до 2-х знаков после запятой ?
Получить хотел вот это, но в выложенном варианте немного ошибся...
Первое правило
Если первая из отделяемых цифр больше, чем число 5, то последняя из оставляемых цифр усиливается, иначе говоря, увеличивается на единицу. Усиление так же предполагается и тогда, когда первая из убираемых цифр равна 5, а за ней имеется одна или некоторое количество значащих цифр.
Число 25,863 округлённо записывается как – 25,9. В данном случае цифра 8 будет усилена до 9, так как первая отсекаемая цифра 6, больше чем 5.
Число 45,254 округлённо записывается как – 45,3. Здесь цифра 2 будет усилена до 3, так как первая отсекаемая цифра равна 5, а за ней следует значащая цифра 1.
Второе правило
В случае если первая из отсекаемых цифр меньше чем 5, то усиления не производится.
Число 46,48 округлённо записывается как – 46. Число 46 наиболее близко к округляемому числу, чем 47.
Третье правило
Если отсекается цифра 5, а за ней не имеется значащих цифр, то округление выполняется на ближайшее четное число, другими словами, последняя оставляемая цифра остаётся неизменной, если она четная, и усиливается в случае, если она нечетная.
Число 0,0465 округлённо записывается как – 0,046. В данном случае усиления не делается, так как последняя оставляемая цифра 6 является чётной.
Число 0,935 округлённо записывается как – 0,94. Последняя оставляемая цифра 3 усиливается, так как она является нечётной.
Ну и с минусами у меня тоже проблема :)
Обновил макрос. Округление вверх с учетом 3-его правила и отрицательных чисел.
Так это же проще пареной репы, что бы округлить до n знаков, после запятой, попробуйте число предварительно умножить, а после округления разделить на 10 в n-ой степени!
Можно и все ваши другие хотелки реализовать, но Вам наверно потребуется признак чётности-нечётности числа, по моему, если на 2 делится без остатка, значит 100% чётное, наверно есть варианты!
Вложение 26549
Второй вход, для задания количества знаков после запятой!
Добавил последние макросы в общий перечень первого сообщения, в группу аналоговые преобразования. Спасибо всем за участие.
При добавлении в проект сразу двух макросов, OL считает что такой макрос уже в проекте есть, хоть он и имеет другое имя, и не добавляет его, чтобы этого не происходило сохраняйте макрос через "Сохранить как новый макрос", тогда будет сгенерирован новый id, и макросы будут считаться разными.
Извиняюсь, обновил вложение на архив. Теперь там оба макроса, простой и расширенный с 3-им правилом (его чуть подкорректировал, убрал лишние элементы за счет упрощения проверки)
Теперь можно загружать в проект оба Округлятора, простой и Ex - расширенный
Да, я с утра понял, что OL их по ID определяет, поэтому подправил.
Оба макроса с округлением вверх, по крайней мере округляет как Exel без явного указания как это делать.
Ревака Юрий , ссылку на файлик тогда подправите по возможности.
Ссылку исправил!
Наверное было нефик делать, раз сделал такое. Не знаю, было или не было. AND, OR, XOR для целочисленных значений до 32-х бит.
Работает в цикле, так что сильно не пинайте. Это скорее для вялотекущих процессов. На выходе держится предыдущее значение до конца цикла, количества указанных бит.
Изменение значения или битности перезапускает рассчет.
Начинал делать на простых Extract, Putbit но что-то показалось, что для 32-х бит такая простыня в макросе окажется, что решил сделать как сделал.
Аха-ха, не, не расстроили, чета я тормознул, что они меняют свои входа когда к ним подключаются int-ами :)
В любом случае зарядка для мозгов :)Вложение 26561
а я помнил, да забыл, сейчас глянул в справку и точно :)))
Кстати не хватает ROR и ROL может быть кто-то делал, не помню...
Точно кто-то делал, нашел у себя в архивах... только не хватает именно таких, как SHL, SHR в самом ПО
Чтобы импульсы не подавать и т.д.
В общем можно удалить этот велосипед с and, or, xor
Вроде как просили, даже переборщил малёк с "бесконечной длиной стека"(пока сброс не нажмёшь), или что не так?
Вложение 26593
Вот поправил со стеком длиной 1000:
Вложение 26597
Вложение 26601
Вложение 26602
Я всю свою речь веду к тому, неужели нельзя проще придумать, чем у Вас:
Вложение 26595
Лично я, глядя на подобные конструкции начинаю выяснять, не проще ли на абаке посчитать!
Сергей0308 Вы макрос "сумматор" откройте. И программу приложите.
И всё зависит от того, для какой цели применяете.
И чего непонятно?Цитата:
Лично я, глядя на подобные конструкции начинаю выяснять, не проще ли на абаке посчитать!
Для тех целей, для которых макрос писался-самое то.
"феликса" возьмите, зачем так сразу в древний мир? ;)Цитата:
абак
Вложение 26668
Вот проект, работает так: опрашивает аналоговый вход 100 раз в секунду, значения первых 1000 измерений суммируются и делятся на количество измерений(1000), затем каждый раз к сумме добавляется новое значение измерения и списывается значение равное сумме всех значений, делённое на 1000(количество измерений), тоесть как Вы написали равными частями, можно глубину вложения хоть миллион сделать, может быть упростит вашу каракатицу и за ПНР можно быть спокойным! Позже деление на 1000 перенёс с выхода на вход, так как: a/c + b/c = (a+b)/c и добавил функцию сохранения текущего значения на выходе при сбросе(например изменения глубины вложения), на время достижения этой глубины!
Вложение 26669
Да, название неправильное, щёлкнул на имевшимся файле и добавил несколько цифр, чтобы не затереть его(для себя сохранял, но попросили выложить), исправлю! Просили списывать равными частями, а в этом случае стек избыточен и достаточно всё в кучу суммировать! Хотя со стеком считаю "правильней", но иногда "правильность" страдает из-за простоты!
Сижу ломаю голову, светлых мыслей нет ваще.
Суть, есть обычные гаражные роллеты с кнопочкой и приводом. Нажали, роллета поехала вверх, нажали - остановилась, нажали еще раз - поехала вниз.
Физически могу поставить только одну релюшку на открытое состояние, больше на ПР нет свободных входов, но возможно когда-то добавятся.
Нужно - по команде (сухой контакт параллельно кнопке) запускать на открытие, при этом мы не знаем, куда поедет роллета. Дождаться сработки концевика и остановиться. Если не дождались, подать импульс на открытие еще раз, дождаться сработки концевика и заблокироваться в данном положении.
сигнала с концевика открытого состояния пока не будет и появится непонятно когда. Но когда появится, сигнал на закрытие должен так же реагировать как и на открытие.
Собственно как организовать двойной импульс при отсутствии сигнала от концевика и как заблокировать дальнейшие попытки что-то делать ? так как потом роллетой могут и руками управлять...
Что-то фигня какая-то получается...
Не хватает выходов используйте блютуз\вайфай реле ;) https://youtu.be/AQ2do_6KrwA
Если физически сделать так что при выключенном выходе ПР роллеты закрыты. То на выход ПР сажаем простое реле с перекидным контактом. Подал питание на реле с выхода ПР -сигнал на открытие. Снял питание с выхода ПР сигнал на закрытие.
игорь68 так физически сделать нельзя, кнопкой необходимо управлять и в ручном режиме без ПР.
Сделать обратную связь от кнопки можно, добавив транзисторный ключ, залезть в схему управления роллеты для согласования с напряжением ПР но нет входов. Даже на концевик закрытого состояния сейчас входа нет.
rovki нет такой возможности...
А если программно считать положение роллеты, я такой алгоритм пробую реализовать в макросе КЗР. Но надо быть уверенным что время закрытия/открытия ~одинаково в каждом цикле, хотя если будет один концевик, то можно делать принудительную установку "0", т.е. ошибка не будет накапливаться.
Сергей0308
1) "Скользящее окно" в вашей программе не обнаружено. Есть накопление определённого к-ва импульсов с последующим выводом.
2) Зачем нужен вход сброса?
3) Тактирование должно быть привязано к источнику сигнала - тактам ПИД-регулятора, например. Или иному внешнему подсчёту, т.к. измеряем технологическую величину, а не диаметр сферического коня в вакууме.
Посмотрите как работает обычное скользящее окно на 10 элементов.
Ревака Юрий да нельзя там программно считать положение по причине того, что сохраняется ручное управление и роллету можно открыть частично, при этом оба концевика размыкаются., потом можно чуть приоткрыть еще, чуть призакрыть еще руками. А обратной связи с кнопкой нет и думаю не будет.
Собственно как я это вижу. Первоначально будет снят сигнал только с открытого положения и возможно добавится сигнал с полностью закрытого, но это под вопросом. Мне необходимо открыть по условию.
имеем. 1 сигнал "открыто"
Не знаем в каком положении роллета если она открыта не до конца. Подаем импульс на кнопку (время импулся ТР для регулировки)
Ждем Н время до открытия (засекается на действующих роллетах + запас полного хода если были полностью закрыты), если сигнал №1 не пришел, подаем еще раз импульс и пять ждем. Пришел сигнал №1 все, больше ничего не делаем, даже если роллету потом закрыли руками.
Сигнал №2 (когда появится) - положение "закрыто". Если знаем точно, что роллета закрыта то просто подаем импульс и ждем сигнала №1 и не предпринимаем попыток подавать 2-й импульс на случай, если человек был рядом и сам кнопкой остановил ход роллеты.
Опять же, если у меня будет сигнал №2, но при этом роллета была открыта на половину, то идем по алгоритму, который выше
Мне вот нужен вариант подачи 2-х импульсов, а то у меня или лыжи не совсем едут или такой огород получается из RS тригеров и таймеров, что мне кажется это излишним все и я что-то упускаю простое...
Навертел что непонятно ажжж