На форуме обязательно:
  1. Заполнить свой профиль НА РУССКОМ ЯЗЫКЕ КИРИЛЛИЦЕЙ. См. Правила, п.2.d.
  2. Не писать свой вопрос в первую попавшуюся тему, а вместо этого создать свою. См. Правила, п.3.a.

Рекламу мы не размещаем ни на каких условиях.

Счетчик оборотов

Ответить
Аватара пользователя

Автор темы
megavolt86
авторитет
авторитет
Сообщения: 872
Зарегистрирован: 14 ноя 2013, 19:35
Имя: Анатолий Сергеевич
Откуда: Башкортостан
Благодарил (а): 8 раз
Поблагодарили: 21 раз

Счетчик оборотов

Сообщение megavolt86 » 18 авг 2017, 12:28

Здравствуйте, коллеги!
Имею задачу вычислить количество оборотов вала в минуту при помощи s7-1200, cpu1214.
Использую высокоскоростной счетчик в режиме измерения частоты.
Полученное значение умножаю на 60 и делю на количество меток. Точность правда не очень: обороты гуляют в диапазоне (60/количество меток).
Если метка всего одна, то коридор в котором находится текущая скорость равен 60 оборотов, это не сильно хорошо.
По скорости ведется тех.процесс и потому точность измерения превыше всего.
Была мысль использовать массив, допустим, из 60 элементов, в каждый из которых будет заполняться каждую секунду текущим значением скорости.
Далее если сложить все элементы массива получим скорость за минуту.
Скорость изменяется плавно и в течении некоторого времени.
Вроде как должно получится, но вот незадача - как автоматизировать сложение элементов массива и чтобы элемент i-ой секунды предыдущей минуты перезаписывался элементом i-ой секундой текущей минуты и опять суммировалось...может кто знает какой функцией можно сложить все элементы массива?
Или может есть какой более элегантный способ узнать более менее точное количество оборотов?
:ext_secret:


alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 601
Зарегистрирован: 29 сен 2008, 16:05
Имя: Алексей Угрюмов
Благодарил (а): 7 раз
Поблагодарили: 19 раз

Счетчик оборотов

Сообщение alex_ugrumov » 18 авг 2017, 12:42

В чём вопрос то?
Массив из 60 чисел.
Раз в секунду
1) записываете в i-ый эмемент текущую скорость V = Vтекущ
2) ++i
3) если i >=60, то i = 0
4) Vср = 0
5) for j = 0 to 59, Vср += V[j]
Язык любой, какой ближе.

Только это вам ничего не даст. Это простой фильтр первого порядка, точность он не увеличит. Нужно ставить такое число меток, чтобы обеспечивать нужную точность.

Если метки чаще поставить нельзя, то возможно уже точнее мерить временной интервал между метками. Тут точность будет уже определяться минимальным дискретом времени, который можно измерить и величиной десперсии времени задержки между прохождением метки и фиксацией времени этого события в контроллере.
Alex.

Аватара пользователя

Автор темы
megavolt86
авторитет
авторитет
Сообщения: 872
Зарегистрирован: 14 ноя 2013, 19:35
Имя: Анатолий Сергеевич
Откуда: Башкортостан
Благодарил (а): 8 раз
Поблагодарили: 21 раз

Счетчик оборотов

Сообщение megavolt86 » 18 авг 2017, 13:52

alex_ugrumov писал(а): for j = 0 to 59, Vср += V[j]
При таком подходе среднее значение будет постоянно увеличиваться, а необходимо, чтобы самый старый элемент массива заменялся новым, можно конечно сделать буферный массив, но это затратно по памяти будет...да персонал без меня разобраться не сможет в коде...

по поводу подсчета времени между импульсами попытался реализовать сконфигурировав вход на period. Но в мониторинге получаю постоянно растущее число...но только это ниразу не период
:ext_secret:


alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 601
Зарегистрирован: 29 сен 2008, 16:05
Имя: Алексей Угрюмов
Благодарил (а): 7 раз
Поблагодарили: 19 раз

Счетчик оборотов

Сообщение alex_ugrumov » 18 авг 2017, 15:10

Вы вырвали расчёт из контекста.
В оригинале было
alex_ugrumov писал(а):
4) Vср = 0
5) for j = 0 to 59, Vср += V[j]
Если предположить, что текущее измеренное значение (Vтекущ) в каждую секунду одно и тоже, и равно, например, 20. То (после установления скорости) получите массив длинной 60 в каждой из которой лежит 20. И новая 20 переписывает старую. Суммировав это массив, на любом шаге вы получите 1200. И каждый раз это будет 1200. Как он будет расти?

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

