Просмотр полной версии : Hardella IDE
Newcomer
18.01.2017, 13:57
Да, оба варианта правильные, как я и говорил в 509 (http://www.owen.ru/forum/showthread.php?t=23013&page=51&p=233864&viewfull=1#post233864)
А почему тогда у меня энкодер нормально не опрашивается ?
Newcomer
18.01.2017, 14:00
Sulfur, выложи, пожалуйста, свой работающий проект, сделанный в Hardella. Может я что-то не так сделал в своем проекте.
Да, можно так.
Буду пробовать.
Sulfur, выложи, пожалуйста, свой работающий проект, сделанный в Hardella.
Пожалуйста:
Newcomer
18.01.2017, 14:06
Спасибо, буду смотреть.
Newcomer
18.01.2017, 15:35
Не пойму как вHardella в коде вставить это - @Export(position) Всю клавиатуру истыкал.
Владимир Ситников
18.01.2017, 15:40
Не пойму как вHardella в коде вставить это - @Export(position) Всю клавиатуру истыкал.
Обсуждали же.
подвести на переменную и нажать alt+enter.
или подвести на переменную и нажать мышкой на появившуюся лампочку
или посмотреть документацию: https://hardella.com/docs/pru/data-exchange/#Передача-данных-в-pru
Реакцию на @ сделаю.
Newcomer
18.01.2017, 19:36
Sulfur, у вас энкодер какой тип выхода имеет, n-p-n ОК или PUSH-PULL ?
Точное название вашего энкодера привести можете ?
.
SulfurТочное название вашего энкодера привести можете ?
.
В моем проекте используются два энкодера. Один полноценный ABZ, модель Autonics E80H30-360-6-L-24. Другой тоже полноценный, но используется только одна фаза. Модель Baumer EIL580P-T, 500имп\об, выход HTL/push-pull.
Оба энкодера подключены напрямую ко входам FDI1..FDI4 ПЛК.
Newcomer
18.01.2017, 21:00
У меня проект, с двумя ШД и одним энкодером, сделанный в Hardella заработал. Выяснилось, что брендовый энкодер вышел из строя, заменили на китайский (стоит в 3,5 раза дешевле ;)) и все закрутилось.
Хвала Владимиру Ситникову.
Skype сообщает, что у Владимира сегодня День рождения. Мои искренние поздравления по этому случаю.
Newcomer
18.01.2017, 21:10
В моем проекте используются два энкодера. Один полноценный ABZ, модель Autonics E80H30-360-6-L-24. Другой тоже полноценный, но используется только одна фаза. Модель Baumer EIL580P-T, 500имп\об, выход HTL/push-pull.
Оба энкодера подключены напрямую ко входам FDI1..FDI4 ПЛК.
Оба ваших энкодера имеют активные выходы. Интересно как вы их подключили к ПЛК. У меня Autonics с push-pull выходом поработал несколько месяцев и отказал.
Я выходы энкодера нагружал входами ПЛК110[М02], запитанными от +24 В.
Владимир Ситников
18.01.2017, 21:44
Skype сообщает, что у Владимира сегодня День рождения. Мои искренние поздравления по этому случаю.
Спасибо, все так!
Всего наилучшего, успехов в делах, с ДР
Владимир Ситников
19.01.2017, 02:10
Всего наилучшего, успехов в делах, с ДР
Спасибо огромное!
Оба ваших энкодера имеют активные выходы. Интересно как вы их подключили к ПЛК.
ПЛК питается от +24, от этого же напряжения запитаны оба энкодера, выходы подключены непосредственно ко входам ПЛК. Подключены только прямые выходы (+А,+В,+Z). Инверсные выходы не используются.
По поводу Аутониксов. Применяем довольно большие Е80Н, у них отмечалась проблема - разрушение шлейфа между верхней и нижней платой, т. к. он довольно жесткий. Меняли на штучные провода во фторопластовой изоляции.
Newcomer
19.01.2017, 13:40
Какие состояния может принимать выходной параметр state ?
Имеется в виду это - SteppersConfig_Pru0MemoryTransfer.STEPPER_PRU0_ste pper_state
Меня, в частности, интересует как узнать, что ШД отработал задание.
Владимир Ситников
19.01.2017, 14:02
Какие состояния может принимать выходной параметр state ?
Ну enum же. Можно взять и посмотреть. Какие-то проблемы с этим? Посмотреть можно как в Hardella, так и в КДС.
Либо в документации:
https://hardella.com/docs/pru/examples/step-motor/
Ответ на этот вопрос даёт выходной параметр state...
Newcomer
19.01.2017, 15:04
Владимир, так правильно будет определить что ШД отработал задание ?
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN STEPPER1_PRU1_stepper_enable := FALSE; END_IF
Владимир Ситников
19.01.2017, 15:05
Владимир, так правильно будет определить что ШД отработал задание ?
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN STEPPER1_PRU1_stepper_enable := FALSE; END_IF
Да, можно так.
Newcomer
19.01.2017, 15:09
Да, можно так.
А вы бы как сделали ?
Newcomer
19.01.2017, 15:18
Еще один вопрос. Как мне получить на входе Step драйвера ШД рампу прямоугольного вида. Т.е. исходная частота 0, далее
сразу 20 000 Гц, после отработки 1000 импульсов частота сразу 0. Какие параметры нужно задать для этого ?
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := FALSE,
STEPPER1_PRU1_stepper_accel_ramp := 20000,
STEPPER1_PRU1_stepper_decel_ramp := 20000,
STEPPER1_PRU1_stepper_max_speed := 20000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 1000,
STEPPER1_PRU1_stepper_enable := TRUE,
);
Владимир Ситников
19.01.2017, 17:06
А вы бы как сделали ?
Да пёс его знает. Можно и так и сяк делать. Всё зависит от того, что первое в голову придёт. Зависит от настроения и конкретной задачи.
Например, Sulfur переписал энкодер и убрал CASE/ENUM из программы.
Да, то что он написал выглядит простым и понятным. Но и мой вариант с CASE тоже простой и понятный.
Вот, честное слово, не вижу почему один или другой способ был бы лучше или хуже. Поэтому и не спешу менять на тот вариант, который сделал Sulfur.
Добавлять в примеры "второй вариант написания одного и того же" тоже особого смысла не вижу.
Другое дело, если у Sulfur проект заработает в железе, то тогда можно (и я бы хотел) пример в Hardella заменить и обновить документацию. Тогда будет гораздо проще описать "постановку задачи", и объяснять как что связано (в PRU программе, в КДС программе, в реальных энкодерах и т.п.).
Более того, это хорошо, что простой инженер без специальной "PRU подготовки" может сделать свою PRU программу "как он видит".
Одной из целью Hardella и была возможность написания своих программ, а там уж сколько людей столько и мнений. Кому-то нравятся ENUM'ы, а кому-то брюнетки.
Еще один вопрос. Как мне получить на входе Step драйвера ШД рампу прямоугольного вида. Т.е. исходная частота 0, далее
сразу 20 000 Гц, после отработки 1000 импульсов частота сразу 0. Какие параметры нужно задать для этого ?
Чтобы выдать команду без разгона и торможения нужно указывать accel_ramp :=0, decel_ramp := 0, max_speed := 20000, quantity := 10000
Newcomer
19.01.2017, 18:56
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN ; END_IF
Владимир, что в вышеприведенном выражении есть STOP_STEPPER_RUN_STATE ?
В моей программе эта штука нигде не объявлена, но компилятор CoDeSys не выдает ошибку.
Владимир Ситников
19.01.2017, 19:02
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN ; END_IF
Владимир, что в вышеприведенном выражении есть STOP_STEPPER_RUN_STATE ?
Это одно из значений ENUM
Откройте в КДС закладку "types" (вроде, так называется). Она внизу слева. Там будет этот ENUM и можно будет посмотреть остальные значения
Sulfur переписал энкодер и убрал CASE/ENUM из программы.
Да, то что он написал выглядит простым и понятным. Но и мой вариант с CASE тоже простой и понятный.
Вот, честное слово, не вижу почему один или другой способ был бы лучше или хуже.
В первую очередь я решал свою задачу. Примененный мной алгоритм энкодера успешно работает уже несколько лет на ПЛК старой модификации (естественно не в ПРУ). Но Ваш алгоритм точнее и "правильнее".
Другое дело, если у Sulfur проект заработает в железе, то тогда можно (и я бы хотел) пример в Hardella заменить и обновить документацию. Тогда будет гораздо проще описать "постановку задачи", и объяснять как что связано (в PRU программе, в КДС программе, в реальных энкодерах и т.п.)
Проект работает в железе (на аппаратном эмуляторе), скоро сделаю отчет в своей теме ПЛК110.60[М2] + энкодер + счетчик (http://www.owen.ru/forum/showthread.php?t=23600&page=14).
это хорошо, что простой инженер без специальной "PRU подготовки" может сделать свою PRU программу "как он видит".
Выражаю огромную благодарность за организацию и поддержку проекта Hardella. И, кстати, моя основная проф.деятельность отнюдь не программирование.
Newcomer
21.01.2017, 11:37
To В.Ситников. В ФБ для ШД enable после отработки заданного количества импульсов лучше переводить в состояние FALSE в самом ФБ. Это избавит от лишних телодвижений в программе CoDeSys. В моем проекте, где надо управлять ШД каждая мс на счету.
Владимир Ситников
21.01.2017, 12:10
To В.Ситников. В ФБ для ШД enable после отработки заданного количества импульсов лучше переводить в состояние FALSE в самом ФБ. Это избавит от лишних телодвижений в программе CoDeSys. В моем проекте, где надо управлять ШД каждая мс на счету.
А как вы себе представляете?
PRU же никак не может заставить основную программу передавать что-то другое.
Допустим, миллисекунда на счету. И что? В чём проблема-то?
Основная программа: "PRU, передаю enable=true".
PRU: "Вас понял, enable=true, запускаем ШД" <--- !!!
Основная программа: "PRU, передаю enable=true".
PRU: "Вас понял, всё ещё enable=true, продолжаем крутить ШД"
Основная программа: "PRU, передаю enable=true".
PRU: "Вас понял, всё ещё enable=true, продолжаем крутить ШД"
Основная программа: "PRU, передаю enable=true".
PRU: "Вас понял, всё ещё enable=true, продолжаем крутить ШД"
...
Основная программа: "PRU, передаю enable=true".
PRU: "А мне похрен, ШД отработал, поэтому enable=false"
Основная программа: "PRU, передаю enable=true".
PRU: "Вас понял, enable=true, запускаю ШД" <---!!!
Если enable будет сбрасываться само собой, то будут автоколебания. Поэтому сейчас и сделано, что enable так и остаётся true, но ШД переходит в состояние STOP и не продложает движение до передёргивания enable.
Newcomer
21.01.2017, 12:51
Я в своей программе не делаю постоянно это - Основная программа: "PRU, передаю enable=true". Я это сделал 1 раз и жду когда ФБ отработает задание.
Владимир Ситников
21.01.2017, 13:08
Я в своей программе не делаю постоянно это - Основная программа: "PRU, передаю enable=true". Я это сделал 1 раз и жду когда ФБ отработает задание.
Ещё раз: синхронизируются ВСЕ переменные при каждом обмене.
Невозможно, "просто прочитать одну переменную". Всегда запишутся последние значения всех переменных "на запись" и прочитаются тех, которые должны прочитаться.
Иными словами, вызов MemoryTransfer() (без параметров) всё равно запишет enable, и он запишет то значение, которое в последний раз указывалось.
Newcomer
21.01.2017, 13:22
Если прочитать из PRU без перезаписи всех переменных нельзя, то может разделить чтение и запись ?
Cделать MemoryRead() и MemoryWrite(). Это будет более гибкий подход.
Владимир Ситников
21.01.2017, 14:05
Или прочитать состояние из PRU без перезаписи всех переменных нельзя ? Если так, то может разделить чтение и запись ?
Cделать MemoryRead() и MemoryWrite(). Это будет более гибкий подход.
Да, разделение на чтение и запись имеет смысл, но оно само по себе не решит проблему.
Поясню: сейчас записываются все переменные.
Допустим, в программе "простое управление выходом + ШД". Как сделать так, чтобы "команда управления выходом передалась, а ШД.enable нет"?
Делать "MemoryWriteStepperEnable(..); MemoryWriteDirectOut(..)"? (т.е. каждую переменную обменивать через свой вызов?)
Один только запуск ШД чего будет стоить. Штук 5 параметров передавать через 5 вызовов разных MemoryWrite.
Гибко? Да. Удобно? Вряд ли.
Можно, конечно, ввести "группы обмена". Так, чтобы для всех write переменных в одной группы создавался один блок.
Например, группа переменных для ШД, другая для управления ещё чем-нибудь.
Но сможет ли это кто-то настроить?
Вот сейчас даже с простым добавлением @Export проблемы.
Владимир Ситников
21.01.2017, 14:10
Или считается, что при MemoryWrite будут записываться все переменные и "это норма"?
Newcomer
21.01.2017, 14:20
Или считается, что при MemoryWrite будут записываться все переменные и "это норма"?
Главное разделить во времени чтение и запись (пишем все, но не читаем ничего, или читаем все, но не пишем ничего). То что будет все скопом писаться и все скопом читаться не является проблемой на мой взгляд.
Владимир Ситников
21.01.2017, 14:32
Главное разделить во времени чтение и запись (пишем все, но не читаем ничего, или читаем все, но не пишем ничего). То что будет все скопом писаться и все скопом читаться не является проблемой на мой взгляд.
А как же случаи "мне только выход обновить, но ШД.enable трогать нельзя"?
Newcomer
21.01.2017, 14:44
А как же случаи "мне только выход обновить, но ШД.enable трогать нельзя"?
С enable проблема.
Владимир Ситников
21.01.2017, 14:48
С enable проблема.
Аналогично: "мне только количество импульсов / скорость поправить, а enable не трогать". В общем, я пока не вижу удобного решения. Возможно, после разделения read/write станет понятнее, но само разделение, по-моему, проблему enable решит только в небольшом количестве случаев.
Newcomer
21.01.2017, 14:57
А можно сделать так, что если значение передаваемой переменной не поменялось, то на приемной стороне соответствующее присвоение не делать. Т.е. то, что изменилось обновляем, а то что не изменилось не трогаем.
Newcomer
21.01.2017, 15:28
Еще один интересный вопрос. Достаточно однажды вызвать SteppersConfig_Pru*MemoryTransfer() чтобы в текущем цикле основной программы произошел обмен ?
Владимир Ситников
21.01.2017, 15:34
Еще один интересный вопрос. Достаточно однажды вызвать SteppersConfig_Pru*MemoryTransfer() чтобы произошел обмен ?
Нет, не достаточно. Технически, при обмене могут быть проблемы (возможно, при запуске PRU есть задержка между подачей команды на включение и тем, как PRU начинает выполнять пользовательскую программу).
Из-за этого, MemoryTransfer внутри выполняет до 100 попыток. Я ни разу не видел, чтобы первых нескольких оказывалось бы недостаточно.
Newcomer
21.01.2017, 15:44
Нет, не достаточно. Технически, при обмене могут быть проблемы (возможно, при запуске PRU есть задержка между подачей команды на включение и тем, как PRU начинает выполнять пользовательскую программу).
Из-за этого, MemoryTransfer внутри выполняет до 100 попыток. Я ни разу не видел, чтобы первых нескольких оказывалось бы недостаточно.
MemoryTransfer надо вызывать 100 раз ? Это какое же время может занять обмен ?
Какой ужас, это удар под дых. ;)
Как узнать, что обмен произошел ?
Владимир Ситников
21.01.2017, 17:52
MemoryTransfer надо вызывать 100 раз ? Это какое же время может занять обмен ?
Во-первых, 100 попыток делается при каждом вызове MemoryTransfer.
Во-вторых, как правило, срабатывает с первой попытки.
Как узнать, что обмен произошел ?
У MemoryTransfer есть счётчики количества ошибок записи и чтения. В очередной версии добавлю просто флаги "была ли ошибка при последнем вызове".
Newcomer
22.01.2017, 11:18
Во-первых, 100 попыток делается при каждом вызове MemoryTransfer.
Во-вторых, как правило, срабатывает с первой попытки.
У MemoryTransfer есть счётчики количества ошибок записи и чтения. В очередной версии добавлю просто флаги "была ли ошибка при последнем вызове".
И все таки. Что может случиться если MemoryTransfer вызвать только один раз ? Межпроцессорный обмен может не состояться ?
Владимир Ситников
22.01.2017, 11:38
И все таки. Что может случиться если MemoryTransfer вызвать только один раз ? Межпроцессорный обмен может не состояться ?
Теоретически, может. Вероятность такого события не знаю.
Newcomer
22.01.2017, 17:47
Сделал простой тестовый проект. Для ПЛК110-Х.30[М02]. PRU0 управляет драйвером мощного ШД и опрашивает энкодер, PRU1 управляет драйвером маломощного ШД.
1. Энкодер опрашивается нормально.
2. Вал мощного ШД начинает медленно вращаться при подаче питания на ПЛК еще до запуска программы, т.е. PRU0 почему-то начинает работать. После запуска программы ШД нормально разгоняется и работает как и должно быть.
3. Вал маломощного ШД после запуска программы должен попеременно вращаться в разные стороны, однако этого не происходит. Двигатель однократно отрабатывает вращение в одну сторону и оператор CASE застревает на шаге 5.
Владимир Ситников
22.01.2017, 18:20
2. Вал мощного ШД начинает медленно вращаться при подаче питания на ПЛК еще до запуска программы, т.е. PRU0 почему-то начинает работать. После запуска программы ШД нормально разгоняется и работает как и должно быть.
Программа Hardella появляется в PRU только после вызова Init.
Если ШД начинает крутиться до вызова Init, то это означает, что прошивка ПЛК выдаёт импульсы. Это странно, т.к. ОВЕН утверждают, что М02 импульсы просто так не выдаёт.
Тут либо проверять на ПЛК с пустой программой, либо пробовать играться с plc configuration (менять fast outputs на direct control или подобное).
Если мигание выходов происходит непосредственно в момент заливки программы (непосредственно в момент выполнения Init), то, конечно, нездорово.
3. Вал маломощного ШД после запуска программы должен попеременно вращаться в разные стороны, однако этого не происходит. Двигатель однократно отрабатывает вращение в одну сторону и оператор CASE застревает на шаге 5.
А что отладчик показывает?
Ну, чему равны значения в блоке Pru1MemoryTransfer?
Владимир Ситников
22.01.2017, 18:26
оператор CASE застревает на шаге 5.
В программе ошибка есть:
5: (* Анализ *)
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN
SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_enable := FALSE; N := 10; END_IF
Так не работает. Нужно реально вызвать MemoryTransfer чтобы "передёрнуть enable".
Сейчас же получается, что значение false никогда в PRU1 не передаётся, поэтому этот ШД так и не начинает крутиться в обратную сторону.
Newcomer
22.01.2017, 19:07
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE);
Так надо ?
Это я поправлю, но на шаге 5 оператора CASE не по этой причине застревает.
Вот эта проверка не срабатывает:
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE); N := 10; END_IF
Владимир Ситников
22.01.2017, 19:17
Вот эта проверка не срабатывает:
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN
Скажу прямо: я НЕ телепат.
Зачем писать "эта проверка не срабатывает", если можно взять, посмотреть в чему равны переменные и понять что пошло не так?
Newcomer
22.01.2017, 19:22
SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE
Это равенство не наступает.
Newcomer
22.01.2017, 19:25
Владимир, а по пункту 2 поста #559 что-то можете сказать ? Что это может быть ?
Владимир Ситников
22.01.2017, 19:34
Владимир, а по пункту 2 поста #559 что-то можете сказать ? Что это может быть ?
Всё сказал в #560.
Владимир Ситников
22.01.2017, 19:35
SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE
Это равенство не наступает.
И? Вывод какой?
Или вопрос какой?
Newcomer
22.01.2017, 19:57
С пунктом 2 разобрались - наводки на длинных проводах. Из-за этого вход Step драйвера и дергается.
Newcomer
22.01.2017, 20:16
И? Вывод какой?
Или вопрос какой?
После запуска программы ШД покрутился в одну сторону и остановился
SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state равно ACCEL_STEPPER_RUN_STATE
т.е. показывает разгон, хотя произошли разгон, торможение и останов.
Владимир Ситников
22.01.2017, 20:37
После запуска программы ШД покрутился в одну сторону и остановился
SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state равно ACCEL_STEPPER_RUN_STATE
т.е. показывает разгон, хотя произошли разгон, торможение и останов.
Замечательно.
Внимание, вопрос: кто по-вашему будет обновлять значение STEPPER1_PRU1_stepper_state?
Пушкин?
Может, всё-таки вызвать MemoryTransfer?
Newcomer
22.01.2017, 20:44
5: (* Анализ *)
SteppersConfig_Pru1MemoryTransfer();
IF (SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_s tepper_state = STOP_STEPPER_RUN_STATE) THEN
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE); N := 10; END_IF
Так правильно будет ?
Владимир Ситников
22.01.2017, 20:47
Да, верно.
Newcomer
22.01.2017, 20:57
Ура ! Теперь все заработало как и было задумано. Спасибо Владимиру Ситникову.
На счет разделения входных\выходных переменных обмена. Все таки склоняюсь к мнению, что раздельно было бы удобнее. В принципе работает и так как есть, однако раздельно будет более информативно и понятно. Во вложении пример реализации обмена с чтением из ПРУ в начале цикла и записью в ПРУ в конце цикла. Пример опробован на реальном железе, проблем пока не выявил.
Newcomer
23.01.2017, 12:37
На счет разделения входных\выходных переменных обмена. Все таки склоняюсь к мнению, что раздельно было бы удобнее. В принципе работает и так как есть, однако раздельно будет более информативно и понятно
Так, в нашем полку прибыло. ;) Это заявка на будущее. Я пока буду делать свой проект как есть.
Скачал, распаковал, я как понял hardella.bat запускать...
Ошибка A Java Exception has occurred.
В консоли
java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b18)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b18, mixed mode)
Владимир Ситников
24.01.2017, 10:38
Скачал, распаковал, я как понял hardella.bat запускать...
Да, всё так.
Ошибка A Java Exception has occurred.
Ещё какие-нибудь детали есть?
Файл hs_err_pid, случаем, рядом не создался?
Можете прислать содержимое папки %USERPROFILE%\.IDE61131-15\system\log ?
Да, всё так.
Ещё какие-нибудь детали есть?
Файл hs_err_pid, случаем, рядом не создался?
Можете прислать содержимое папки %USERPROFILE%\.IDE61131-15\system\log ?
хм... нет ни файла такого нигде, ни папки .IDE61131-15
система на S:\
Hardella на E:\Programs\Hardella\Hardella-1.6.1-win\Hardella 1.6.1
IDEA стоят, работают.
с правами админа попробуйте первый раз запустить, может поможет
с правами админа попробуйте первый раз запустить, может поможет
пробовал, и на C:\ распаковал заного, таже ошибка
Владимир Ситников
24.01.2017, 11:07
хм... нет ни файла такого нигде, ни папки .IDE61131-15
система на S:\
Hardella на E:\Programs\Hardella\Hardella-1.6.1-win\Hardella 1.6.1
Можете в hardella.bat файле заменить слово start на echo, запустить, и прислать вывод?
Т.е. заменить
start "" "%JAVA%" %JVM_ARGS% %ADDITIONAL_JVM_ARGS% -classpath "%CLASSPATH%" %MAIN_CLASS% %*
на
echo "" "%JAVA%" %JVM_ARGS% %ADDITIONAL_JVM_ARGS% -classpath "%CLASSPATH%" %MAIN_CLASS% %*
После этой строки можно добавить сроку pause, чтобы окно не закрывалось.
Возможно, используется ещё какая-то jvm.
IDEA стоят, работают.
У IDEA JDK встроены в поставку. Возможно, и мне стоит включить jdk, чтобы было меньше подобных проблем.
%JAVA% у меня не прописан кстати.
Можете в hardella.bat файле заменить слово start на echo, запустить, и прислать вывод?
Т.е. заменить
start "" "%JAVA%" %JVM_ARGS% %ADDITIONAL_JVM_ARGS% -classpath "%CLASSPATH%" %MAIN_CLASS% %*
на
echo "" "%JAVA%" %JVM_ARGS% %ADDITIONAL_JVM_ARGS% -classpath "%CLASSPATH%" %MAIN_CLASS% %*
После этой строки можно добавить сроку pause, чтобы окно не закрывалось.
Возможно, используется ещё какая-то jvm.
У IDEA JDK встроены в поставку. Возможно, и мне стоит включить jdk, чтобы было меньше подобных проблем.
"" "S:\Program Files (x86)\Java\jdk1.7.0_51\bin\javaw.exe" "-Dintellij.config.imported.in.current.session=true" "-Didea.paths.selector=IDE61131-15" "-Dide.mac.message.dialogs.as.sheets=false" "-Dapple.awt.graphics.UseQuartz=true" "-Didea.java.redist=NoJavaDistribution" "-Dfile.encoding=UTF-8" "-client" "-Xss1024k" "-ea" "-Xmx950m" "-XX:NewSize=256m" "-XX:+HeapDumpOnOutOfMemoryError" "-Xverify:none" -classpath "S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\branding.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\hardella-boot.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\mps-boot.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\mps-boot-util.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\boot.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\bootstrap.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\util.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\jdom.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\log4j.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\extensions.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\trove4j.jar;S:\test\Hardella-1.6.1-win\Hardella 1.6.1\lib\jna.jar;S:\Program Files (x86)\Java\jdk1.7.0_51\lib\tools.jar" com.hardella.com.intellij.idea.Main
поменял на jre1.8.0_45, запустил, спасибо
Владимир Ситников
24.01.2017, 11:20
"" "S:\Program Files (x86)\Java\jdk1.7.0_51\bin\javaw.exe" ...
Т.е. у вас настроена java 1.7.
Как вариант, можно в начало hardella.bat добавить строку, в которой указать путь до java 1.8 (пишу наугад, конкретный путь проверьте у себя)
set JAVA_HOME=S:\Program Files (x86)\Java\jdk1.8.0_66
Т.е. у вас настроена java 1.7.
Как вариант, можно в начало hardella.bat добавить строку, в которой указать путь до java 1.8 (пишу наугад, конкретный путь проверьте у себя)
set JAVA_HOME=S:\Program Files (x86)\Java\jdk1.8.0_66
да, увидел.
запутала меня винда, вывод version говорит 1.8, а в %JAVA_HOME% 1.7, спасибо, ждите вопросов по IDE ;)
Пока ничего не удалось запустить. вылезло вопросов несколько.
Скажу сразу, пока мне PRU не нужен, хочу удобно писать проект под ПЛК 100 КМ, таргет увидел, вроде можно писать.
1) Создал пустой проект, PLC Project, PLC model: 3S Codesys PLCWinNT V2.4, ok
2) Создался с lamp и TOF, ок, нажимаю run->Edit Configurations-> add Codesys, Configuration = RunConfiguration, ok
3) Run -> открылся codesys с такими ошибками
Ошибка: Ошибка при выполнении команды 'project build'
что не так?
- - -
Запустил с таргетом ПЛК 100 КМ, потом run-> ... так же как и выше
Codesys с ошибкой, но потом еще раз перекомпилировал, оказалось lamp не определён нигде.
Или надо обладать некой магией, которой я не обладаю или ...
- - -
Боже, минут 5 не мог создать переменную.
объявляю
b:bool;
матюкается hardella, чего-то не так ей
пишу b:BOOL; -> пропустила
Меня даже codesys 2.3 поправляет с bool на BOOL, а hardella не знает.
Всё, спасибо за труды, может в другой раз.
Владимир Ситников
24.01.2017, 13:15
Запустил с таргетом ПЛК 100 КМ, потом run-> ... так же как и выше
Codesys с ошибкой, но потом еще раз перекомпилировал, оказалось lamp не определён нигде.
Или надо обладать некой магией, которой я не обладаю или
Дело в следующем:
1) В демо-проекте переменные lamp и button объявляются "в plc configuration"
2) Да, для 3S Codesys PLCWinNT V2.4 таргет не импортируется, поэтому в результирующем КДС проекте переменные lamp и button нигде не объявляются, и проект не компилируется. Наверное, стоит добавить сообщение "неизвестно куда в вашем таргете прописывать discrete inputs/outputs"
3) Для ПЛК 100 КМ нужно проверить. Я проверял только на таргетах ПКЛ110. У вас вообще PLC Configuration симпортировалось нормально? (слева в дереве проектов модуль cds. Там дожно быть plc configuration)
Дело в следующем:
1) В демо-проекте переменные lamp и button объявляются "в plc configuration"
2) Да, для 3S Codesys PLCWinNT V2.4 таргет не импортируется, поэтому в результирующем КДС проекте переменные lamp и button нигде не объявляются, и проект не компилируется. Наверное, стоит добавить сообщение "неизвестно куда в вашем таргете прописывать discrete inputs/outputs"
3) Для ПЛК 100 КМ нужно проверить. Я проверял только на таргетах ПКЛ110. У вас вообще PLC Configuration симпортировалось нормально? (слева в дереве проектов модуль cds. Там дожно быть plc configuration)
3) В том то и дело, button есть, а lamp нигде нет.
Тоесть часть переменных.
Владимир Ситников
24.01.2017, 18:49
Выпустил Hardella 1.6.2 (https://hardella.com/blog/2017/01/24/hardella-1.6.2-released/).
Можно скачать с сайта, а можно через автообновление.
Новые возможности:
Регистронезависимый ввод типов, имён переменных. Например, если ввести bool, то среда заменяет на BOOL
PRU: обмен данными с PRU был доработан, и теперь вместо одной программы MemoryTransfer создаются две (MemoryRead и MemoryWrite). Старая MemoryTransfer тоже пока создаётся (чтобы не ломать текущие проекты).
Исправлено:
Убраны лишние скобки после операции NOT
Подключать библиотеку pruAccessLib.lib больше не требуется (ранее она использовалась для определения online режима)
CoDeSys: поддержка PLC100 таргетов в демо проекте (демо проект не работал, т.к. не мог найти discrete output)
3) В том то и дело, button есть, а lamp нигде нет.
Тоесть часть переменных.
Это и про "невозможность написать bool" решено в 1.6.2
Это и про "невозможность написать bool" решено в 1.6.2
Ого, вот это скорость :) так бы в ОВЕН :)
Владимир Ситников
24.01.2017, 19:01
Ого, вот это скорость :)
Ну, про регистронезависимость capzap ещё в прошлом году писал:
27.12.2016, 18:33 нет просто набрать t i k I N n o t t i k не получается
Поэтому, где-то месяц задержка получилась.
Владимир Ситников
24.01.2017, 19:08
На самом деле, там большая проблема это как сделать понятную и удобную систему типов. Если кто подскажет -- буду рад
b : BYTE
b := b + 1;
Должен ли такой код работать?
А такой?
b : BYTE
w : WORD
b := 0;
w := b - 1; (* должно ли получиться 16#ffff или 16#00ff? *)
С технической точки зрения это дребедень, а не код, ведь, в BYTE и WORD являются наследниками типа ANY_BIT, а для этого типа не определены операции сложения и вычитания.
Тем не менее, подозреваю, что у всех в проектах есть сложение, вычитание, и, возможно даже умножение.
Поэтому остаётся либо запретить вообще подобные типы (ну прямо запретить сложение WORD'ов), либо ещё что-то.
Если посмотреть как сделана система типов, например, в java, то там любое сложение даёт int. Т.е. даже byte+byte складываем -- сразу получается int (это 4 байта).
Ещё есть особенный случай когда складывается long с чем-нибудь (там тоже получается long).
С одной стороны, конечно, странно всё время "добавлять приведения назад к байту", с другой, это снимает кучу головной боли.
Например, при таком подходе w окажется именно 16#ffff, а никак не 16#00ff.
Newcomer
24.01.2017, 19:37
На самом деле, там большая проблема это как сделать понятную и удобную систему типов. Если кто подскажет -- буду рад
b : BYTE
b := b + 1;
Должен ли такой код работать?
В CoDeSys 2.3 работает, значит у вас то же так должно быть.
А такой?
b : BYTE
w : WORD
b := 0;
w := b - 1; (* должно ли получиться 16#ffff или 16#00ff? *)
В CoDeSys w получается 16#ffff
Зачем вообще думать. Делайте по аналогии с CoDeSys.
Владимир Ситников
24.01.2017, 19:47
В CoDeSys 2.3 работает, значит у вас то же так должно быть.
Казалось бы, но нет.
Должно работать так, чтобы можно было писать программу и не задумываться.
В случае с CoDeSys каждый второй раз удивляются "откуда берётся fffff в энкодерах", слёзно просят DINT значение энкодера и прочее.
Тема "signed vs unsigned" возникает и в C/C++ -- там это тоже огромный источник ошибок, опечаток и головной боли.
Хорошо бы, конечно, вообще запретить беззнаковые типы.
В CoDeSys w получается 16#ffff
Зачем вообще думать. Делайте по аналогии с CoDeSys.
В том-то и проблема с CoDeSys, что никакой последовательности нет. Там нет общего правила, а есть лишь куча исключительных случаев.
Собственно, вопрос: какого типа является константа 1 в выражении b - 1?
Это BYTE? SINT? USINT? INT?
А, ведь, от этого сильно зависит, например, результат b XOR -1. Если правильно помню, то b XOR -1 в КДС не компилируется.
Rake Runner
24.01.2017, 20:15
Собственно, вопрос: какого типа является константа 1 в выражении b - 1?
Это BYTE? SINT? USINT? INT?
Отвечает Игорь Петров (http://prolog-plc.ru/pb1):
28921
А я думаю надо делать явно
w := BYTE_TO_WORD(b - 1);
иначе
16#ffff
Владимир Ситников
24.01.2017, 20:33
Отвечает Игорь Петров (http://prolog-plc.ru/pb1):
28921
"минимально необходимый".
И что является минимально необходимым для 1?
BYTE, SINT или USINT? (все три типа занимают 1 байт и могут принимать значение 1)
Я понимаю, что "можно написать USINT#1". Но кто-нибудь реально так пишет?
Много ли кто знает, что так вообще можно написать?
Если честно, я склоняюсь к модели "делать все вычисления в знаковых типах".
Но если так делать, то dword_var := dword_var + 1; начинает ругаться "вы тут приводите DINT к DWORD'у" И тут
либо разрешать такое приведение (делать так, чтобы не ругалось)
либо требовать запись dword_var := TO_DWORD(dword_var + 1); Выглядит, конечно, неуклюже.
либо переучивать всех на DINT тип: dint_var := dint_var + 1; "математически" правильно, но чего-то я сомневаюсь в осуществимости.
Rake Runner
24.01.2017, 20:45
Я бы предположил, что USINT, поскольку 1 - это положительное (так что не имеет смысла делать его SINT) целое число (так что не BYTE, который bit string).
Но лучше уточнить у первоисточника (IEС-61131 можно без особых проблем нагуглить).
Владимир Ситников
24.01.2017, 21:10
Я бы предположил, что USINT, поскольку 1 - это положительное (так что не имеет смысла делать его SINT) целое число (так что не BYTE, который bit string).
Но лучше уточнить у первоисточника (IEС-61131 можно без особых проблем нагуглить).
В том-то и дело, что в стандарте не сказано как должно работать.
Я пересмотрел ещё раз
IEC STANDARD 61131-3 Second edition 2003-01, Part 3:Programming languages
Там по поводу typed literals сказано только то, что они есть.
Правил вычисления там нет.
Разве что сказано, как работает деление отрицательных чисел, и что в результате 0/0 должно получаться 0.
А я думаю есть еще один хороший источник - это OSCAT
Я раньше тоже не совсем понимал зачем там все переменные (которые мне попадались, за всю библиотеку не скажу) знаковые. А константы имеют вид INT#1. Сейчас сам так пишу.
В случае с CoDeSys каждый второй раз удивляются "откуда берётся fffff в энкодерах", слёзно просят DINT значение энкодера и прочее.
Не уверен, что мое наблюдение будет полезным, но все же выскажусь.
В моем ПРУ-проекте переменная показаний энкодера имеет тип WORD, в ПЛЦ_ПРГ я присваиваю это значение переменной типа INT. Никаких ошибок ни при компиляции, ни при работе не возникает. Т.е. без всяких дополнительных преобразований. Просто делаю ПЛЦ_ПРГ_vol (INT) := ПРУ_vol (WORD). Естественно 16#FFFF в ПРУ-перемнной отображаются в ПЛЦ-ПРГ как -1. Результат устраивает.
Вопрос к В.Ситникову. Что будет, если во время работы ШД поменять quantity в SteppersConfig_PruMemoryTransfer не передергивая enable ?
Владимир Ситников
25.01.2017, 13:42
Вопрос к В.Ситникову. Что будет, если во время работы ШД поменять quantity в SteppersConfig_PruMemoryTransfer не передергивая enable ?
Не надо так делать.
В некоторых случаях может сработать, но если реально нужно, то нужно выяснять какое именно поведение нужно и реализовывать его.
Добрый вечер.
STEPPER2_Enc_PRU0_stepper_accel_ramp : WORD;
STEPPER2_Enc_PRU0_stepper_decel_ramp : WORD;
Нет ли возможности сделать эти переменные DWORD, ибо надо получить космическое ускорение.
Владимир Ситников
01.02.2017, 18:54
Добрый вечер.
STEPPER2_Enc_PRU0_stepper_accel_ramp : WORD;
STEPPER2_Enc_PRU0_stepper_decel_ramp : WORD;
Нет ли возможности сделать эти переменные DWORD, ибо надо получить космическое ускорение.
А какое ускорение нужно?
Может, вообще без него тогда?
А какое ускорение нужно?
Может, вообще без него тогда?
Что значит без него тогда ?
Надо чтобы частота сразу скакнула до max_speed.
Владимир Ситников
01.02.2017, 19:01
Что значит без него тогда ?
Надо чтобы частота сразу скакнула до max_speed.
Если надо сразу, то надо указывать accel_ramp=0. Если нужно, чтобы останавливалось сразу, то decel_ramp=0
Если надо сразу, то надо указывать accel_ramp=0. Если нужно, чтобы останавливалось сразу, то decel_ramp=0
Если ускорение и торможение нулевые, то скорость вообще меняться не должна и не меняется. Пробовал.
Владимир Ситников
01.02.2017, 19:23
Если ускорение и торможение нулевые, то скорость вообще меняться не должна и не меняется. Пробовал.
Значение accel_ramp=0 рассматривается отдельно.
Вот фрагмент блока PRU_STEPPER:
29081
Т.е. при accel_ramp=0 блок ШД должен сразу переходить в состояние RUN и шпарить на максимальной скорости.
Другое дело, что при подобном использовании у тех кто тестировал наблюдались пропуски импульсов. С ускорением было лучше.
ramp порядка 65500 означает, что частота 65кГц наберётся за 1 секунду. Этого же наверняка должно хватать?
ramp порядка 65500 означает, что частота 65кГц наберётся за 1 секунду. Этого же наверняка должно хватать?
А если я подаю на драйвер максимум 200 кГц, то при ramp 65535 понадобится порядка 3 сек. и быстрее не получится.
У вас
STEPPER2_Enc_PRU0_stepper_max_speed : DWORD;
STEPPER2_Enc_PRU0_stepper_min_speed : DWORD; (тут зачем DWORD ?)
а
STEPPER2_Enc_PRU0_stepper_accel_ramp : WORD;
STEPPER2_Enc_PRU0_stepper_decel_ramp : WORD;
Т.е. частоту можно задать ого го какую, а ускорение нет.
Владимир Ситников
01.02.2017, 19:44
А если я подаю на драйвер максимум 200 кГц, то при ramp 65535 понадобится порядка 3 сек. и быстрее не получится.
А нужно быстрее? Движок/система точно смогут?
За сколько нужен разгон до 200 кГц?
Там сейчас основное ограничение в том, что компилятор не умеет использовать память, а использует только регистры.
В результате, если все переменные объявлять как DWORD'ы, то может на остальную программу не хватить регистров (их там примерно 30 штук у каждого PRU ядра).
Еще интересный вопрос: что min_speed может быть не нулевым ?
А нужно быстрее? Движок/система точно смогут?
В некоторых случаях надо очень быстро разгоняться и замедляться.
Владимир Ситников
01.02.2017, 19:59
Еще интересный вопрос: что min_speed может быть не нулевым ?
Да, может.
Владимир Ситников
01.02.2017, 20:00
В некоторых случаях надо очень быстро разгоняться и замедляться.
Очень быстро это сколько в секундах и герцах?
Очень быстро это сколько в секундах и герцах?
Например 200 кГц за 1 секунды.
Да, может.
А имеет смысл делать min_speed DWORD ?
Владимир Ситников
01.02.2017, 20:42
А имеет смысл делать min_speed DWORD ?
Хороший вопрос. Можно и его сделать WORD.
Например 200 кГц за 1 секунды.
Тут нужно подумать.
Не хочется сейчас брать и менять на DWORD.
Одному нужно одно, а другому другое.
Скорее всего, само вычисление так и оставить WORD'ом, просто считать, что передаётся "ускорение, делённое на 4".
Т.е. значение accel_ramp=1 будет означать ускорение 4 Гц/сек2, значение accel_ramp=65535 будет означать 65535*4=262140 Гц/сек2
Вряд ли кто-то сильно заметит разницу между ускорением 100 и 101 Гц/сек2.
Но вот чтобы не приходилось в КДС программе "предварительно делить на 4", нужно сделать так, чтобы на КДС стороне это было REAL, а непосредственно перед передачей в PRU оно само делилось на что там нужно. Что-нибудь в таком духе.
Я думаю пока переделывать ничего не надо.
Не могу найти где в этой теме писалось о быстром ШИМ.
Владимир Ситников
03.02.2017, 19:13
Не могу найти где в этой теме писалось о быстром ШИМ.
Какой вопрос?
Вот про ШИМ: https://hardella.com/docs/pru/examples/fast-pwm/
В Hardella есть блок и для дельта-сигма модуляции (про неё было тут: http://www.owen.ru/forum/showthread.php?t=23013&page=23&p=229447&viewfull=1#post229447 )
Блок называется PDM_DW: https://hardella.com/docs/pru/standard-library/#pdm_dw
Есть потребность в быстром ШИМ. В связи с этим есть такие вопросы:
1) какие .exp файлы надо импортировать в проект CoDeSys;
2) как обратиться к ФБ ШИМ в программе CoDeSys.
При работе с ФБ ШД обращение такое:
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_stepper_accel_ramp := 50000,
STEPPER1_PRU1_stepper_decel_ramp := 50000,
STEPPER1_PRU1_stepper_max_speed := 10000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 1000,
STEPPER1_PRU1_stepper_enable := TRUE
);
А как будет в случае с ШИМ ? Там в теле будет всего 2 строчки. Нужно имя программы и что внутри.
Типа так ?
PWM_DWConfig_Pru0MemoryTransfer(
PWM_DW_PRU0_value := 100,
PWM_DW_PRU0_period := 200
);
value и period мерятся в мкс ?
Владимир Ситников
03.02.2017, 20:42
Типа так ?
PWM_DWConfig_Pru0MemoryTransfer(
PWM_DW_PRU0_value := 100,
PWM_DW_PRU0_period := 200
);
value и period мерятся в мкс ?
Примерно так, но:
1) value и period измеряются в "количестве PRU циклов".
value задаёт то, сколько PRU циклов будет TRUE на выходе ШИМ, а (period-value) определяет то, сколько потом будет циклов с FALSE.
2) микросекунды настраиваются в PRU Configuration. Там указывается длительность PRU цикла. У PRU0 и PRU1 может быть разная длительность цикла.
Интервал ШИМ будет period * длительность_pru_цикла.
Например, если указать длительность PRU цикла 1 мкс, указать period=100, value=30, то на выходе будет так:
30 мкс TRUE
70 мкс FALSE
30 мкс TRUE
70 мкс FALSE
30 мкс TRUE
70 мкс FALSE
...
Если указать длительность PRU цикла 0.5 мкс, указать period=100, value=30, то на выходе будет так:
15 мкс TRUE
35 мкс FALSE
15 мкс TRUE
35 мкс FALSE
15 мкс TRUE
35 мкс FALSE
...
Какие .exp файлы надо импортировать в проект CoDeSys ?
Владимир Ситников
03.02.2017, 20:46
Какие .exp файлы надо импортировать в проект CoDeSys ?
Hardella генерирует ровно 1 exp файл, его-то и нужно импортировать.
Название совпадает с названием pru configuration, и оно отображается в окошке "run" снизу.
Спасибо, буду пробовать. Хочу использовать быстрый ШИМ для управления частотой вращения вала ШД. Т.е. раскручиваем ШД (кстати, разгонять можно будет по любому закону - хоть по линейному, хоть по криволинейному), а далее меняем частоту вращения во времени. Красота. ;)
Владимир Ситников
03.02.2017, 21:03
Спасибо, буду пробовать. Хочу использовать быстрый ШИМ для управления частотой вращения вала ШД. Т.е. раскручиваем ШД (кстати, разгонять можно будет по любому закону), а далее меняем частоту вращения во времени. Красота. ;)
А смысл?
Чем не подошёл сам блок ШД?
Вообще, конечно, если количество импульсов не важно, частота небольшая, то, да, может сработать.
А смысл? Чем не подошёл сам блок ШД?
А как можно при помощи стандартного блока ШД произвольно регулировать скорость вращения вала ШД во времени ? Постоянно дергать enable ? Но это же не comme il faut. ;)
Вообще, конечно, если количество импульсов не важно, частота небольшая, то, да, может сработать.
Почему частота не может быть большой ? 500 кГц - это мало ? Мне за глаза хватит. ;) Не на каждый драйвер ШД можно подать такую частоту.
Владимир Ситников
03.02.2017, 21:35
А как можно при помощи стандартного блока ШД произвольно регулировать скорость вращения вала ШД во времени ? Постоянно проверять и дергать enable ?
Нужно ли?
Почему частота не большая. 500 кГц - это мало ? Мне за глаза хватит. ;)
Ну, у основного цикла ПЛК частота порядка 1кГц, т.е. подача команд в PRU будет "не чаще, чем раз 1 миллисекунду".
Конечно, никто не запрещает 2 раза за цикл ПЛК вызвать memoryread/memorywrite, но это всё-таки странновато будет.
С другой стороны, можно сделать гибрид: использовать хвалёный "20мкс таймер" в режиме, скажем "100мкс" (чтобы не влиять на служебные программы ПЛК) и из этого "100мкс цикла" подавать команды в PRU.
Управляющих воздействий раз в 100мкс в целом, должно хватать на довольно большой спектр задач.
Но, конечно, программировать и отлаживать такое сложнее.
Нужно ли?
В моей задаче нужно.
Но, конечно, программировать и отлаживать такое сложнее.
А чего там сложного ? В слепую можно все отладить.
А то, что ШД можно будет разгонять по любому закону разве это не фишка ? Иные ШД бывают очень капризные. ;)
Ну, у основного цикла ПЛК частота порядка 1кГц, т.е. подача команд в PRU будет "не чаще, чем раз 1 миллисекунду".
В подавляющем большинстве случаев этого будет более чем достаточно.
Владимир Ситников
03.02.2017, 22:01
В моей задаче нужно.
Если действительно так, то, может, будет развитие.
А то чего-то поговорили-поговорили, кто-то попробовал, но "вестей с полей" не слышно и не видно.
А чего там сложного ? В слепую можно все отладить.
Ну, я несильно верю в слепую отладку.
Какие-то ошибки я на эмуляторе нашёл.
Если действительно так, то, может, будет развитие.
Управление ШД посредством быстрого ШИМ весьма перспективно. Можно гибко и плавно управлять частотой вращения вала ШД. Плавное управление частотой вращения вала двигателя посредством стандартного ФБ ШД невозможно. Там будут заметны рывки.
А то чего-то поговорили-поговорили, кто-то попробовал, но "вестей с полей" не слышно и не видно.
Все путем, Hardella рулит, достойной альтернативы ей на сегодняшний день нет, а реальные проекты уже есть. Вы сделали большое дело. Проект надо несомненно развивать.
Будет замечательно и справедливо если фирма "ОВЕН" окажет материальную поддержку проекту.
Не оскудеет рука дающего. ;)
Есть мудрые люди в фирме "ОВЕН" ?
Владимир Ситников
04.02.2017, 13:25
Управление ШД посредством быстрого ШИМ весьма перспективно. Можно гибко и плавно управлять частотой вращения вала ШД. Плавное управление частотой вращения вала двигателя посредством стандартного ФБ ШД невозможно. Там будут заметны рывки.
Ну это как посмотреть.
В режиме "разгон" и в режиме "торможение" частота меняется как раз по линейному закону. Рывков как раз нет.
Вполне возможно стоит не просто ШИМ блоком управлять, а сделать адаптированный блок.
1) Как минимум, нужно добавлять счётчик импульсов. Так, чтобы этот "ШИМ" мог остановиться при достижении нужного количества.
2) Более того, ШИМ в чистом виде будет плохо подходить для управления на больших частотах, т.к. разница в 1 мкс весьма существенно будет изменять частоту.
Например: 11 мкс это 91кГц, 10 мкс это 100кГц, а 9 мкс это уже 110 кГц.
В этом плане текущий блок ШД генерирует импульсы немного разной ширины, чтобы в среднем оказалась нужная частота.
3) Теоретически, можно подумать о блоке, который генерирует переменную частоту, чтобы ему можно было указать начальную-конечную частоту, и чтобы он генерил импульсы. Т.е. вынести "планирование траектории из PRU".
Если посмотреть на 1-2-3 ещё раз, то получится блок, который несильно отличается от текущего. Отличие лишь в том, что вычисление траектории вынесется в КДС код, а в PRU блок будут передаваться команды типа "нач.частота 0, разгон=1кГц/сек", "не меняем частоту, разгон=0кГц/сек", "не меняем частоту, как достигнем 1000 импульсов включаем замедление=1кГц/сек", "как достигнем 1700 импульсов останавливаемся".
Из кусочков линейного ускорения можно будет и S-кривую собрать.
Ну это как посмотреть.
В режиме "разгон" и в режиме "торможение" частота меняется как раз по линейному закону. Рывков как раз нет.
Для того чтобы поменять скорость надо будет сбросить ее до 0 и только потом можно будет задать новое значение скорости. Вот это и есть плохо.
Использовать быстрый ШИМ для управления ЩД для задач позиционирования не целесообразно. Есть задачи, в которых мощный ШД вращает режущий инструмент или заготовку. В таких задачах надо сделать разгон, а далее иметь возможность регулировать скорость вращения. Вот здесь быстрый ШИМ и нужен.
Владимир Ситников
04.02.2017, 14:58
Для того чтобы поменять скорость надо будет сбросить ее до 0 и только потом можно будет задать новое значение скорости. Вот это и есть плохо.
Ещё раз: текущий блок ШД сделан так, чтобы его было легко использовать. Указываем количество импульсов и поехали.
Ничто не мешает сделать блок генерации импульсов с нарастанием/убыванием частоты. Разумеется, никаких сбросов до 0 там не нужно.
Ещё раз: текущий блок ШД сделан так, чтобы его было легко использовать. Указываем количество импульсов и поехали.
Ничто не мешает сделать блок генерации импульсов с нарастанием/убыванием частоты. Разумеется, никаких сбросов до 0 там не нужно.
С этим никто не спорит. Hardella предоставляет море возможностей. Можно легко и быстро реализовать желаемое.
To Vladimir Sitnikov.
Владимир, реально ли на базе встроенного в Hardella блока управления шаговым двигателем сделать его модификацию. Хочу вместо stepper_accel_ramp: WORD и stepper_decel_ramp: WORD сделать один stepper_ramp: DWORD. Вместо stepper_min_speed: DWORD сделать stepper_min_speed: WORD.
Мне надо получить приращение частоты порядка 5...10 кГц/мс.
Владимир Ситников
09.02.2017, 10:59
To Vladimir Sitnikov.
Владимир, реально ли на базе встроенного в Hardella блока управления шаговым двигателем сделать его модификацию. Хочу вместо stepper_accel_ramp: WORD и stepper_decel_ramp: WORD сделать один stepper_ramp: DWORD. Вместо stepper_min_speed: DWORD сделать stepper_min_speed: WORD.
Мне надо получить приращение частоты порядка 5...10 кГц/мс.
Блок можно скопировать в свой проект и отредактировать как нужно.
Будет ли достаточно точности для 5..10кГц/мс сходу не скажу. Не исключаю, что там могут возникнуть "эффекты округления", т.к. все вычисления производятся в целых числах.
Блок можно скопировать в свой проект и отредактировать как нужно.
Будет ли достаточно точности для 5..10кГц/мс сходу не скажу. Не исключаю, что там могут возникнуть "эффекты округления", т.к. все вычисления производятся в целых числах.
А то что я тупо поменяю формат переменных не повлияет на работу блока ?
Владимир Ситников
09.02.2017, 11:37
А то что я тупо поменяю формат переменных не повлияет на работу блока ?
Может повлиять. Надо смотреть как они там используются и править по месту.
Владимир Ситников
09.02.2017, 16:25
Не пойму что не так.
Скорее всего при изменении PRU_STEPPER на PRU_STEPPER1 не обновились ссылки в @Export
Простой вариант поправить это удалить и заново добавить @Export.
со stepper.Q возможно аналогичная картина. Т.е. подводим курсор на Q и либо стираем-пишем заново, либо ctrl+пробел и "перевыбираем" Q.
Сейчас уже не помню где автоматическая замена была сделана, а где нет.
Хорошо, попробую.
Вышло обновление Hardella. Если сделать обновление, что будет с ранее созданными проектами ?
Владимир Ситников
09.02.2017, 16:52
Вышло обновление Hardella. Если сделать обновление, что будет с ранее созданными проектами ?
Всё будет работать. Для порядка нужно перекомпилировать проект (не проверял нужно ли или нет).
Технически, если сохранить проект в новой версии старая его уже не сможет открыть.
Но то обновление (речь, ведь, про 1.6.2?) довольно давно вышло и там ничего существенно не менялось.
Всё будет работать. Для порядка нужно перекомпилировать проект (не проверял нужно ли или нет).
Технически, если сохранить проект в новой версии старая его уже не сможет открыть.
Но то обновление (речь, ведь, про 1.6.2?) довольно давно вышло и там ничего существенно не менялось.
А что есть более новое обновление ?
Владимир Ситников
09.02.2017, 17:18
А что есть более новое обновление ?
Не, 1.6.2 это последнее, которое я выпускал.
Мне просто показалось, что оно очень давно было, а по факту всего 2 недели назад.
По умолчанию среда проверяет обновления где-то раз в неделю.
Владимир, у меня 2 вопроса:
1) к примеру задал я stepper_ramp = 50 000 [Гц/сек], означает ли это, что за каждую мс частота будет увеличиваться ровно на
50 Гц ?
2) если задать не большое ускорение stepper_ramp, большую частоту stepper_max_speed и маленькое число импульсов stepper_quantity, то может получиться, что заданное количество импульсов будет отработано на этапе разгона; означает ли это, что как только заданное количество импульсов будет сгенерировано, то частота сразу упадет до нуля без этапа торможения ?
Владимир Ситников
19.02.2017, 16:20
1) к примеру задал я stepper_ramp = 50 000 [Гц/сек], означает ли это, что за каждую мс частота будет увеличиваться ровно на
50 Гц ?
Можно считать и так. Если точнее, то между каждыми двумя импульсами задержка уменьшается более-менее равномерно.
2) если задать не большое ускорение stepper_ramp, большую частоту stepper_max_speed и маленькое число импульсов stepper_quantity, то может получиться, что заданное количество импульсов будет отработано на этапе разгона; означает ли это, что как только заданное количество импульсов будет сгенерировано, то частота сразу упадет до нуля без этапа торможения ?
Если указано ненулевое замедление (decel_ramp), то блок совместит этапы ускорения и замедления так, чтобы общее количество импульсов оказалось равным заданному
Вот графики на эту тему. Каждая точка -- импульс. Под частотой понимается 1 / (t2-t1).
26718
26719
To В.Ситников.
Владимир, за какое время ПЛК выдаст на быстрый выход 400 импульсов при таком раскладе ?
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := FALSE,
STEPPER1_PRU1_stepper_accel_ramp := 100000,
STEPPER1_PRU1_stepper_decel_ramp := 0,
STEPPER1_PRU1_stepper_max_speed := 200000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 400,
STEPPER1_PRU1_stepper_enable := TRUE
);
Владимир Ситников
23.02.2017, 18:20
To В.Ситников.
Владимир, за какое время ПЛК выдаст на быстрый выход 400 импульсов при таком раскладе ?
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := FALSE,
STEPPER1_PRU1_stepper_accel_ramp := 100000,
STEPPER1_PRU1_stepper_decel_ramp := 0,
STEPPER1_PRU1_stepper_max_speed := 200000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 400,
STEPPER1_PRU1_stepper_enable := TRUE
);
Вообще говоря, в моем блоке ramp это word, поэтому подавать туда 100к это перебор.
Если блок написан правильно, то s=a*t2/2 - путь, пройденный за время t.
t=sqrt(2s/a)=sqrt(2*400/100000)=0,089 сек
Это время наберется скорость 0,089*100000=8900Гц
Decel_ramp равно нулю, т.е. будет остановка с этих 9кГц
PS Если будет проект, могу после выходных прогнать на эмуляторе - посмотреть что там получается
У меня задача выдать 400 импульсов за 6 мс. При постоянном значении ускорения сделать этого не получается. Можно задать ускорение максимум 800000 Гц/сек. При больших значениях ускорения ШД начинает пропускать импульсы.
Владимир Ситников
23.02.2017, 21:27
У меня задача выдать 400 импульсов за 6 мс. При постоянном значении ускорения сделать этого не получается. Можно задать ускорение максимум 800000 Гц/сек. При больших значениях ускорения ШД начинает пропускать импульсы.
Можно же запускать с ненулевой скорости?
S=v0*t+a*t2/2
V0=s/t-a*t/2=400/0,006-800000*0,006/2=64кГц
Если указывать min_speed=64300 и accelramp=800000, то 400 импульсов будет за 6мс
Что за задача такая?
При min_speed=64300 ШД вообще не сможет стартовать.
Владимир Ситников
23.02.2017, 22:24
При min_speed=64300 ШД вообще не сможет стартовать.
А откуда условие 400 за 6мс? Это вообще реализуемо на этом оборудовании?
А откуда условие 400 за 6мс? Это вообще реализуемо на этом оборудовании?
Если бы ускорение менялось по нелинейному закону то реализуемо.
Владимир Ситников
24.02.2017, 09:52
Если бы ускорение менялось по нелинейному закону то реализуемо.
Рассказывайте какой закон нужен.
Рассказывайте какой закон нужен.
Вот статья на эту тему.
Вот проекты. В ФБ Steper (Hardella) я заменил только формат переменных. У меня на драйвере ШД выставлено 4000 имп/оборот. В программе для ПЛК вал ШД 10 раз поворачивается на 36 градусов, т.е. делает полный оборот за 10 приемов. По значению Т1 можно оценить время, за которое совершается один полный оборот. Все работает, но вал ШД поворачивается на 36 градусов примерно за
25 мс, а надо за 6 мс. Чтобы было за 6 мс надо ставить ускорение порядка 22 000 000, но при таком большом постоянном ускорении вал ШД вообще перестает вращаться.
Рассказывайте какой закон нужен.
Вот еще интересная ссылка: http://www.microchip.ru/phorum/read.php?f=2&i=61970&t=61970
Владимир Ситников
24.02.2017, 17:33
Вот статья на эту тему.
Во всех этих статьях обсуждают равноускоренный разгон.
Надо будет на эмуляторе проверить. Возможно, одной замены WORD на DWORD недостаточно, и нужно внутри вычисления менять.
А что-нибудь такое можно сделать. Надо иметь возможность менять длительность и наклон каждого участка разгона.
Владимир Ситников
24.02.2017, 18:18
А что-нибудь такое можно сделать. Надо иметь возможность менять длительность и наклон каждого участка разгона.
Попробовать-то можно, но стоит помнить, что пройденный путь это площадь под графиком скорости (путь это интеграл V*dt). Чёрный график содержит меньше импульсов, чем красный.
Ещё момент: обычно у шд крутящий момент уменьшается с разгоном, поэтому по мере разгона ускорение нужно не увеличивать, а уменьшать.
S-кривая нужна не для скорости выполнения движения, а для плавности самого движения.
Рассказывайте какой закон нужен.
Можно такие законы попробовать - y = a*x*x + c; y = a*x*x*x + c; y = a*x*x*x*x + c;
Летом выкладывали РЭ на забугорный ПЛК с описанием ФБ для управления драйвером ШД. Там частота при разгоне менялась по нелинейному закону.
На графиках лучше всего смотрится кубическая парабола (синий цвет).
То В.Ситников.
Задал я к примеру так: STEPPER1_PRU1_stepper_accel_ramp := 500000
Правильно ли я понимаю, что за первую мс работы ФБ Steper выдаст 250 импульсов ?
Владимир Ситников
28.02.2017, 13:52
То В.Ситников.
Задал я к примеру так: STEPPER1_PRU1_stepper_accel_ramp := 500000
Правильно ли я понимаю, что за первую мс работы ФБ Steper выдаст 250 импульсов ?
s = a*t2/2 = 500000 * 0,001 * 0,001 / 2 = 0,25 имп.
Иными словами, в первую мс либо вообще не будет импульсов, либо будет один.
s = a*t2/2 = 500000 * 0,001 * 0,001 / 2 = 0,25 имп.
Иными словами, в первую мс либо вообще не будет импульсов, либо будет один.
Странно что-то. Через 1 сек. частота будет 500 000 Гц, а через 1 мс - 0 ? С какой дискретностью идет набор частоты ?
Владимир Ситников
28.02.2017, 14:52
Странно что-то. Через 1 сек. частота будет 500 000 Гц, а через 1 мс - 0 ?
Ну, да, а что такого?
Говорить о частоте самого первого импульса это вообще неблагодарное дело.
К сожалению, да, мы же не можем сделать половину импульса? Поэтому, да, вполне возможно, что первые несколько мс не выйдет ни единого импульса.
Если смотреть время, когда должен возникнуть каждый импульс (пока предлагаю не изучать вопрос должна ли тут быть середина единицы или какой-нибудь фронт), то получится такая формула
t = (2*s/a)0.5
Ускорение == 500'000 Гц/сек
Получается, что импульсы должны быть с такой задержкой:
Кол-во Время, мс
1 2,0
2 2,8
3 3,5
4 4,0
5 4,5
6 4,9
7 5,3
8 5,7
9 6,0
10 6,3
11 6,6
12 6,9
13 7,2
14 7,5
15 7,7
16 8,0
17 8,2
18 8,5
19 8,7
20 8,9
21 9,2
22 9,4
23 9,6
24 9,8
25 10,0
Дальше можно мухлевать как угодно.
Например, кто-то может сказать, что "ну, разумеется, первым импульсом мы называем второй, т.к. измерить интервал от бесконечно долгого нуля до первого импульса невозможно"
В момент "5мс" теоретическая скорость должна быть где-то 500000*0,005 == 2500Гц. Т.е. расстояние между импульсами должно быть примерно 0,4мс. Что и наблюдается: 5,3-4,9==0,4мс. 5,7-5,3==0,4мс
Ну и эта же самая таблица в районе 250-го импульса.
Видно, что в 31-ую мс придёт около 15-и импульсов (240...255). Это соответствует частоте 15000 кГц, что совпадает с теоретическим нарастанием частоты: 30мс * 500000 Гц/сек = 15000 Гц
240 31,0
241 31,0
242 31,1
243 31,2
244 31,2
245 31,3
246 31,4
247 31,4
248 31,5
249 31,6
250 31,6
251 31,7
252 31,7
253 31,8
254 31,9
255 31,9
256 32,0
257 32,1
258 32,1
259 32,2
260 32,2
PS. Таблицы выше это теоретические вычисления по школьной формуле. В PRU используется округление, поэтому результат может несколько отличаться, но должно быть довольно близко.
Владимир Ситников
28.02.2017, 14:55
С какой дискретностью идет набор частоты ?
У меня для каждого импульса вычисляется время, когда этот импульс должен наступить. Отдельных ступенек/дискретности нет.
Ещё некое влияние вносит "цикл PRU", который равен примерно 0,5...1,0мкс (его можно настраивать, но если уж настроить 0,5мкс, то все выдаваемые импульсы будут квантоваться на 0,5мкс)
Если у вас f = a * t, то через 1 мс должно быть так: f = 500000 * 0,001 = 500 Гц.
Владимир Ситников
28.02.2017, 15:00
Если у вас f = a * t, то через 1 мс должно быть так: f = 500000 * 0,001 = 500 Гц.
И? Продолжайте. В чём проблема-то?
Если частота через 1 мс 500 Гц, то среднее значение частоты за этот интервал будет 250 Гц, а это значит, что должно быть сгенерировано 250 импульсов как и думает Вольд. И я так думаю. ;)
Владимир Ситников
28.02.2017, 15:27
Если частота через 1 мс 500 Гц, то среднее значение частоты за этот интервал будет 250 Гц, а это значит, что должно быть сгенерировано 250 импульсов как и думает Вольд. И я так думаю. ;)
Это уж какая-то подгонометрия. Мы-то с вами понимаем, что на частоте 250 Гц эти самые 250 импульсов возникнут за 1 секунду, а не за 1 мс.
Или с другой стороны. Если за 1мс возникло 250 импульсов, то это частота 250 имп/0,001 сек==250'000 Гц. Есть разница между 250 Гц и 250 кГц?
Предлагаю дождаться Вольда.
Василий Кашуба
28.02.2017, 18:14
Странно что-то. Через 1 сек. частота будет 500 000 Гц, а через 1 мс - 0 ? С какой дискретностью идет набор частоты ?
Постройте график с дискретностью в 1 мс и в 1 гц, проведите прямую из нуля в противоположный угол графика и посмотрите какая частота будет на первой миллисекунде.
Магия больших чисел сыграла злую шутку. 250 Гц соответствует период 4 мс. Ясно что 250 импульсов с периодом 4 мс каждый в 1 мс не уместить.
Можно такие законы попробовать - y = x*x + c; y = x*x*x + c; y = x*x*x*x + c;
Летом выкладывали РЭ на забугорный ПЛК с описанием ФБ для управления драйвером ШД. Там частота при разгоне менялась по нелинейному закону.
На графиках лучше всего смотрится кубическая парабола (синий цвет).
Отвечу сам себе. Разгон ШД по таким законам не поможет решить мою заковыристую задачу. ;)
Результат будет еще хуже чем при линейном разгоне.
Вопрос о том как повернуть вал ШД на 45 градусов за 6 мс остается открытым.
Владимир Ситников
01.03.2017, 10:03
Отвечу сам себе. Разгон ШД по таким законам не поможет решить мою заковыристую задачу. ;)
Результат будет еще хуже чем при линейном разгоне.
Вопрос о том как повернуть вал ШД на 45 градусов за 6 мс остается открытым.
Выбирать более мощный ШД, чтобы он мог стартовать с нужной скорости. И/или уменьшать момент инерции на валу.
Я всё-таки ещё раз спрошу: откуда уверенность, что именно эта система (этот вал с этой нагрузкой) и именно этот ШД может обеспечить 45 градусов за 6мс?
Выбирать более мощный ШД, чтобы он мог стартовать с нужной скорости. И/или уменьшать момент инерции на валу.
Я всё-таки ещё раз спрошу: откуда уверенность, что именно эта система (этот вал с этой нагрузкой) и именно этот ШД может обеспечить 45 градусов за 6мс?
Более мощный ШД будет иметь большую массу ротора, а следовательно и больший момент инерции.
Работаю с тем, что заложено в проекте и воплощено в железе. Твердой уверенности в том, что получится решить задачу с этим ШД нет.
Все более склоняюсь к тому, что повернуть ШД из положения покоя на 45 градусов за 6 мс физически невозможно, т.е. ФБ Steper здесь не подойдет.
Начинаю прикидывать как можно решить задачу при помощи ФБ быстрый ШИМ. Там возникает проблема с подсчетом импульсов и не понятно как поведет себя ШД при резкой смене частоты.
Владимир Ситников
01.03.2017, 10:23
Начинаю прикидывать как можно решить задачу при помощи ФБ быстрый ШИМ. Там возникает проблема с подсчетом импульсов.
Чем этот самый "быстрый ШИМ" поможет? Ничем.
Берём stepper,
ставим accel_ramp=0, decel_ramp=0, min_speed=max_speed="скорость шимирования" , quantity=количество_импульсов
и stepper генерирует "ШИМ с указанным количеством импульсов".
Владимир Ситников
01.03.2017, 10:25
Работаю с тем, что заложено в проекте и воплощено в железе.
В проекте крутящий момент ШД выбран "как попало" или с оглядкой на момент инерции системы и требуемое ускорение?
В проекте крутящий момент ШД выбран "как попало" или с оглядкой на момент инерции системы и требуемое ускорение?
Есть аналогичная система, в которой подобный ШД под управлением забугорного контроллера с Match 3 успешно решает эту задачу.
Владимир Ситников
01.03.2017, 11:58
Есть аналогичная система, в которой подобный ШД под управлением забугорного контроллера с Match 3 успешно решает эту задачу.
Может, подключиться к этому самому Match 3 снять сигнал с него?
Чем этот самый "быстрый ШИМ" поможет? Ничем.
Берём stepper,
ставим accel_ramp=0, decel_ramp=0, min_speed=max_speed="скорость шимирования" , quantity=количество_импульсов
и stepper генерирует "ШИМ с указанным количеством импульсов".
Идея использования быстрого ШИМ в том чтобы вращение вала ШД не останавливалась до конца цикла техпроцесса.
ШД раскручивается до определенной скорости, а далее идет регулировка скорости в зависимости от того сколько импульсов надо сгенерировать за фиксированный интервал в 6 мс. Угол поворота вала ШД на каждом шаге может быть в диапазоне от 0,3 до 45 градусов. Интервалов много и следуют они один за другим.
При помощи ФБ Steper сделать этого не возможно, т.к. после отработки заданного количества импульсов каждого шага генерация импульсов прекращается.
Владимир Ситников
01.03.2017, 13:56
Идея использования быстрого ШИМ в том чтобы вращение вала ШД не останавливалась до конца цикла техпроцесса.
ШД раскручивается до определенной скорости, а далее идет регулировка скорости в зависимости от того сколько импульсов надо сгенерировать за фиксированный интервал в 6 мс. Интервалов много и следуют они один за другим.
Если по сути задача состоит в регулировке скорости, то да, ШИМ может подойти.
Если по сути задача состоит в регулировке скорости, то да, ШИМ может подойти.
Вот бы еще был счетчик сгенерированных импульсов, который можно читать и сбрасывать.
Вот бы еще был счетчик сгенерированных импульсов, который можно читать и сбрасывать.
так а разве не для этих целей создали среду, чтоб творить или это только автор IDE должен делать?
так а разве не для этих целей создали среду, чтоб творить или это только автор IDE должен делать?
Отличная мысль. ;) Пожалуй так и сделаю. Небольшой опыт работы с Hardella у меня есть.
Для справки, ни с кем спорить не собираюсь.
Есть аналогичная система, в которой подобный ШД под управлением забугорного контроллера с Match 3 успешно решает эту задачу.
При помощи ФБ Steper сделать этого не возможно, т.к. после отработки заданного количества импульсов каждого шага генерация импульсов прекращается.
При обработке УП для ЧПУ, сочиняют "Планировщик" (в проге контроллера ЧПУ) который анализируя несколько последовательных команд УП (управляющая программа) рассчитывает скорости и ускорения при смене команд, в пределах заданных в настройках этого ЧПУ, иногда игнорируя команду скорости в УП.
На некоторых контроллерах, команду шаговику, которая выполняется, можно в любой момент изменить на другую, с другими настройками максимальной скорости и ускорений. (цена сопоставима с Овеном).
В некоторых контроллерах известных производителей подобное невозможно.
-------
Кстати, контроллер с Match, или контроллер для проги Match? ничего не перепутали?
Бывают автономные контроллеры которые работают без мача, линукса снс, нс студии и подобного, но контроллеров с мачем не бывает.
---------------
Я всё-таки ещё раз спрошу: откуда уверенность, что именно эта система (этот вал с этой нагрузкой) и именно этот ШД может обеспечить 45 градусов за 6мс?
Для шаговика, такая уверенность может быть только на чьём то опыте, под конкретный шаговик, драйвер, блок питания и массу, которая на валу висит.
Или использовать проги от производителей, для расчёта, у Фесто есть для их комплектов на шаговиках, можно попробовать для понимания ситуации.
контроллеров с мачем не бывает.
В наше время все бывает. ;) Возьму промышленный ПК, установлю Match 3, вот и все дела.
Или использовать проги от производителей, для расчёта, у Фесто есть для их комплектов на шаговиках, можно попробовать для понимания ситуации.
Понимание ситуации есть, осталось чуть-чуть и вопрос будет решен.
ПЛК110[М02] рулит. Хвала фирме "ОВЕН" и Владимиру Ситникову.;)
http://www.bsystem.ru/Default.aspx?tabid=72
Это кстати тоже комп, с досом и в модификациях ещё с какой то осью, но предполагаю, что он больше похож на ПЛК, чем то, что Вы назвали "забугорного контроллера с Match 3 "
ПЛК110[М02] рулит.
Нет, он не сможет сравнится с малышом CP1E-N, если нужно покрутить двумя осями.
На нём одна команда перемещения может плавно перейти в другую, без остановки выдачи импульсов.
Нет, он не сможет сравнится с малышом CP1E-N, если нужно покрутить двумя осями.
И сколько стоит этот малыш ? Я тоже двумя осями управляю.
На нём одна команда перемещения может плавно перейти в другую, без остановки выдачи импульсов.
У меня то же одна команда плавно переходит в другую без остановки выдачи импульсов.
Владимир Ситников
01.03.2017, 22:17
Нет, он не сможет сравнится с малышом CP1E-N, если нужно покрутить двумя осями.
На нём одна команда перемещения может плавно перейти в другую, без остановки выдачи импульсов.
Может.
Особых проблем крутить двумя осями и планировать перемещение на М02 не вижу. Уже обсуждали, что это потенциально интересная тема и обсуждали как это можно сделать.
Раньше эту тему никто не просил, но, похоже, у Вольда подобная задача.
Особых проблем крутить двумя осями и планировать перемещение на М02 не вижу. Уже обсуждали, что это потенциально интересная тема и обсуждали как это можно сделать.
А где обсуждение этой темы ?
lara197a
01.03.2017, 23:03
И сколько стоит этот малыш ? Я тоже двумя осями управляю.
сто раз уже писано
двумя осями с интерполяцией может управлять к примеру дельта.
цены на сайте.
вообще что угодно делает PLC1Xi
стоит он 6225р
а в общем, все, что делает Ситников- хорошо.
Вопрос в другом, целесообразно ли применять ПЛК Овен в таких решениях?
Вообще что угодно делает PLC1Xi стоит он 6225р
Посмотрел технические характеристики PLC1Xi. Все что угодно он не делает и делать не может. С ПЛК110[М02] и близко не стоит.
Владимир Ситников
01.03.2017, 23:31
А где обсуждение этой темы ?
Вот тут было:
С другой стороны, можно сделать гибрид: использовать хвалёный "20мкс таймер" в режиме, скажем "100мкс" (чтобы не влиять на служебные программы ПЛК) и из этого "100мкс цикла" подавать команды в PRU.
Управляющих воздействий раз в 100мкс в целом, должно хватать на довольно большой спектр задач.
Но, конечно, программировать и отлаживать такое сложнее.
Т.е. идея в том, чтобы планирование движения выполнять в быстром таймере, а на PRU уже выполнять эти действия.
Например, сейчас PRU программа управления ШД выполняет все вычисления на этом самом PRU. Она вычисляет и то, когда нужно начинать торможение. Это, надо сказать, нетривиальные действия, ведь на PRU нет деления/умножения.
Можно же сделать более простую PRU программу (по сути ШИМ с наворотами), которая может делать "ШИМ с разгоном", "ШИМ с остановкой через N импульсов". А уже 100мкс таймер будет из этих кусочков выстраивать общее движение.
В реальности, конечно, слово ШИМ лишнее (т.к. скважность всегда 50%), но не суть.
Владимир Ситников
01.03.2017, 23:32
Вопрос в другом, целесообразно ли применять ПЛК Овен в таких решениях?
Не забывайте, что может оказаться, что "ПЛК Овен" уже случайно есть в проекте =)
lara197a
02.03.2017, 00:04
Посмотрел технические характеристики PLC1Xi. Все что угодно он не делает и делать не может. С ПЛК110[М02] и близко не стоит.
согласен полностью
в плане надежности и для задач управления ШД
он на порядок лучше. другие применения я здесь не рассматриваю
согласен полностью
в плане надежности и для задач управления ШД
он на порядок лучше. другие применения я здесь не рассматриваю
Поставить PLC1Xi в добавок к ПЛК110[М02] - это решение для ленивых. Зачем лишние расходы если ПЛК110[М02] легко справится с тем, что делает PLC1Xi. И кто вам сказал, что ПЛК110[М02] управляет у меня только одним драйвером ШД. В моей задаче ПЛК110[М02] загружен весьма прилично.
То V.Sitnikov
Владимир, поясните чем отличаются ФБ PWM_DW и PDM_DW ?
Владимир Ситников
02.03.2017, 14:47
То V.Sitnikov
Владимир, поясните чем отличаются ФБ PWM_DW и PDM_DW ?
В документации: https://hardella.com/docs/pru/standard-library/#pwm_dw
И на форуме: http://www.owen.ru/forum/showthread.php?t=23013&page=22&p=229447&viewfull=1#post229447
Так понятнее?
Владимир, проект компилируется без ошибок, но краснота замучила.
Владимир Ситников
02.03.2017, 16:53
Владимир, проект компилируется без ошибок, но краснота замучила.
Если при постановке курсора в res_c и нажатии ctrl+пробел варианта "res_c" не возникает, то, наверное, pwm: PWM_DW у вас ссылается на библиотечный блок, а не на самодельный.
Переименуйте свой блок и используйте его в программе -- всё встанет на свои места (возможно, res_c и counter придётся перевыбрать в @Export части).
Спасибо. Все верно. Я ФБ в проект скопировал, а переименовать забыл.
Владимир, переделал ваш ФБ. Ввел счетчик импульсов и сброс этого счетчика. Правильно ли я все сделал ? Все что я добавил поместилось в картинке.
Владимир Ситников
02.03.2017, 17:33
Владимир, переделал ваш ФБ. Ввел счетчик импульсов и сброс этого счетчика. Правильно ли я все сделал ? Все что я добавил поместилось в картинке.
Зависит от того, как этот блок потом использовать.
Скорее всего:
counter увеличивать нужно не каждый раз, а только по фронту.
Вместо переменной res_p можно было IF R_TRIG(CLK := res_c).Q THEN counter := 0; END_IF; Но это, наверное, дело вкуса.
Не факт, что PDM это то, что нужно в конкретной задаче.
Скорее, нужно было PWM с 50% скважностью или что-нибудь среднее между PDM/PWM.
counter увеличивать нужно не каждый раз, а только по фронту.
Q := TRUE; разве не признак фронта ? Что-то я не правильно понял. Что такое pos ?
Не факт, что PDM это то, что нужно в конкретной задаче.
А что может быть не так с PDM ?
Владимир Ситников
02.03.2017, 18:17
Q := TRUE; разве не признак фронта ?
Надо вчитываться (или смотреть на конкретных примерах). Возможно, всё верно. Сходу не могу сказать.
По-хорошему, нужно бы для этих блоков нарисовать диаграммы входов-выходов, чтобы понятнее было где оно подойдёт, а где нет.
А вы этот свой блок проверяли на железе ? Осциллограмму на быстром выходе смотрели ?
Владимир Ситников
02.03.2017, 19:26
А вы этот свой блок проверяли на железе ? Осциллограмму на быстром выходе смотрели ?
Этот нет. Ни в железе, ни на эмуляторе.
Этот нет. Ни в железе, ни на эмуляторе.
А какой да ?
Владимир Ситников
02.03.2017, 19:33
А какой да ?
Например, тут: https://github.com/vlsi/pru-emulator/tree/master/src/test/java/st61131/pru
Что ни один из двух ШИМ не проверялся ?
Разделение труда -один пишет ,другой тестирует ...Вас как раз двое .
Владимир Ситников
03.03.2017, 02:10
Что ни один из двух ШИМ не проверялся ?
По факту, я думал их использовать в блоке ШД, а потом понял, что в ШД они не нужны.
Так и остались блоки полунаписаные (в pdm перепутаны true и false, а в PWM не обрабатывается нулевая скважность).
По факту, я думал их использовать в блоке ШД, а потом понял, что в ШД они не нужны.
Так и остались блоки полунаписанные (в pdm перепутаны true и false, а в PWM не обрабатывается нулевая скважность).
Все так плохо или все можно легко поправить ?
Владимир Ситников
03.03.2017, 10:46
Все так плохо или все можно легко поправить ?
Разумеется, всё это можно поправить (например, в коде PDM достаточно заменить true на false, а false на true).
Но для управления ШД они по-моему, всё равно не подойдут.
Разумеется, всё это можно поправить (например, в коде PDM достаточно заменить true на false, а false на true).
Но для управления ШД они по-моему, всё равно не подойдут.
Почему не подойдут ?
И сколько стоит этот малыш ? Я тоже двумя осями управляю.
CP1E-N40DT-D Контроллер CP1E. 24 вх./16 вых
23 470,20 руб.
Отсутствие эзернета компенсирую панелькой с эзернетом (если необходимо) можно добавить один 485, мастер модбаса встроен, но его применение похоже на использование библиотеки.
В файле страницы из инструкции с кратким описанием сочетания между собой функций вывода импульсов. На русском, хоть от другого контроллера.
двумя осями с интерполяцией может управлять к примеру дельта.
Может, но не так удобно как на Омроне, и к сожалению нельзя запустить другую функцию, не прервав ту которая выполняется.
Т.е. если вдруг по условию нужно отправить ось в какую либо позицию, нужно служебным битом плавно прекратить вывод импульсов, убедиться что он действительно остановился, снять предыдущую инструкцию и запустить ось в новую позицию.
В Омроне, просто выдать новую команду, смену скорости и позиции он рассчитает сам, без остановки выдачи импульсов.
Разделение труда -один пишет ,другой тестирует ...Вас как раз двое .
Вот и КаСкадер rovki порадовал нас своим визитом. ;) К чему бы это ?
CP1E-N40DT-D Контроллер CP1E. 24 вх./16 вых
23 470,20 руб.
Отсутствие эзернета компенсирую панелькой с эзернетом (если необходимо) можно добавить один 485, мастер модбаса встроен, но его применение похоже на использование библиотеки.
Технические характеристики хуже чем у ПЛК110[М02], а цена выше. Да еще ПО скорее всего платно. Да еще за каждый пук надо будет платить.
С ПЛК Delta то же не все так хорошо как пишет lara197a.
Короче, как в поговорке: "За морем телушка —полушка, да рубль перевоз".
Вывод - не нужен мне берег турецкий и Африка мне не нужна. ;)
Многие задачи по управлению драйверами ШД можно решить при помощи нашего родного, отечественного ПЛК110[М02] + Hardella IDE.
Владимир Ситников
03.03.2017, 11:15
Может, но не так удобно как на Омроне, и к сожалению нельзя запустить другую функцию, не прервав ту которая выполняется
Да, pdf выглядит хорошо.
На Омроне с какой частотой вызывается сама управляющая программа?
Т.е. с каким минимальным интервалом можно выдавать команды по изменению положения/скорости?
Основной вопрос в случае ПЛК110 в том, как скрестить выдачу импульсов и обработку программы позиционирования.
Грубо говоря,
1) Выполнять всю программу в PRU невозможно. Ресурсов не хватит, да и не хочется занимать PRU ядро длинными вычислениями по ходу движения.
2) Выполнять управляющую программу можно в быстром таймере, но тогда управляющая программа будет вызываться с периодом 60-100мкс. 100мкс это примерно 10кГц.
Получается, для чего-нибудь типа "поиск нуля" нужно предусматривать возможность остановки по сработке какого-то fastinput'а (ну, чтобы PRU само останавливалось и не ждало очередного 100мкс таймера)
Спасибо, Ветер, хороший документ вы выложили. Я его конечно засундучу. Из него, например, видно, что никакие нелинейные функции при разгоне ШД не используются. Все делается при помощи кусочно-линейной функции, до чего я и сам ранее допер. Ветер, может у вас в загашнике есть еще какие интересные документы на эту тему ? Если есть, то не стесняйтесь, выкладывайте. ;)
Владимир, а в этом PDM джиттера, о котором настойчиво писал незабвенный В.Филоненко, нет ? Если есть, то значение counter в моем варианте ФБ мгновенно улетит в космос. ;)
lara197a
03.03.2017, 12:04
кстати про Омрон Ветер оч. правильно написал,
Он дороже Дельты, но сравним по цене с ПЛК 110.
СХ-ОН условно бесплатный. т.е. фактически ничего платить не придется.
Деньги возьмут, только при желании с Вашей стороны.
если говорить про удобство и простоту, то это отдельная тема и для решения
таких задач используют осевые привода типа s80 s120.
т.е. одним контроллером перекрыть все задачи в любом случае не получится.
а в общем все уже давно придумано.
Владимир Ситников
03.03.2017, 12:08
Владимир, а в этом PDM джиттера, о котором настойчиво писал незабвенный В.Филоненко, нет ? Если есть, то значение counter в моем ФБ мгновенно улетит в космос. ;)
У меня есть компенсатор джиттера. PRU configuration компенсирует джиттер, и в итоге fast outputs записываются согласно расписанию, заложенному в PRU configuration.
Разумеется, если указать "мин цикл=0.01мкс", а написать разлапистую программу, которая будет 10 мкс выполняться, то Hardella никак ситуацию не исправит.
На Омроне с какой частотой вызывается сама управляющая программа?
Т.е. с каким минимальным интервалом можно выдавать команды по изменению положения/скорости?
Вопрос не ясен.
Функции для скоростного выхода работают независимо от цикла основной программы, максимальная частота на выходе, 100 кГц.
Самая интересная функция, PLS2, сама рассчитывает ускорения и прочее, нужно задать только позицию, ускорение, замедление, стартовую частоту. Отдал команду и занимаешься другими делами, на счётчик выхода можно прерывание настроить и выполнить что либо вне цикла основной проги. Можно по служебному биту отследить завершение выдачи импульсов. (там целый список адресов с состоянием скоростного выхода)
С каким минимальным интервалом можно её использовать, в мануале только это:
Начинает выдачу импульсов через 72 мкс.
Время задержки при изменении режима вывода импульсов, позиции (с реверсом тоже), скорости, ускорения
Два цикла управления (8 мс) но как это понимать?
Я использовал с интервалом в 20 мсек. коррктировал по энкодеру позицию, на которую должен выйти сервопривод. Между приводом и тем что перемещали нет жёсткой связи.
Функции для скоростного выхода работают независимо от цикла основной программы, максимальная частота на выходе, 100 кГц.
Самая интересная функция, PLS2, сама рассчитывает ускорения и прочее, нужно задать только позицию, ускорение, замедление, стартовую частоту. Отдал команду и занимаешься другими делами, на счётчик выхода можно прерывание настроить и выполнить что либо вне цикла основной проги. Можно по служебному биту отследить завершение выдачи импульсов. (там целый список адресов с состоянием скоростного выхода)
Все то же самое делает ФБ Steper, сварганенный в Hardella.
т.е. одним контроллером перекрыть все задачи в любом случае не получится.
все уже давно придумано.
И как минимум три направления.
CNC
Motion Controller
ну и простые штуки, вроде пошевелить парой осей
Идея использования быстрого ШИМ в том чтобы вращение вала ШД не останавливалась до конца цикла техпроцесса.
ШД раскручивается до определенной скорости, а далее идет регулировка скорости в зависимости от того сколько импульсов надо сгенерировать за фиксированный интервал в 6 мс. Угол поворота вала ШД на каждом шаге может быть в диапазоне от 0,3 до 45 градусов. Интервалов много и следуют они один за другим.
При помощи ФБ Steper сделать этого не возможно, т.к. после отработки заданного количества импульсов каждого шага генерация импульсов прекращается.
А вот на малыше это возможно, функция SPED, попроще чем PLS2, но минимальный интервал вроде 8 мс.
-------------------
Вы уж определитесь, а то заладили
Все то же самое делает ФБ Steper сварганенный в Hardella.
ПЛК110[М02] рулит. Хвала фирме "ОВЕН" и Владимиру Ситникову.;)
Ну не рулит он в Вашей задаче, Вы уже не первый день решаете то, что на другом оборудовании как два пальца об асфальт.:p
Владимир Ситников
03.03.2017, 14:09
Вопрос не ясен.
Функции для скоростного выхода работают независимо от цикла основной программы, максимальная частота на выходе, 100 кГц.
Впрос в том, как часто можно вызывать функцию PLS2.
Грубо говоря:
t0: "PLS2, поехали на 10мм".
t1: Вас понял, еду
t3: "ой, нет, я передумал, PLS2 надо было на 7мм ехать, а не на 10"
t4: Кхм. Вообще-то мы находимся на отметке 9мм, но если уж так нужно, то отмотаем назад 2мм.
Каков минимальный временной интервал t3-t0, который позволит вызывать PLS2/SPED?
С одной стороны, пишете "2 цикла управления = 8мс". Я понимаю это так, что PLS2, выполняясь в основном цикле, отдаёт команды на управление обработчику быстрого выхода раз в "основной цикл ПЛК". Если основной цикл ПЛК составляет 4мс, то ПЛК потратит примерно 8мс от осознания того, что нужно запускать ШД до фактического запуска.
С другой стороны, пишете, что есть таймеры на 20мкс. Можно в этом таймере вызывать PLS2? Т.е. можно, условно говоря, каждые 20мкс выдавать новую PLS2 инструкцию? Я, конечно, понимаю, что 20мкс это порядка 50кГц, но всё же.
на счётчик выхода можно прерывание настроить и выполнить что либо вне цикла основной проги
Т.е. что-то в духе "выполни вот этот код как только счётчик выхода достигнет значения 42"?
Сильно сомневаюсь, что в Омроне одно и то же ядро занимается генерацией импульсов и выполнением инструкций типа PLS2.
Значит, выполнение асинхронное.
Значит, возможно временное запаздывание (ну, импульсы уже накопились, а до обработчика ещё не дошло, что нужно выполнять обрабатывающий код).
Тот же самый вопрос, но с другой стороны: отличается ли эта "обработка входа по прерыванию" от "обработки входа в 20мкс таймере"? Например, мы в нашем 20мкс таймере будем проверять счётчик быстрого выхода и вызывать разнообразные PLS2/SPED команды. Так можно? Оно будет отличаться от "обработки счётчик выхода в прерывании"?
PS. "Начинает выдачу импульсов через 72 мкс" и 20мкс таймер звучит жутковато. Если вычисления траектории занимают 72мкс, то 20мкс таймеру придёт северный лис. У меня на PRU траектория вычисляется где-то за 5мкс. Возможно, более сложные вычисления (совмещение двух движений) действительно выйдут на 36-72мкс.
Вы уж определитесь.
Я уже давно определился. Что тут не понятно ?
Ну не рулит он в Вашей задаче.
Для тех кто не понял повторяю - ПЛК110[М02] + Hardella IDE рулят. Повторяйте это как мантру и до вас наконец дойдет. ;)
Вы уже не первый день решаете то, что на другом оборудовании как два пальца об асфальт.
Быстро, как известно, только кошки родятся. ;) Муки творчества действуют на меня благотворно, без этого жизнь скучна.
Свое подключение к разговору вы начали со слов "Для справки, ни с кем спорить не собираюсь". То что вы изложили лично я принимаю к сведению, но не более того.
lara197a
03.03.2017, 14:27
Владимир, что за задачи такие, менять задания по нескольку раз в течении милисек?
Обычно любой автомат работает много медленнее.
Я работал с линией по изготовлению сендвич панелей там мультиконтроллерное упр 3шт S300 и примерно 20 осевых приводов S120
плюс ок 40-60 ПЧ. Средний цикл 15-18мс
Работал на роботизированном заводе Мазахенка, весь завод управляется 4-мя S400(в сети) с коммуникациями, цикл 15-20мс
Владимир Ситников
03.03.2017, 14:45
Владимир, что за задачи такие, менять задания по нескольку раз в течении милисек?
А я откуда знаю? Про задачи нужно не у меня спрашивать.
Вот тащили-тащили клещами из Вольда его задачу. Оказалось, ему нужно PLS2/SPED/ACC.
Попробую угадать, где может пригодиться быстрое управление: "поиск нуля". Т.е. мы движемся-движемся и нужно останавливать ШД при достижении отметки.
С одной стороны, под это дело можно сделать "отдельную инструкцию <<поиск нуля>>", а с другой можно отдельных не делать, а сделать что-то типа PLS2/SPED и вызывать уже их (но из 60мкс таймера).
Обычно любой автомат работает много медленнее.
Я хочу по-нормальному сделать.
C stepper блоком перо попробовали, теперь можно более серьёзные штуки делать. И не хотелось бы тратить время на штуки, которые по факту окажутся непригодными к реальному использованию.
Если 100мкс всех устраивает, то надо пробовать.
Вот тащили-тащили клещами из Вольда его задачу. Оказалось, ему нужно PLS2/SPED/ACC.
Я не говорил, что мне нужно PLS2/SPED/ACC. Пускай этим пользуются адепты забугорного железа. ;) Мой пост о том, что мне понравился документ, который выложил Ветер вы истолковали совершенно не верно. В этом документе я нашел интересные для себя моменты и только. Мне нужен проверенный, работающий быстрый ШИМ, а остальное я сам постараюсь сделать.
lara197a
03.03.2017, 15:03
Попробую угадать, где может пригодиться быстрое управление: "поиск нуля". Т.е. мы движемся-движемся и нужно останавливать ШД при достижении отметки.
Если 100мкс всех устраивает, то надо пробовать.
такие задачи используют прерывания и цикл не затрагивают
устроит в 99,9% задач.
а для поиска 0 привод движется оч. медленно. Тут нет расчета инерции и торможения. Остановка происходит мгновенно по прерыванию.
Вот выход в координату с заданной скоростью разгона и остановки это другое, для сложных задач делают приводов с высокоскоростной цифровой обратной связью по позиции.
Для этого используют спец моторы, которые к ПЛК не подключить.
Для этого используют спец моторы, которые к ПЛК не подключить.
Не надо нас за лохов держать. Никто не собирается подключать т.н. спецмоторы напрямую к ПЛК. Если вы о сервоприводах, то они то же бывают с интерфейсом STEP/DIR/EN и их без труда можно подключить к быстрым дискретным выходам ПЛК. Управлять сервоприводом с синхронным двигателем много проще чем драйвером ШД.
Приборист уже подключал сервопривод к ПЛК110[М02] и остался очень доволен.
Каков минимальный временной интервал t3-t0, который позволит вызывать PLS2/SPED?
судя по инструкции, те не совсем понятные мне "2 цикла управления = 8мс" трактовать можно по разному.
С одной стороны, пишете "2 цикла управления = 8мс". Я понимаю это так, что PLS2, выполняясь в основном цикле, отдаёт команды на управление обработчику быстрого выхода раз в "основной цикл ПЛК". Если основной цикл ПЛК составляет 4мс, то ПЛК потратит примерно 8мс от осознания того, что нужно запускать ШД до фактического запуска.
Если PLS2 не выполняется, вывод импульсов начнётся через 72 мкс после команды, если нужно изменить команду которая выполняется, то те самые 8мс.
С другой стороны, пишете, что есть таймеры на 20мкс.
Вы проглядели, я писал 20 мсек, т.е. 20 мс.
Т.е. что-то в духе "выполни вот этот код как только счётчик выхода достигнет значения 42"?
Да, подпрограмму прерывания, а если не торопимся, то можно и в основном цикле отследить счётчик.
Сильно сомневаюсь, что в Омроне одно и то же ядро занимается генерацией импульсов и выполнением инструкций типа PLS2. Фиг его знает, но у этого малыша один камень от Фуджицу, какой именно смотреть не полезу.
Тот же самый вопрос, но с другой стороны: отличается ли эта "обработка входа по прерыванию" от "обработки входа в 20мкс таймере"? Например, мы в нашем 20мкс таймере будем проверять счётчик быстрого выхода и вызывать разнообразные PLS2/SPED команды. Так можно? Оно будет отличаться от "обработки счётчик выхода в прерывании"?
Ещё как будет.
В Омроне есть что то похожее на скоростной таймер в ПЛК110, т.е. можно считать и проверить значение счётчика выхода. Называется "Прерывание по расписанию"
Но ещё есть прерывания по событиям: по физическому входу, по уставке счётчика. т.е. нет смысла постоянно гонять код в таймере как у ПЛК110.
-------------------
Вольд, Вы случайно не САМ на ШД пытаетесь организовать?
Владимир Ситников
03.03.2017, 15:34
Вы проглядели, я писал 20 мсек, т.е. 20 мс.
Да, проглядел.
Ясно. Значит нужно делать что-то типа PLS2/SPED/ACC.
Кстати, ещё вопрос: может быть "очередь из PLS2/SPED команд"?
Т.е. "сначала 10мм на скорости A, потом 12мм на скорости Б".
Или это решается через SPED, контроль положения, и выдачу новой SPED команды?
PS Совсем шик, наверное, будет запитать 4 ШД от одного ПЛК110.
STEP из быстрых выходов, а DIR из обычных.
Вольд, Вы случайно не САМ на ШД пытаетесь организовать?
Скажем так. На Марс я лететь не собираюсь, у меня задача попроще. ;) Я уже почти все сделал, осталось чуть-чуть.
lara197a
03.03.2017, 15:50
Не надо нас за лохов держать. Никто не собирается подключать т.н. спецмоторы напрямую к ПЛК. Если вы о сервоприводах, то они то же бывают с интерфейсом STEP/DIR/EN и их без труда можно подключить к быстрым дискретным выходам ПЛК. Управлять сервоприводом с синхронным двигателем много проще чем драйвером ШД.
Приборист уже подключал сервопривод к ПЛК110[М02] и остался очень доволен.
речь о двигателях с энкодером и цифровой обратной связью. при чем тут степ дир?
вы хотите получить какие-то не реальные скорости изменения команды на лету.
но вы не получите без такой обратной связи команды на изменение задания.
это вообще не нужная для плк скорость.
вам нужно реально подходить к выбору скорости. для компенсации инерции при остановки,
а скорость отклика на изменение команды не так критична.
PS Совсем шик, наверное, будет запитать 4 ШД от одного ПЛК110. STEP из быстрых выходов, а DIR из обычных.
Колоссально ! Четыре оси от одного ПЛК. Малышу от OMRON такое и не снилось. ;)
Да простит меня ВЕТЕР, но в очередной раз не могу удержаться.
ПЛК110[М02] & Hardella рулят.
речь о двигателях с энкодером и цифровой обратной связью. при чем тут степ дир?
вы хотите получить какие-то не реальные скорости изменения команды на лету.
но вы не получите без такой обратной связи команды на изменение задания.
это вообще не нужная для плк скорость.
вам нужно реально подходить к выбору скорости. для компенсации инерции при остановки,
а скорость отклика на изменение команды не так критична.
Много пустой, не нужной писанины.
Кстати, ещё вопрос: может быть "очередь из PLS2/SPED команд"?
Т.е. "сначала 10мм на скорости A, потом 12мм на скорости Б".
Если самому её описать, в той бумажке которую я выложил, с конца 99 страницы и далее, это описано.
-----------------------------------
Вольд, ну Вы прям как партизан, тайны не выдаёте.:cool:
Вы в этой теме уже больше месяца вопросы задаёте, интересно, на сколько Ваше "осталось чуть-чуть" растянется :)
Вы в этой теме уже больше месяца вопросы задаёте, интересно, на сколько Ваше "осталось чуть-чуть" растянется :)
Я продлеваю удовольствие, благо время терпит. Да и задача у меня не баран чихнул ;)
Специально для вас повторю. Быстро только кошки родятся.
Владимир Ситников
03.03.2017, 16:06
Я не говорил, что мне нужно PLS2/SPED/ACC. Пускай этим пользуются адепты забугорного железа. ;) Мой пост о том, что мне понравился документ, который выложил Ветер вы истолковали совершенно не верно. В этом документе я нашел интересные для себя моменты и только. Мне нужен проверенный, работающий быстрый ШИМ, а остальное я сам постараюсь сделать.
Ещё раз, попробую убедить, что вам нужны именно PLS2/SPED/ACC, а не ШИМ.
Да, ШИМ (мой блок PWM_DW) уже является аналогом команды SPED -- на нём можно генерировать импульсы нужной длительности.
Ставим скважность 50% (половину периода единица, а потом ноль). Длина ШИМ периода это и есть напрямую частота импульсов.
Нужно менять скорость -- корректируем уставку PWM_DW и всего делов.
Но программы типа "обнаружен сигнал предварительного концевика, значит нужно включать торможение" на этом самом PWM_DW сделать непросто.
Конечно, можно всё на ступеньках изображать, но по-хорошему, нужны всё-таки более простые в использовании блоки. Не просто "генератор частоты", а например, тот же самый ACC (насколько я понял это ускорение/замедление)/PLS2(движение)/SPED(генератор частоты). Т.е. "генератор частоты с нарастанием", "генератор с планированием разгона-замедления" и т.п.
Колоссально ! Четыре оси от одного ПЛК. Малышу от OMRON такое и не снилось. ;)
Тогда куплю мелкую Дельту на 4 оси, если позицию "на лету" менять не нужно.
Ещё раз, попробую убедить, что вам нужны именно PLS2/SPED/ACC, а не ШИМ.
Да, ШИМ (мой блок PWM_DW) уже является аналогом команды SPED -- на нём можно генерировать импульсы нужной длительности.
Ставим скважность 50% (половину периода единица, а потом ноль). Длина ШИМ периода это и есть напрямую частота импульсов.
Нужно менять скорость -- корректируем уставку PWM_DW и всего делов.
Но программы типа "обнаружен сигнал предварительного концевика, значит нужно включать торможение" на этом самом PWM_DW сделать непросто.
Конечно, можно всё на ступеньках изображать, но по-хорошему, нужны всё-таки более простые в использовании блоки. Не просто "генератор частоты", а например, тот же самый ACC (насколько я понял это ускорение/замедление)/PLS2(движение)/SPED(генератор частоты). Т.е. "генератор частоты с нарастанием", "генератор с планированием разгона-замедления" и т.п.
Владимир, не волнуйтесь, все будет O'Key.
Тогда куплю мелкую Дельту на 4 оси, если позицию "на лету" менять не нужно.
А если надо, то купите Allen-Bradley ? А последние штаны продать не придется ? ;)
Владимир Ситников
03.03.2017, 16:12
Если самому её описать, в той бумажке которую я выложил, с конца 99 страницы и далее, это описано.
Ну я 99-ую страницу понимал так: если в момент движения (которое образовалось прошлым вызовом SPED) вызвать ещё раз SPED, то результирующий график будет такой.
У меня же вопрос был такой: можно ли в "управлятор быстрого выхода" загрузить последовательность команд "сначала делай SPED такой, а потом PLS2 такой".
Насколько я понял, такой опции нет. Т.е. выдача команд SPED/PLS2 происходит либо в основном цикле, либо по прерыванию, либо по таймеру.
загрузить последовательность команд
Да, такого нет.
А если надо, то купите Allen-Bradley ? А последние штаны продать не придется ? ;)
Что нужно для задачи, то и куплю,(но не Allen-Bradley или Сименс) я не зациклен на одном производителе.
И даже могу ардуину к контроллеру или панеле прикрутить.
Что нужно для задачи, то и куплю,(но не Allen-Bradley или Сименс) я не зациклен на одном производителе.
И даже могу ардуину к контроллеру или панеле прикрутить.
Да вы настоящий человек-оркестр. ;)
Владимир, смотрю ваш ФБ PWM_DW. У вас там Q - BOOL, POS - DWORD. Как возможна такая строка: Q := pos <= value; ?
Я так понимаю все у вас там в мкс мерится, если ФБ вызывается раз в микросекунду ?
Владимир Ситников
04.03.2017, 11:06
Владимир, смотрю ваш ФБ PWM_DW. У вас там Q - BOOL, POS - DWORD. Как возможна такая строка: Q := pos <= value; ?
pos <= value это операция сравнения двух чисел. У операции сравнения результат это BOOL (true/false). Этот результат записывается в Q, которое BOOL. Всё в порядке вещей.
Владимир Ситников
04.03.2017, 11:13
И в догонку. value у вас что такое ? Я так понимаю все у вас там в мкс мерится.
Нет, измеряется в попугаях.
Вот блок, с помощью которого можно узнать количество выполненных процессором тактов: https://hardella.com/docs/pru/standard-library/#pru_current_time
В PRU нет операций деления/умножения, поэтому лучше в программе использовать "количество тактов процессора" (PRU это 200МГц, каждый такт -- 5нс), и переводить мкс в такты ещё при написании программы.
Единственное место, где в Hardella указываются микросекунды это PRU Configuration, но тот параметр как раз и превращается в "такты" на этапе компиляции проекта.
Ещё в упрощенном случае можно считать, что каждый цикл PRU выполняется через указанное в конфигурации время. Например указали цикл PRU в 1 мкс, вызываем pwm_dw в каждом цикле и тогда можно считать, что pwm_dw настраивается в мкс.
Тогда задам конкретный вопрос. Какие значения должны иметь period и value, если на выходе надо получить импульсы с периодом 10 мкс и скважностью 2 в ФБ PWM_DW и PDM_DW соответственно ? min cycle = 1 mcs.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot