PDA

Просмотр полной версии : Точный таймер



жекон
11.06.2015, 15:17
Во многих проектах применяю таймеры сделанные на принципе суммирования или вычитании секундных импульсов, выдаваемых генератором (BLINK,GEN_PULSE и т.п) и дальше на CTU или ADD, при малых интервалах времени всё нормально, но при интервалах час и более погрешность довольно существенная, как убрать эту погрешность?

murdemon
11.06.2015, 15:27
использовать встроенные таймеры ... или выделять в отдельный таск BLINK + все где ADD или CTU

жекон
11.06.2015, 15:31
С родными таймерами то-же геморроя много например при сохранении в файл, в отдельный выделить не получиться если только тактовый генератор, да и не думаю что это сильно повлияет

Вольд
11.06.2015, 15:50
А от RTC ПЛК синхронизироваться не пробовал ?

жекон
11.06.2015, 16:06
Каким образом вытянуть секундный(или милисекундный) импульс если по изменению то время уйдет на обработку, опять погрешность

Yegor
11.06.2015, 18:21
Звучит как накопление погрешности. Покажите конкретные примеры кода.

жекон
11.06.2015, 19:57
Звучит как накопление погрешности. Покажите конкретные примеры кода.Да так оно и есть, весь код не выкладываю именно счетчики так примерно как они реализованы в программе, только по упрощенной схеме, без включений, блокировок и т.д т.п


18550

melky
11.06.2015, 23:31
если родные часы ПЛК трындят, то что с чем будем синхронизировать ?

Вольд
12.06.2015, 09:13
если родные часы ПЛК трындят
На сколько трындят ?

Sergey666
12.06.2015, 18:17
На сколько трындят ?

Как Чистопольские часы , командирские .:p

жекон
13.06.2015, 09:33
А где наши столпы capzap и валенок?

Sergey666
13.06.2015, 10:24
А где наши столпы capzap и валенок?

А что ? Что "Столпы" то?
Возможный рецепт :
1. Задействовать Task Manager. (Возможно принудительный запуск задачи "нагнет" ПЛК более дисциплинированно выполнять-обслуживать цепочку вызовов).
2. Создать задачу + программу с периодом вызова 1с .
3. В программе написать что-нибудь типа - Time_tik_1s:=Time_tik_1s+1 ; Flag_1s:=true;

Пробуйте

capzap
13.06.2015, 10:37
потому что программных способов не существует повысить точность дешевых часов реального времени в плк, поэтому и сказать нечего
ну так для информации, я пользуюсь функцией TIME(), а не блинкерами всякими. А если синхронизировать часы, то брать их если не из ntp, то хотябы с панели

Вольд
13.06.2015, 11:29
В ПЛК "ОВЕН" используются дешевые низкостабильные кварцевые резонаторы и в этом вся проблема. Если синхронизироваться от RTC ПЛК, то раз в сутки надо делать программную корректировку времени. Например, если RTC уходят за сутки на 50 сек., то эти самые 50 сек. надо вычитать из текущего времени.

жекон
14.06.2015, 06:05
Да речь не том чтобы повысить точность часов , хотя бы получить более менее стабильный импульс , с панели брать не уверен что там лучше часики стоят потому как время корректирую иногда

жекон
14.06.2015, 06:30
А что ? Что "Столпы" то?
Возможный рецепт :
1. Задействовать Task Manager. (Возможно принудительный запуск задачи "нагнет" ПЛК более дисциплинированно выполнять-обслуживать цепочку вызовов).
2. Создать задачу + программу с периодом вызова 1с .
3. В программе написать что-нибудь типа - Time_tik_1s:=Time_tik_1s+1 ; Flag_1s:=true;

ПробуйтеМысли и были в развитие этого сценария но пока только мысли попробую отпишусь

rwg
14.06.2015, 08:40
В ПЛК "ОВЕН" используются дешевые низкостабильные кварцевые резонаторы и в этом вся проблема. Если синхронизироваться от RTC ПЛК, то раз в сутки надо делать программную корректировку времени. Например, если RTC уходят за сутки на 50 сек., то эти самые 50 сек. надо вычитать из текущего времени.

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

rwg
14.06.2015, 08:48
я пользуюсь функцией TIME(), а не блинкерами всякими.
Поддерживаю целиком и полностью. Когда пишу на ST, только так, никаких TON и TOF. Особенно после того, как убедился, что и они гарантируют накопление ошибки из-за того, что программа всегда выполняется спустя какое то время после срабатывания таймера. Эта разница времён и накапливается в каждом цикле, всегда с одним знаком.

жекон
14.06.2015, 08:59
Повторюсь еще раз мне не важно что таймер будет накапливать, мне нужно что-бы он отрабатывал здесь и сейчас с максимально возможной точностью

жекон
14.06.2015, 09:01
По моему опыту работы в датчикостроении, Вы наговариваете на изготовителей кварцев. Любой кварц может не завестись. Но если завёлся, свою частоту держит достаточно точно, в пределах секунды в сутки.
Всё правильно так как лажануть негде кусок камня

capzap
14.06.2015, 09:02
Всё правильно так как лажануть негде кусок камня

