PDA

Просмотр полной версии : Тригонометрические функции OWEN Logic



POMAXA
29.01.2016, 15:14
Всем привет!
На мой взгляд в среде OWEN Logic не хватает тригонометрических функций, таких как SIN и COS.
Мне, в моём первом опыте программирования ПР114, пришлось создавать макрос с приблизительным расчётом косинуса угла, подгоняя его под табличные значения.

maximov2009
29.01.2016, 16:17
Добрый день. А если не секрет - зачем такие функции в программируемом реле, предназначенном для создания не очень сложных систем управления. Язык на мой взгляд сделан по аналогии старых стандартных логических микросхем. А они в общем то никогда особо и не были предназначены для выполнения сложных арифметических операций. Для математики - это уже более сложный контроллер, у которого и быстродействие побольше.
Может я конечно что то и не понимаю, но для решения производственных задач мне такие функции пока ни разу не требовались.
С уважением.

Сергей0308
29.01.2016, 16:29
Всем привет!
На мой взгляд в среде OWEN Logic не хватает тригонометрических функций, таких как SIN и COS.
Мне, в моём первом опыте программирования ПР114, пришлось создавать макрос с приблизительным расчётом косинуса угла, подгоняя его под табличные значения.

Уже несколько раз выкладывались, ищите, скорей всего в "макросах"!

POMAXA
29.01.2016, 23:33
Добрый день. А если не секрет - зачем такие функции в программируемом реле, предназначенном для создания не очень сложных систем управления. Язык на мой взгляд сделан по аналогии старых стандартных логических микросхем. А они в общем то никогда особо и не были предназначены для выполнения сложных арифметических операций. Для математики - это уже более сложный контроллер, у которого и быстродействие побольше.
Может я конечно что то и не понимаю, но для решения производственных задач мне такие функции пока ни разу не требовались.
С уважением.

Здравствуйте.
В моём случае, не совсем стандартное применение этого реле. Мы производим высотную технику (автоподъёмники и автолестницы), и в зависимости от сложности, мы проектируем три типа систем управления. В данном случае, на ПР114, выбор пал из-за низкой цены. COS необходим для расчёта вылета стрелы в зависимости от угла наклона и длины стрелы.

Владимир Ситников
29.01.2016, 23:39
COS необходим для расчёта вылета стрелы в зависимости от угла наклона и длины стрелы.

Вообще, было бы интересно в Owen Logic сделать online базу макросов.
Сейчас макросы на форумах проскакивают туда-сюда.
А если бы в самой среде была возможность "найти в online базе"/"добавить в базу"/"написать комментарий" -- было бы полезно.

rovki
29.01.2016, 23:44
Онлайн база макросов есть ,только заполняют ее в Овен ,а им похоже некогда ..И две темы про макросы есть на форуме ..

rovki
29.01.2016, 23:48
Здравствуйте.
В моём случае, не совсем стандартное применение этого реле. Мы производим высотную технику (автоподъёмники и автолестницы), и в зависимости от сложности, мы проектируем три типа систем управления. В данном случае, на ПР114, выбор пал из-за низкой цены. COS необходим для расчёта вылета стрелы в зависимости от угла наклона и длины стрелы.
вот вам синус или тут где то рядом http://www.owen.ru/forum/showthread.php?t=12687&page=36&p=107897&viewfull=1#post107897

POMAXA
30.01.2016, 10:47
вот вам синус или тут где то рядом http://www.owen.ru/forum/showthread.php?t=12687&page=36&p=107897&viewfull=1#post107897

Здравствуйте.
Спасибо. Этот макрос я уже исследовал, он абсолютно не работает, отклонение от настоящего синуса (я проверял в диапазоне углов 0 - 90) составляет примерно 0,25, а это в моём случае, при длине стрелы 30 метров, порядка 7-8 метров.

rovki
30.01.2016, 10:53
который из 2 макросов проверили.У первого угол задается в градусах (целочисленных) ,естественно точность будет +-1гр по входу...
А у 2 макроса задание в радианах ,выбирайте что нужно ...

POMAXA
30.01.2016, 11:02
Вот моя версия косинуса 0 до 90 градусов. Точность, в моём случае, порядка 15 см