Отправлено спустя 4 минуты 45 секунд:
megavolt86 писал(а): а необходимо, чтобы самый старый элемент массива заменялся новым,
ровно это происходит в этих строках кода
alex_ugrumov писал(а):
Раз в секунду
1) записываете в i-ый эмемент текущую скорость V = Vтекущ
2) ++i
3) если i >=60, то i = 0
Alex.

Аватара пользователя

Автор темы
megavolt86
авторитет
авторитет
Сообщения: 872
Зарегистрирован: 14 ноя 2013, 19:35
Имя: Анатолий Сергеевич
Откуда: Башкортостан
Благодарил (а): 8 раз
Поблагодарили: 21 раз

Счетчик оборотов

Сообщение megavolt86 » 18 авг 2017, 15:32

alex_ugrumov,
Все познается в сравнении, хотелось бы проверить как будет происходить сглаживание.
[+] суть вопроса
Вообще изначально было интересно существует ли такой оператор который будет суммировать все элементы массива или получать среднее...
То решение которое вы предложили подходит для статичных значений элементов массива, а как быть с динамически менящимися?
Я в программе то могу использовать и текущую частоту, а вот для операторов будет непонятно почему скорость не достигнута а шаг уже сменился, или скорость перешагнула уставку, а шаг не сменился, будут вопросы к работоспособности системы.

Кстати может ли HCS выдавать частоту в формате real?
:ext_secret:


alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 601
Зарегистрирован: 29 сен 2008, 16:05
Имя: Алексей Угрюмов
Благодарил (а): 7 раз
Поблагодарили: 19 раз

Счетчик оборотов

Сообщение alex_ugrumov » 18 авг 2017, 16:11

megavolt86 писал(а): alex_ugrumov,
Все познается в сравнении, хотелось бы проверить как будет происходить сглаживание.
В Экселе это делается очень просто и наглядно.
megavolt86 писал(а):,
[+] суть вопроса
Вообще изначально было интересно существует ли такой оператор который будет суммировать все элементы массива или получать среднее...
То решение которое вы предложили подходит для статичных значений элементов массива, а как быть с динамически менящимися?
Этот оператор называется оператором цикла. Реализия зависит от используемого языка.
megavolt86 писал(а):
Я в программе то могу использовать и текущую частоту, а вот для операторов будет непонятно почему скорость не достигнута а шаг уже сменился, или скорость перешагнула уставку, а шаг не сменился, будут вопросы к работоспособности системы.
А почему это вы интересно работаете по одним параметрам, а показываете другие?
Ищите эффектный способ выстрелить себе в ногу?
megavolt86 писал(а):
Кстати может ли HCS выдавать частоту в формате real?
Есть стандартный конвертер типов. Почему его не задействовать?
Alex.


Михайло
почётный участник форума
почётный участник форума
Сообщения: 2614
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
Благодарил (а): 1 раз
Поблагодарили: 75 раз
Контактная информация:

Счетчик оборотов

Сообщение Михайло » 18 авг 2017, 16:14

megavolt86 писал(а):Или может есть какой более элегантный способ узнать более менее точное количество оборотов?
У меня успешно реализован точный способ измерения с использованием прерываний. К сожалению, кодом пока не готов поделиться, надо его на работе взять.
Смысл такой: используем счетчик HSC в режиме счета импульсов (COUNT). Возможно использовать квадратурный режим с определением направления вращения A/B, но точно можно простой single phase. Настраиваем прерывание, которое будет обрабатываться при достижении порога (reference value), например, прерывание будет вызываться каждые 120 импульсов. В блоке обработки прерывания используем выход ET специально предусмотренного для этого таймера для подсчета времени между 0-ым и 120-ым импульсом. Порог нужно задать таким образом, чтобы время ET достигало порядка 1,5-2 секунд. Затем в этом же прерывании делаем нехитрое вычисление частоты вращения типа ЧВ = k*120/ET.
Потом возникла проблема, что на разных частотах вращения время ET может неприлично растягиваться и сжиматься, поэтому я с помощью функции CTRL_HSC сделал пересчет порога 120 импульсов в реальном времени на основе предыдущего значения измеренной частоты вращения.
Это тахометрический способ измерения частоты вращения. Отличие от метода Frequency заключается в том, что тут время не является фиксированной величиной, фиксировано число импульсов. В frequency наоборот: время фиксировано, число импульсов переменное (но всегда целое число - в этом и недостаток). Этот метод прекрасно работает, но не сказать, что элегантное решение.

