Последний раз редактировалось Владимир Ситников; 18.01.2017 в 13:23.
Получается в первом случае обмена с PRU0 нет поэтому состояние position и не меняется.
Владимир, а у меня та же самая история ?
Так не работает.
SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);
ENC := SteppersConfig_Pru0MemoryTransfer.STEPPER2_Enc_PRU 0_encoder_position;
Если сделать так, то энкодер будет опрашиваться ?
SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_encoder_position => ENC,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);
Последний раз редактировалось Newcomer; 18.01.2017 в 13:34.
А разве у Sulfur не та же самая проблема была что и у меня ?
Ведь PRU-программа работает автономно, ее не обязательно постоянно вызывать.
Если так обратиться, то можно получить текущее значение Position
Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;
Почему же это не работает ?
Последний раз редактировалось Newcomer; 18.01.2017 в 13:47.
Ещё раз: вызов ENCODER_AND_COUNTER_Pru0MemoryTransfer() осуществляет обмен данными.
Если не вызывать, то никаого обмена не будет, и никакие переменные обновляться не будут.
Если просто читать ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_ENCOER_ COUNTER_Enc_Position и ничего больше не делать, то значение будет одним и тем же.
Тем не менее, в сообщении 485 код похож на правильный:
Т.е. сначала Pru0MemoryTransfer, затем чтение STEPPER2_Enc_PRU0_encoder_position. Выглядит верно.Код:SteppersConfig_Pru0MemoryTransfer( STEPPER2_Enc_PRU0_dir := TRUE, STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000, STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000, STEPPER2_Enc_PRU0_stepper_max_speed := 20000, STEPPER2_Enc_PRU0_stepper_min_speed := 0, STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF, STEPPER2_Enc_PRU0_stepper_enable := TRUE ); SteppersConfig_Pru1MemoryTransfer( STEPPER1_PRU1_dir := TRUE, STEPPER1_PRU1_stepper_accel_ramp := 10, STEPPER1_PRU1_stepper_decel_ramp := 10, STEPPER1_PRU1_stepper_max_speed := 300, STEPPER1_PRU1_stepper_min_speed := 0, STEPPER1_PRU1_stepper_quantity := 100000, STEPPER1_PRU1_stepper_enable := TRUE ); ENC := SteppersConfig_Pru0MemoryTransfer.STEPPER2_Enc_PRU0_encoder_position;
Насколько я понял, нужно в начале цикла ПЛЦ_ПРГ сделать вызов ПРУ-ПОУ (ENCODER_AND_COUNTER_Pru0MemoryTransfer в моем случае) с пустыми параметрами, и после этого должно заработать непосредственное обращение к любой переменной ПРУ-ПОУ?
В принципе, то, как сейчас работает устраивает. Однако для большей понятности программы (в первую очередь для себя, ибо "с памятью моей что-то стало") хотелось бы иметь возможность обращаться к нужным переменным обмена из любого места ПЛЦ-ПРГ.
Вариант 1
SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_encoder_position => ENC,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);
Вариант 2
SteppersConfig_Pru0MemoryTransfer(
STEPPER2_Enc_PRU0_dir := TRUE,
STEPPER2_Enc_PRU0_stepper_accel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_decel_ramp := 2000,
STEPPER2_Enc_PRU0_stepper_max_speed := 20000,
STEPPER2_Enc_PRU0_stepper_min_speed := 0,
STEPPER2_Enc_PRU0_stepper_quantity := 16#FFFFFFFF,
STEPPER2_Enc_PRU0_stepper_enable := TRUE
);
ENC := SteppersConfig_Pru0MemoryTransfer.STEPPER2_Enc_PRU 0_encoder_position;
Оба варианта кода правильные ?
Последний раз редактировалось Newcomer; 18.01.2017 в 13:54.
Да, можно так.
Как вариант, можно добавить в начало и в конец вызовы MemoryTransfer без параметров (как бы для чтения и для записи).
А между делом (в любом месте программы обращаться к ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_ENCOER_ COUNTER_Enc_Position и подобным)
Так устраивает? Или я чего-то не понял?
Да, оба варианта правильные, как я и говорил в 509