1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

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

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

Автор темы
megavolt86
эксперт
эксперт
Сообщения: 1172
Зарегистрирован: 14 ноя 2013, 20:35
Имя: Анатолий Сергеевич
Страна: Россия
город/регион: Башкортостан
Благодарил (а): 13 раз
Поблагодарили: 65 раз

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

Сообщение megavolt86 »

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

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

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

Сообщение alex_ugrumov »

В чём вопрос то?
Массив из 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
эксперт
эксперт
Сообщения: 1172
Зарегистрирован: 14 ноя 2013, 20:35
Имя: Анатолий Сергеевич
Страна: Россия
город/регион: Башкортостан
Благодарил (а): 13 раз
Поблагодарили: 65 раз

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

Сообщение megavolt86 »

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

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

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

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

Сообщение alex_ugrumov »

Вы вырвали расчёт из контекста.
В оригинале было
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
эксперт
эксперт
Сообщения: 1172
Зарегистрирован: 14 ноя 2013, 20:35
Имя: Анатолий Сергеевич
Страна: Россия
город/регион: Башкортостан
Благодарил (а): 13 раз
Поблагодарили: 65 раз

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

Сообщение megavolt86 »

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

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

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

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

Сообщение alex_ugrumov »

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

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3558
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

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

Сообщение Михайло »

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
частый гость
частый гость
Сообщения: 441
Зарегистрирован: 21 июл 2013, 19:32
Имя: Вадим
город/регион: Северодвинск
Благодарил (а): 12 раз
Поблагодарили: 38 раз

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

Сообщение VaBo »

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

Автор темы
megavolt86
эксперт
эксперт
Сообщения: 1172
Зарегистрирован: 14 ноя 2013, 20:35
Имя: Анатолий Сергеевич
Страна: Россия
город/регион: Башкортостан
Благодарил (а): 13 раз
Поблагодарили: 65 раз

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

Сообщение megavolt86 »

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

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3558
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

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

Сообщение Михайло »

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

Автор темы
megavolt86
эксперт
эксперт
Сообщения: 1172
Зарегистрирован: 14 ноя 2013, 20:35
Имя: Анатолий Сергеевич
Страна: Россия
город/регион: Башкортостан
Благодарил (а): 13 раз
Поблагодарили: 65 раз

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

Сообщение megavolt86 »

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

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

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

Сообщение mrmbleid »

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

v0v
не первый раз у нас
не первый раз у нас
Сообщения: 343
Зарегистрирован: 12 дек 2018, 14:47
Имя: Влад
Благодарил (а): 1 раз
Поблагодарили: 44 раза

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

Сообщение v0v »

Мне кажется датчик можно использовать как относительный при подаче сигнала на PQD для предустановленного положения. Тогда количества импульсов хватит до конца цикла.
Ответить

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