Элегантное решение возможно на CPU121xC v4.1 или v4.0, где появился новый счетчик HSC_Period. Этот функционал предназначен для вычисления периода между соседними импульсами с наносекундной точностью. К сожалению, я не успел попробовать эту штуку, но в скором времени обязательно попробую!
Последний раз редактировалось Михайло 18 авг 2017, 16:20, всего редактировалось 1 раз.


VaBo
освоился
освоился
Сообщения: 273
Зарегистрирован: 21 июл 2013, 18:32
Имя: Вадим
Благодарил (а): 7 раз
Поблагодарили: 8 раз

Счетчик оборотов

Сообщение VaBo » 18 авг 2017, 16:17

Оставлю ссылку на отличную (по моему мнению) статью по методам измерения частоты. Вдруг пригодится...
http://www.leoniv.diod.club/projects/me ... fc-510.pdf

Аватара пользователя

Автор темы
megavolt86
авторитет
авторитет
Сообщения: 872
Зарегистрирован: 14 ноя 2013, 19:35
Имя: Анатолий Сергеевич
Откуда: Башкортостан
Благодарил (а): 8 раз
Поблагодарили: 21 раз

Счетчик оборотов

Сообщение megavolt86 » 18 авг 2017, 18:17

Михайло писал(а): HSC_Period
Попробовал сегодня...не понял что он измеряет, на стенде двигатель с частотником, датчиком считаю проход шпонки, разгоняю до 900 оборотов( по частотнику). В режиме измерения частоты 14-15 гц, в режиме период значение накапливалось быстрыми темпами, за минуту гдето до 10 000 (в формате dint), если бы это было время периода то сразу бы появилось число и менялось не так сильно.
И никакой информации не нашел по данному типу скоростного счетчика.
alex_ugrumov писал(а): называется оператором цикла
А как в цикле то реализовать сумматор? Прежде чем увеличить сумму на текущее значение необходимо уменьшить сумму на самое старое значение. В цикле можно разве несколько раз обрабатывать одно и то же значение?
alex_ugrumov писал(а): А почему это вы интересно работаете по одним параметрам, а показываете другие?
Теоретически текущая частота оборотов взаимосвязана со скоростью...
VaBo писал(а): статью по методам измерения частоты
Спасибо, добавил в свой справочник.
:ext_secret:


Михайло
почётный участник форума
почётный участник форума
Сообщения: 2614
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
Благодарил (а): 1 раз
Поблагодарили: 75 раз
Контактная информация:

Счетчик оборотов

Сообщение Михайло » 18 авг 2017, 20:24

Я тоже тыкался в HSC_Period стандартными средствами и у меня ничего не получилось. Потом я уже понял, что там обязательно надо использовать какую-то новую функцию. Надо читать системный мануал.

Аватара пользователя

Автор темы
megavolt86
авторитет
авторитет
Сообщения: 872
Зарегистрирован: 14 ноя 2013, 19:35
Имя: Анатолий Сергеевич
Откуда: Башкортостан
Благодарил (а): 8 раз
Поблагодарили: 21 раз

Счетчик оборотов

Сообщение megavolt86 » 21 авг 2017, 16:40

Михайло писал(а): использовать какую-то новую функцию
Попробовал, вызвал блок, настроил но данные все равно непонятные читает:
dec.png
Непонятно...в хелпе написано что elapsed time это время, но формат dint. Поменял в вачтабле формат переменной на time, вот что получилось:
time.png
Еще и счетчик фронтов показывает ~200.
В итоге плюнул и решил организовать подсчет времени между импульсами и по этому времени считать скорость:
переменные.png
код.png
Проверял правильность подсчета, вполне соответствует (+-2оборота).
Для малых скоростей (до100 об/мин) время замеряется между двумя импульсами, при скорости более 100 об/мин время замеряется между 15 импульсами.
Может кому пригодится)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
:ext_secret:


mrmbleid
Сообщения: 1
Зарегистрирован: 05 июл 2018, 09:26
Имя: Александр

Счетчик оборотов

Сообщение mrmbleid » 05 июл 2018, 11:20

Добрый день! :ges_help:
Я только осваиваю программирование и столкнулся с аналогичной проблемой на работе.
Есть CPU314C-2DP и многооборотный датчик pvm58n-011agr0bn-1213. Задача считать с него импульсы и перевести в обороты в минуту. Получил сколько оборотов он сделал но есть проблема с тем что dint когда перепрыгивает в минус то обороты отображается неверно.Вот мое решение:
2.png
Если есть возможность подсказать как сделать это все более корректно буду благодарен. Понимаю только в FBD.
Спасибо за понимание) :oops:
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Ответить

Вернуться в «ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)»