этому камню обеспечено стабилизированное питание, хоть какая нибудь система охлаждения?

Вольд
14.06.2015, 09:55
По моему опыту работы в датчикостроении, Вы наговариваете на изготовителей кварцев. Любой кварц может не завестись. Но если завёлся, свою частоту держит достаточно точно, в пределах секунды в сутки.
Кварцевые резонаторы бывают разные. Относительная погрешность настройки частоты кварцевого резонатора с резонансной частотой 32768 Гц (часовой кварц) много больше чем у кварцевого резонатора с частотой 10 мГц.
"При выборе резонатора для генератора особое внимание следует обращать на добротность резонатора - чем она выше, тем стабильнее частота. Наибольшей добротностью обладают вакуумированные резонаторы. Но чем добротнее резонатор, тем он дороже. Часто встречаются резонаторы с большим уровнем побочных резонансов."
Таким образом, все дело в кварцевом резонаторе. Он единственный источник погрешности при отсчете времени.
Скорее всего фирма "ОВЕН" использует в своих приборах хреновенькие часовые (32768 Гц) кварцевые резонаторы.

rwg
14.06.2015, 19:45
Во многих проектах применяю таймеры сделанные на принципе суммирования или вычитании секундных импульсов, выдаваемых генератором (BLINK,GEN_PULSE и т.п) и дальше на CTU или ADD, при малых интервалах времени всё нормально, но при интервалах час и более погрешность довольно существенная, как убрать эту погрешность?
Повторюсь еще раз мне не важно что таймер будет накапливать, мне нужно что-бы он отрабатывал здесь и сейчас с максимально возможной точностью
Повторюсь, не пользуйтесь таймерами, сделанными на принципе суммирования секундных импульсов, пользуйтесь функцией TIME. Только так Вы можете обеспечить максимально высокую точность. Погрешность 10 мсек в секунду у Вас оборачивается погрешностью 40 секунд в час.

жекон
14.06.2015, 20:34
Повторюсь, не пользуйтесь таймерами, сделанными на принципе суммирования секундных импульсов, пользуйтесь функцией TIME. Только так Вы можете обеспечить максимально высокую точность. Погрешность 10 мсек в секунду у Вас оборачивается погрешностью 40 секунд в час.
Если бы около 10 минут, т б если выдержка 4 часа то в реале получается 4,4

жекон
14.06.2015, 20:49
И вся фишка в том что ПЛК отрабатывает свой цикл Пытался попробовать его вычислить путем подбора на том же блинке ни фига не получилось

rwg
14.06.2015, 23:36
Если бы около 10 минут, т б если выдержка 4 часа то в реале получается 4,4
Если секундные импульсы суммировать с периодом работы программы 100мс, то так вполне может получиться. Импульсы будут прибавляться раз в 1,1 секунды.

СергейНовосиб
17.01.2018, 11:04
У меня есть задача вести временной отсчет текущего процесса с точностью встроенных часов. Каким образом можно получить импульсы со встроенных часов для последующего подсчета?
При каждом новом цикле процесса начинается новый отсчет. Как еще можно реализовать обратный временной отсчет?
Проект в Codesys 3.5.

Sergeba
10.03.2018, 02:05
При каждом новом цикле процесса начинается новый отсчет. Как еще можно реализовать обратный временной отсчет?
Проект в Codesys 3.5.

Это можно реализовать вычитаением. Сохраняете момент начала цикла, потом вычитаете из заданного времени разницу между текущим временем и сохранённым - получите обратный остчёт.

Sergeba
10.03.2018, 02:10
я пользуюсь функцией TIME(), а не блинкерами всякими.

Подскажите по функции TIME(). Достигнув максимального времени 49d17h2m47s295ms (4194967295 ms) отсчёт начнётся с 0? Решил отказаться от таймеров TON, TP... Но я так понимаю, что при использовании TIME() нужно раз в 49 дней производить коррекцию текущих счётчиков, основанных на этой функции?

capzap
10.03.2018, 07:38
Подскажите по функции TIME(). Достигнув максимального времени 49d17h2m47s295ms (4194967295 ms) отсчёт начнётся с 0? Решил отказаться от таймеров TON, TP... Но я так понимаю, что при использовании TIME() нужно раз в 49 дней производить коррекцию текущих счётчиков, основанных на этой функции?

сперва попробуйте вычесть из например 15 число 4294967285, где предположим 4294967285 - начало замера времени, 15 - соответственно конец

Sergeba
10.03.2018, 11:15
сперва попробуйте вычесть из например 15 число 4294967285

Пока не пробовал, но в справке нашёл такую фразу: "Переменной TIME можно присвоить результат вычитания двух других переменных типа TIME. Отрицательное время не определено."

Зинько Владислав
19.03.2018, 11:46
"Отрицательное время не определено."

Тип данных TIME - аналог типа данных UDINT (0...4294967295).
При вычитании из меньшего большего произойдет переход через "0", с учетом нуля как полноценного шага измерения.

К примеру, при вычитании из 1ms 4294967295ms мы получим на выходе 2 ms.
Эту "особенность" необходимо учитывать при работе с типом данных TIME.