POMAXA
30.01.2016, 11:24
который из 2 макросов проверили.У первого угол задается в градусах (целочисленных) ,естественно точность будет +-1гр по входу...
А у 2 макроса задание в радианах ,выбирайте что нужно ...

Проверил с градусами.

rovki
30.01.2016, 11:25
Что ж так много раз проверили ?

POMAXA
30.01.2016, 11:25
Вот я наклонировал сообщений, пытался удалить, все удаляются.

POMAXA
30.01.2016, 11:26
Не привык ещё.

rovki
30.01.2016, 11:28
Вот моя версия косинуса 0 до 90 градусов. Точность, в моём случае, порядка 15 см
Ну так добавьте еще один член ряда ,получите большую точность ...если нужно.

POMAXA
30.01.2016, 11:35
Ну так добавьте еще один член ряда ,получите большую точность ...если нужно.

Пока не нужно, всё устраивает.

Владимир Ситников
30.01.2016, 14:31
Вот моя версия косинуса 0 до 90 градусов. Точность, в моём случае, порядка 15 см

Ну так добавьте еще один член ряда ,получите большую точность ...если нужно.

Раскладывать в ряды это неправильный подход.
У разложений в ряды цель -- приблизить функцию в окрестности. А при "приближенном вычислении sin/cos" важнее "минимизировать общую ошибку на интервале".

Нужно так делать: http://lab.polygonal.de/?p=205 (если есть плавающая точка). Или так: http://www.coranac.com/2009/07/sines/ (если в целых числах)

rovki
30.01.2016, 14:35
Категоричные выводы не приветствую ....Только калькуляторы об этом не знают ;) .Нам бы реализацию к теории ...(в рамках элементов ПР) Может Капзап сделает ?:rolleyes:

Владимир Ситников
30.01.2016, 15:21
Категоричные выводы не приветствую ....
А с интегралами знакомы?
По второй ссылке есть доказательство оптимальности указанного многочлена (в части минимизации среднеквадратичного отклонения): http://www.coranac.com/2009/07/sines/#ssec-test-opt (см 24 и 25)


Нам бы реализацию к теории
Ну вот никак не поверю, что вам неясно как реализовать формулу sin = 1.27323954 * x - 0.405284735 * x * x;

А как после этого сделать ещё_более_точный_sin = .225 * (sin * sin - sin) + sin; тоже объяснять нужно?
Если углы в области 0...PI, то 5 умножений, 3 сложения, 0 возведений в степень, 0 условий. И при всём при этом, ошибка не превышает 2%

Вот вам график f(x)-sin(x) (http://fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIxLjI3MzIzOTU0KngtMC40MDUyO DQ3MzUqeCp4LXNpbih4KSIsImNvbG9yIjoiIzAwMDAwMCJ9LHs idHlwZSI6MCwiZXEiOiIwLjIyNSooKDEuMjczMjM5NTQqeC0wL jQwNTI4NDczNSp4KngpKigxLjI3MzIzOTU0KngtMC40MDUyODQ 3MzUqeCp4KS0oMS4yNzMyMzk1NCp4LTAuNDA1Mjg0NzM1Kngqe CkpKygxLjI3MzIzOTU0KngtMC40MDUyODQ3MzUqeCp4KS1zaW4 oeCkiLCJjb2xvciI6IiMzM0ZGMDAifSx7InR5cGUiOjAsImVxI joieC14XjMvNit4XjUvMTIwLXNpbih4KSIsImNvbG9yIjoiI0Z GMDAwMCJ9LHsidHlwZSI6MTAwMCwid2luZG93IjpbIjAiLCIzL jE0IiwiLTAuNSIsIjAuNSJdfV0-)

А вот график (f(x)-sin(x))/sin(x) (http://fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoMS4yNzMyMzk1NCp4LTAuNDA1M jg0NzM1KngqeC1zaW4oeCkpL3Npbih4KSIsImNvbG9yIjoiIzA wMDAwMCJ9LHsidHlwZSI6MCwiZXEiOiIoMC4yMjUqKCgxLjI3M zIzOTU0KngtMC40MDUyODQ3MzUqeCp4KSooMS4yNzMyMzk1NCp 4LTAuNDA1Mjg0NzM1KngqeCktKDEuMjczMjM5NTQqeC0wLjQwN TI4NDczNSp4KngpKSsoMS4yNzMyMzk1NCp4LTAuNDA1Mjg0NzM 1KngqeCktc2luKHgpKS9zaW4oeCkiLCJjb2xvciI6IiMzM0ZGM DAifSx7InR5cGUiOjAsImVxIjoiKHgteF4zLzYreF41LzEyMC1 zaW4oeCkpL3Npbih4KSIsImNvbG9yIjoiI0ZGMDAwMCJ9LHsid HlwZSI6MTAwMCwid2luZG93IjpbIjAiLCIzLjE0IiwiLTAuNSI sIjAuNSJdfV0-)

И, да, конечно, вопрос в том, в каком диапазоне нужно вычислять.

rovki
30.01.2016, 15:36
Убедили.....:rolleyes:

Владимир Ситников
30.01.2016, 16:08
Убедили.....:rolleyes:

Ну, пока убеждал, сам убедился, что реально всё зависит от того, в каком диапазоне нужно вычисление.
Чтобы расширить диапазон иногда проще использовать sin(x)=sin(pi-x).
Т.е. не плодить лишние члены ряда, а предварительно уменьшать угол.

Вот, например, график ошибки для ((x-x3/6+x5/120)*(x<pi/2)+((pi-x)-(pi-x)3/6+(pi-x)5/120)*(x>=pi/2) (http://fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoKCh4LXheMy82K3heNS8xMjApK ih4PHBpLzIpKygocGkteCktKHBpLXgpXjMvNisocGkteCleNS8 xMjApKih4Pj1waS8yKS1zaW4oeCkpKS9zaW4oeCkiLCJjb2xvc iI6IiMwMDAwMDAifSx7InR5cGUiOjEwMDAsIndpbmRvdyI6WyI wIiwicGkiLCItMC4wMSIsIjAuMDEiXX1d)
Получается ошибка не более 0.5% на интервале 0..PI, при том, что реализовано будет как "стандартное x-x3/6+x5/120", перед которым SEL(x>PI/2, PI-x, x)

Hemann
31.01.2016, 13:16
Если хотите - можете попробовать мои наработки. Мне они вполне подошли. Вроде бы и народ тестировал, отзывы были не ругательные. Входные значения - в радианах, без ограничения.

Владимир Ситников
31.01.2016, 15:06
Если хотите - можете попробовать мои наработки. Мне они вполне подошли. Вроде бы и народ тестировал, отзывы были не ругательные. Входные значения - в радианах, без ограничения.

Давайте я пожалуюсь.
1) Вычислять "знак числа" через POW(-1, TO_FLOAT(NOT(GT(x, 0)))) это круто.
С extract'ом же правильно поняли.

Т.е. XOR(NOT(GT(x, 0)), TO_INT(fDIV(x, pi))) и потом extract нулевого бита.

2) Подаю на вход sin_x значение 3,14158 (~179.99927 градусов), получаю на выходе -4,3E-04 == -0.00043
Реальное значение sin(3.14158) == 1.26536e-5 == 0.0000126536
Ошибка просто огроменная: целых 3600% == (0.0000126536 + 0.00043)/0.0000126536 == 36
При углах 179.97..180 градусов ошибка превышает 100%

Конечно, считать sin(x) при x порядка pi это неблагодарное занятие, но если перед "записью в Y" ещё сделать преобразование "если Y>pi/2, то записать pi-Y", то точность около pi повысится просто невероятно. Можно и y^11 выкидывать смело будет.

Вот график относительной ошибки (http://fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoKHgteF4zLzYreF41LzEyMC14X jcvNTA0MCt4XjkvMzYyODgwLXheMTEvMzk5MTY4MDApLXNpbih 4KSkvc2luKHgpIiwiY29sb3IiOiIjMDAwMDAwIn0seyJ0eXBlI joxMDAwLCJ3aW5kb3ciOlsiMy4xNDE1IiwiMy4xNDE2IiwiLTE wMCIsIjEiXX1d) для вашего алгоритма около pi

Hemann
31.01.2016, 22:07
Владимир, как говорится у Шекспира, нет в мире совершенства. На значениях Х, близких к 0 или Pi, здорово сказывается ограничение точности как самой ПР-ки, так и метода. Однако, увеличивать количество членов ряда не имеет смысла именно из-за свойств платформы. В любом случае-писал для себя, мне подошло, может кому будет тоже полезно

rovki
31.01.2016, 22:15
Теория хорошо ,а практика лучше ..;). Часто вспоминаю AI ,умница ,хороший теоретик ,но и знания свои подтверждал примерами (проектами)..Вроде на форуме он ,но что то молчит....

Владимир Ситников
01.02.2016, 00:39
Однако, увеличивать количество членов ряда не имеет смысла именно из-за свойств платформы. В любом случае-писал для себя, мне подошло, может кому будет тоже полезно
Вы меня не поняли.
Количество членов ряда нужно даже уменьшать.

x9 и x11 совершенно не нужны -- они никак не добавляют точности (если добавить if (x>pi/2) { y=pi-x; } else { y=x; } предобработку)

x7 -- нужно, иначе будет некрасиво около 1.57 (http://fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoKCh4LXheMy82K3heNS8xMjApK ih4PDMuMTQxNTkzLzIpKygoMy4xNDE1OTMteCktKDMuMTQxNTk zLXgpXjMvNisoMy4xNDE1OTMteCleNS8xMjApKih4Pj0zLjE0M TU5My8yKS1zaW4oeCkpKS9zaW4oeCkiLCJjb2xvciI6IiMwRjE 2RjcifSx7InR5cGUiOjAsImVxIjoiKCgoeC14XjMvNit4XjUvM TIwLXheNy81MDQwK3heOS8oNTA0MCo4KjkpLXheMTEvKDUwNDA qOCo5KjEwKjExKSktc2luKHgpKSkvc2luKHgpIiwiY29sb3IiO iIjRkYwMDAwIn0seyJ0eXBlIjowLCJlcSI6IigoKHgteF4zLzY reF41LzEyMC14XjcvNTA0MCkqKHg8My4xNDE1OTMvMikrKCgzL jE0MTU5My14KS0oMy4xNDE1OTMteCleMy82KygzLjE0MTU5My1 4KV41LzEyMC0oMy4xNDE1OTMteCleNy81MDQwKSooeD49My4xN DE1OTMvMiktc2luKHgpKSkvc2luKHgpIiwiY29sb3IiOiIjMDl GRjAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiMS4zIiwiM S44IiwiLTAuMDAxIiwiMC4wMDUiXX1d)

Вот я поправил ваш макрос sin: 22215

Выглядит так: 22217
Вот вычисление проблемного 3.14158. Видно, что правильный ответ получается с первых же членов ряда: 22219

К сожалению, отображение float в OwenLogic крайне неудачно сделано (показывает слишком мало цифр и никак не узнать все). Например, если вычислять sin(1.57), то с первых же членов ряда получается 1e0, а реально там чуть больше должно получаться на первых двух членах -- 1.004 (это при том, что синус больше 1 быть не должен %)

Разумеется, около pi всё равно будет колбасить (т.к. pi float'ом не представимо), но после поправки pi-x зона расколбаса гораздо уже. Сравните синий и красный графики (http://fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoKCh4LXheMy82K3heNS8xMjApK ih4PDMuMTQxNTkzLzIpKygoMy4xNDE1OTMteCktKDMuMTQxNTk zLXgpXjMvNisoMy4xNDE1OTMteCleNS8xMjApKih4Pj0zLjE0M TU5My8yKS1zaW4oeCkpKS9zaW4oeCkiLCJjb2xvciI6IiMwRjE 2RjcifSx7InR5cGUiOjAsImVxIjoiKCgoeC14XjMvNit4XjUvM TIwLXheNy81MDQwK3heOS8oNTA0MCo4KjkpLXheMTEvKDUwNDA qOCo5KjEwKjExKSktc2luKHgpKSkvc2luKHgpIiwiY29sb3IiO iIjRkYwMDAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiMy4 xNDE1NyIsIjMuMTQxNiIsIi0xMDAiLCIxMDAiXX1d). Синий ряд до x5, но с предобработкой. Красный -- до x11, но без.

rovki
01.02.2016, 00:46
Вот это уже лучше ,с примерами :rolleyes:

Владимир Ситников
01.02.2016, 01:03
Теория хорошо ,а практика лучше ..;)
У меня нет ПР и пока не предвидится. Поэтому могу только руками размахивать и теоретизировать в симуляторах.

Кстати, интересно:
1) Можно ли задать порядок выполнения fADD. Теоретически, нужно ряд складывать наоборот: x5/120-x3/6+x. Когда складываешь "совпадающие по величине числа" погрешность float'а меньше копится.
2) Насколько симулятор верно считает (нет ли там глюка, что внутренние вычисления идут в double)

rovki
01.02.2016, 01:12
1.порядок вычисления можно попробовать изменить если использовать явные обратные связи ...
2.это к разработчикам...
Ваши бы знания в макросы втиснуть ,цены бы не было:rolleyes: ..

rovki
01.02.2016, 02:21
Практическое пожелание - всегда помните о железе ,да же занимаясь математикой .Точность АЦП по входу ограничена 12 разрядами (двоичными) ,без учета реальных помех а это 3,5 порядка десятичных .Поэтому когда вы оперируете величинами в теоретических изысканиях 0.0000126536 не забывайте о железе.;) и соизмеряйте желания и возможности ...А в остальном ,СПАСИБО...

