А что задать?
Я пытался как мог, все работает. (Описал вроде ранее)
Либо скорость большая и на выходе ошибка.
Вариантов то немного))
Вид для печати
Разберём то, какие команды выдаёт ФБ дельты.
В двух словах:
0) График частоты от импульсов в документации дельты неправильный. А чего вы хотели от документа 2006 года? :D
1) При использовании ступенек дельта генерирует рваный ритм движения -- это нехорошо ни для оборудования, ни для пропуска импульсов
2) Если количество ступенек равно количеству импульсов на разгон, то ритм уже не рваный, но при этом нагрузка на ШД увеличением скорости тоже растёт, а у всех ШД крутящий момент с увеличением скорости лишь падает. Т.е. с точки зрения использования характеристик ШД алгоритм странный
Но там есть ещё одно но. Я не знаю с какой точностью дельта может выдерживать частоту.
В вычислениях ниже предполагается, что точность частоты импульсов выдерживается точно.
На 93-ей странице показано как устроен алгоритм разгона.
Вложение 26654
Из этого можно вынести, что разгон выполняется по ступенькам. На каждой ступеньке одинаковое количество импульсов, количество ступенек задаётся пользователем.
Дальше там рассматривается случай: "начальная скорость 1кГц, конечная 10кГц, 100Гц шаг ступеньки, 10000 импульсов на весь разгон".
Рассчитаем этот случай: должно быть (10'000Гц-1'000Гц)/(100Гц/ступенька) == 90 ступенек. В каждой из них примерно по 111 = 10000/90 импульсов.
Строить будем в r-system
График "частота от количества проделанных импульсов" выглядит почти линейно. Ну, разумеется, там же все ступеньки одинаковой длины, и ступенек 90 штук. Выглядит как ломанная прямая.Код:delta <- data.table(i=seq(1, 10000))
delta[, freq := ((i-1) %/% 111) * 100 + 1000] # %/% это целочисленное деление
delta[, dt := 1/freq]
delta[, t:=cumsum(dt)] # сумма интервалов с накоплением
ggplot(delta, aes(i, freq))+geom_point()+scale_x_continuous("Количество импульсов")+scale_y_continuous("Частота, Гц")+ggtitle("Delta PLC, разгон от 1кГц до 10кГц шагами по 100Гц за 10000 импульсов")
Уже тут становится очевидно, что в документации delta косяк. По крайней мере, в русской версии.
Теоретический график
Вложение 26710
А вот что у дельты:
Вложение 26646
Ясно видно, что у них неправильно изображена форма "разгона". Скорее всего, это ошибка copy-paste. Т.е. они тупо скопировали другой график и не подумали, что реально график так выглядеть не будет.
Copy-paste или нет, но это 100% ошибка дельты.
Посмотрим как будет выглядеть график "частота от времени":
Вложение 26711Код:ggplot(delta, aes(t, freq))+geom_point()+scale_x_continuous("Время, сек")+scale_y_continuous("Частота, Гц")+ggtitle("Delta PLC, разгон от 1кГц до 10кГц шагами по 100Гц за 10000 импульсов")
Тут график похож на тот, который показан в документации. В документации говорится, что "макс частота" достигается через 2606мс, а, согласно нашим вычислениям это должно произойти через 2607 мс. Совпало с точностью до миллисекунд -- т.е. норм.
Эти миллисекунды не столь важны, как сама форма кривой.Код:> tail(delta, 15)
i freq dt t
1: 9986 9900 0.0001010101 2.606330
2: 9987 9900 0.0001010101 2.606431
3: 9988 9900 0.0001010101 2.606532
4: 9989 9900 0.0001010101 2.606633
5: 9990 9900 0.0001010101 2.606734
6: 9991 10000 0.0001000000 2.606834
7: 9992 10000 0.0001000000 2.606934
8: 9993 10000 0.0001000000 2.607034
9: 9994 10000 0.0001000000 2.607134
10: 9995 10000 0.0001000000 2.607234
11: 9996 10000 0.0001000000 2.607334
12: 9997 10000 0.0001000000 2.607434
13: 9998 10000 0.0001000000 2.607534
14: 9999 10000 0.0001000000 2.607634
15: 10000 10000 0.0001000000 2.607734
Попробуем посмотреть как зависит форма кривой от количества ступенек в лестнице.
Вложение 26713Код:d <- data.table()
for(n in c(2, 4, 8, 16, 128)) {
d2 <- data.table(i=seq(1, 10000))
pulses_per_step <- 10000 %/% n
d2[, freq := (i %/% pulses_per_step)*((10000-1000) %/% n) + 1000]
d2[, dt := 1/freq]
d2[, t:=cumsum(dt)]
d2[, nsteps:=n]
d <- rbind(d, d2)
}
ggplot(d, aes(t, freq))+geom_point()+scale_x_continuous("Время, сек")+scale_y_continuous("Частота, Гц")+ggtitle("Delta PLC, разгон от 1кГц до 10кГц")+facet_grid(nsteps~.)
Особого смысла изучать случай "малого" количества ступенек нет. Понятно, что при ступеньках будут те самые рывки. Например, в случае когда всего 2 ступеньки, движок сначала долго фигачит на 1кГц, а потом бах -- сразу переключается на 5.5кГц.
Кому интересно, может попробовать доказать, но, практика показывает, что кривая близка к экспоненте при увеличении количества шагов.
Собственно, случай "на каждой ступеньке ровно по одному импульсу":
Вложение 26649Код:delta <- data.table(i=seq(1, 9000))
delta[, freq := i+1000]
delta[, dt := 1/freq]
delta[, t := cumsum(dt)]
ggplot(delta, aes(t, freq)) +
geom_point() +
scale_x_continuous("Время, сек") +
scale_y_continuous("Частота, Гц") +
ggtitle("Delta PLC, разгон от 1кГц до 10кГц")+
geom_smooth(formula = log(freq) ~ t, color="red")
О чём говорит "экспоненциальный закон изменения частоты от времени"?
О том, что ускорение тоже экспоненциально возрастает от этого самого времени.
Узнаем этот самый эксп. закон:
Иными словами, freq == exp(6.908)*exp(t) == 1000.245 * exp(t)Код:> lm(log(delta$freq) ~ delta$t)
Call:
lm(formula = log(delta$freq) ~ delta$t)
Coefficients:
(Intercept) delta$t
6.908 1.000
Ускорение это производная от частоты, и она будет тоже равна 1000.245 * exp(t). Единицы измерения другие, но формула та же (просто у константы 1000.245 разная размерность, которая нас не волнует).
Собственно, строим самый главный график: "нагруженности движка от частоты".
Нагруженность движка линейно зависит от ускорения, поэтому достаточно построить график "ускорения от частоты".
Но у нас же частота равна ускорению!
Т.е. график будет выглядеть так:
Вложение 26650Код:ggplot(delta, aes(freq, freq)) +
geom_point() +
scale_x_continuous("Частота, Гц") +
scale_y_continuous("Ускорение (нагрузка на ШД), Гц/сек") +
ggtitle("Delta PLC, нагрузка на ШД при разгоне от 1кГц до 10кГц")
О чём это говорит? Кто догадался -- молодец.
Кто не догадался -- расскажу.
Возьмём график крутящего момента от скорости вращения для какого-нибудь ШД. Не абы какого, а такого, который у прибориста.
На самом деле, у всех ШД этот график примерно одинаково выглядит, но проще оперировать реальными цифрами, а не мифическими.
Собственно, ШД ES-MH33480
График:
Вложение 26651
Видно, что на малых оборотах движок может развить силу больше 8 Н*м, а с увеличением скорости его сила падает.
Иными словами, дёрнуть с места он может хорошо, а как раскрутится его "тяга" ослабевает.
Т.е. для эффективного использования мощности этого движка, нужно начинать с большого ускорения (задействовать мощный крутящий момент в начале), а потом сбавлять это самое ускорение, чтобы нагрузка на вал не превышала максимальный крутящий момент движка.
Собственно на картинке:
Вложение 26653
Какие отсюда можно сделать выводы:
1) В самом экспоненциальном разгоне смысла мало. Видно что красная кривая ("кривая дельты") упирается в скорость 10 rpm. И эту скорость никак не превысить. Разумеется, конкретная скорость зависит от конкретных цифр, но не суть. Я говорю, что "нет простого способа" сказать дельте "перестань увеличивать ускорение".
Конечно, можно начать играться с количеством ступенек, то при перескоке с одной на другую могут быть неприятные дёрганья -- большие ускорения, а значит, возможны и выходы за кривую возможностей движка.
Конечно, ещё есть вариант делать "составное движение", но если его для этого и будут использовать, то не от хорошей жизни, а от безысходности. Честно говоря, мне лень проверять, но, скорее всего, составное движение в случае дельты не поможет, т.к. движение от 1кГц до 5кГц шагами по 1Гц + движение от 5кГц до 10кГц шагами по 1Гц по факту будут выглядеть точно так же, как и движение от 1кГц сразу до 10кГц этими же шагами по 1Гц. Я просто не исключаю того факта, что в дельте-таки может быть какой-нибудь извратный способ разогнать ШД и при этом не наращивать ускорение при самом разгоне.
2) Кривая с постоянным ускорением тоже рано или поздно упирается в предел движка. Т.е. на определённых оборотах движок уже не может поддерживать нужное ускорение.
Но если реально нужны большие обороты, то можно просто с самого начала указать более маленькое ускорение.
Да, время выхода на режим увеличится, но на режим выйдет.
3) Крутящий момент нужно измерять на "максимально необходимых для данной установки оборотах". Разумеется, указывать нужно не то значение, при котором начали возникать пропуски импульсов, а с неким запасом.
4) Если говорить про "пропуски импульсов", то более важно "сглаживать" не начало пути, а конец -- тот момент, где тяга у движка ослабевает, и нужно снижать нагрузку.
5) В случае "идеальной" кривой (ну, когда сначала ускорение плавно растёт, а потом уменьшается), конечно, по-полной используются возможности движка, но есть шанс, что "горб"-таки выйдет за границы возможностей.
Как отлаживать S-кривую, чтобы она не выходила за границы допустимых нагрузок -- фиг знает.
С каким-нибудь регистратором реального крутящего момента (нагрузки на движок) было бы, конечно, удобнее, но сомневаюсь, что их массово используют.
Скорее всего, нужно делать некое подобие "с плавным выходом на постоянное ускорение", а потом "с плавным переходом на нулевое ускорение == на равномерное движение". Но тут эти самые "плавные выходы", скорее, не для пропуска импульсов будут служить, а для того, чтобы уменьшить толчки оборудования.
Та же самая дельта генерирует большой толчок в конце разгона. У неё ускорение на протяжении всего разгона растёт, а потом сразу меняется на нулевое.
Можешь ещё эксперимент провести: поставить малое ускорение разгона, и попытаться раскрутить до большой скорости?
Просто у ШД крутящий момент падает с увеличением скорости вращения (см последнюю картинку), а мой блок сейчас выдаёт константное ускорение.
Т.е. если нужно достичь большей скорости нужно ставить меньшее ускорение.
Тут, скорее, из спортивного интереса. В спецификации энкодера сказано, что он до 200кГц, и "слова упирается в 23-25кГц" звучат странно.
Насколько я понял все более менее нормально. Но для полноценных испытаний нужен именно ШД и драйвер к нему. У сервопривода драйвер более совершенен и менее требователен к качеству сигнала подаваемого на вход Step.
Дмитрий Артюховский, может вы подсобите в этом вопросе. У вас есть железо для проведения полноценных испытаний, и опыта у вас ого-го-го сколько. Надо отбросить амбиции и подключиться к общему делу.
Тут не надо никакого осциллографа. Запомните положение вала двигателя. Подайте на драйвер столько импульсов чтобы вал двигателя повернулся ровно на 1 оборот и посмотрите результат. Еще лучше подать столько импульсов чтобы вал повернулся ровно на 10 или 100 оборотов. Если возникнет существенная ошибка в угле поворота вала, то это визуально будет видно.
https://www.google.ru/search?tbm=isc...988&gws_rd=ssl
Полноценный драйвер, стоит недорого, есть аналог с более высоким дроблением шага.
если совсем лень паять обвес из кондёра, сопротивлений и перемычек, можно взять комплект.
https://ru.aliexpress.com/item/Free-...8.0.116.74Vk0X
Цеплял этот драйвер к обычному контроллеру от омрона.
Полноценный мелкий шаговик вроде этого:
https://ru.aliexpress.com/item/2-4-3...8.0.124.74Vk0X
можно найти в старом струйнике от эпсона, причём вместе с железяками для линейного перемещения, т.е. нагрузку можно менять и визуально наблюдать за работой.
На побаловаться можно взять шаговик от сидюка, но от драйвера по ссылке ток сложно для него настроить при питании от 12В.
посмотреть протестированный код на тему рампы можно здесь
https://github.com/grbl/grbl
искать выполнение команды G00, там же можно глянуть поиск исходного положения.
в файле gcode.c разбор поступивших команд и вызов функций
есть ещё один пример, простой и не совсем допиленный.
http://www.pjrc.com/teensy/td_libs_AccelStepper.html
Инструкцию от Дельты конечно смотреть нужно, вроде не плохо сделано, у современных даже круговая интерполяция есть.
Но в Омроне всё таки управление шаговиком намного удобнее в использовании, и в отличие от дельты можно налету менять скорость и координаты.
http://www.techtrends.ru/docs/omron/...OperManual.pdf
-----------------------
По поводу правильной рампы, думаю пока не стоит заморачиваться.
В омроне кстати разгон тоже ступенькой с интервалом в 4 мс.
Это что значит?
Рампа уже есть, и она линейная. Предлагается передалать на ступенчатую? Смысл?
Возможно, омрон/дельта делают ступенчатые рампы для того, чтобы как-то сэкономить процессорное время.
По факту, у сопроцессора ПЛК110 мощи хватает, а делать ему всё равно больше нечего.
Поэтому можно делать ту рампу, которая нужна без всяких условностей со ступеньками.
Я имел ввиду что и линейной достаточно
Это отличная проверка. Не поленись и сделай. Задай как можно больше полных оборотов вала двигателя и посмотри результат. Таким образом будет проверено правильно ли ФБ формирует заданное количество импульсов.
Можно в ПЛК написать тестовую программу, которая даст ФБ 10 заданий повернуть вал на 10 оборотов (итого будет 100 оборотов).
Каждый раз будет разгон и торможение. Получится отличная проверка.