Еще один вопрос. Как мне получить на входе 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,
);
Последний раз редактировалось Newcomer; 19.01.2017 в 15:29.
Да пёс его знает. Можно и так и сяк делать. Всё зависит от того, что первое в голову придёт. Зависит от настроения и конкретной задачи.
Например, Sulfur переписал энкодер и убрал CASE/ENUM из программы.
Да, то что он написал выглядит простым и понятным. Но и мой вариант с CASE тоже простой и понятный.
Вот, честное слово, не вижу почему один или другой способ был бы лучше или хуже. Поэтому и не спешу менять на тот вариант, который сделал Sulfur.
Добавлять в примеры "второй вариант написания одного и того же" тоже особого смысла не вижу.
Другое дело, если у Sulfur проект заработает в железе, то тогда можно (и я бы хотел) пример в Hardella заменить и обновить документацию. Тогда будет гораздо проще описать "постановку задачи", и объяснять как что связано (в PRU программе, в КДС программе, в реальных энкодерах и т.п.).
Более того, это хорошо, что простой инженер без специальной "PRU подготовки" может сделать свою PRU программу "как он видит".
Одной из целью Hardella и была возможность написания своих программ, а там уж сколько людей столько и мнений. Кому-то нравятся ENUM'ы, а кому-то брюнетки.
Чтобы выдать команду без разгона и торможения нужно указывать accel_ramp :=0, decel_ramp := 0, max_speed := 20000, quantity := 10000
В первую очередь я решал свою задачу. Примененный мной алгоритм энкодера успешно работает уже несколько лет на ПЛК старой модификации (естественно не в ПРУ). Но Ваш алгоритм точнее и "правильнее".
Проект работает в железе (на аппаратном эмуляторе), скоро сделаю отчет в своей теме ПЛК110.60[М2] + энкодер + счетчик.
Выражаю огромную благодарность за организацию и поддержку проекта Hardella. И, кстати, моя основная проф.деятельность отнюдь не программирование.
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN ; END_IF
Владимир, что в вышеприведенном выражении есть STOP_STEPPER_RUN_STATE ?
В моей программе эта штука нигде не объявлена, но компилятор CoDeSys не выдает ошибку.
Последний раз редактировалось Newcomer; 19.01.2017 в 19:03.
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.
Я в своей программе не делаю постоянно это - Основная программа: "PRU, передаю enable=true". Я это сделал 1 раз и жду когда ФБ отработает задание.
Ещё раз: синхронизируются ВСЕ переменные при каждом обмене.
Невозможно, "просто прочитать одну переменную". Всегда запишутся последние значения всех переменных "на запись" и прочитаются тех, которые должны прочитаться.
Иными словами, вызов MemoryTransfer() (без параметров) всё равно запишет enable, и он запишет то значение, которое в последний раз указывалось.