Yegor
01.02.2016, 07:55
Поэтому когда вы оперируете величинами в теоретических изысканиях 0.0000126536 не забывайте о железе.А вдруг кто-то опрометчиво переведёт паскали в атмосферы? И будет полный пиец.

Hemann
01.02.2016, 10:54
Владимир, замечательно! Действительно толковое дополнение!

Серёга Букашкин
10.02.2016, 09:57
Взываю к разработчикам ОЛ! Появление ПР200 с относительно развитой функцией индикации и редакции энергонезависимых переменных (доступных настроек проекта) настоятельно требует расширения вариантов записи проекта в прибор. Энергонезависимые переменные призваны быть сохраненными не только при выключении питания, но и при перезаливке программы в прибор. Сейчас они при заливке переписываются в значения "по умолчанию", что в реальной эксплуатации ухудшает потребительские свойства прибора, вынуждает вести протоколы настроек и восстанавливать настройки вручную. Просьба рассмотреть возможность появления в ОЛ:
1. Разделение записи проекта отдельно на функцию записи программы и функцию записи в энергонезависимые переменные значений "по умолчанию"+ системные переменные, назначаемые в настройках проекта (границы AI, типы сигналов, параметры RS-485).
2. Дать функцию прочитать из прибора все эти переменные и автоматически внести их значения в проект, или хотя бы прочитать в файл пользователя, который потом можно было бы записать обратно или в другой прибор.
3. Расширить список доступа к системным переменным настроек проекта (только для чтения) чтобы программа их могла видеть и реагировать на неправильно проредактированные.

flicker581
10.02.2016, 16:56
Взываю к разработчикам ОЛ! Появление ПР200 с относительно развитой функцией индикации и редакции энергонезависимых переменных (доступных настроек проекта) настоятельно требует расширения вариантов записи проекта в прибор. Энергонезависимые переменные призваны быть сохраненными не только при выключении питания, но и при перезаливке программы в прибор.

Поддерживаю, проблема действительно актуальная. Не очень хочется при перезаливке заносить обратно вручную счётчики моточасов и настройки.

Евстигнеев Максим
10.02.2016, 19:40
Спасибо!
Зафиксировали.

rovki
10.02.2016, 22:11
Поддерживаю, проблема действительно актуальная. Не очень хочется при перезаливке заносить обратно вручную счётчики моточасов и настройки., а если другой проект залили с другими сетевыми адресами и часть с теме же,а там сохранилась каша от предыдущено проекта ..Как отличить перезаливку от заливки ...

игорь68
13.02.2016, 12:11
Добрый день. Вопрос о выходе описания лоджика. Скоро в продаже модули расширения будут. Добавлена возможность ОРС сервера . А описания до сих пор нет. Если бы не работа Гайнутдинов Кирилл было бы трудно. Сделайте что не будь в этом направлении.