Сейчас выложу.
Сейчас выложу.
Интересно, что если из прерывающей программе убрать
SteppersConfig_Pru1MemoryTransfer();
то все работает как надо.
CASE R200 OF
0: (* *)
Stop_Motor();
SSP_Y := FALSE; (* Нет исходного положения *)
TON3(IN := FALSE, PT:= T#0s);
R200 := 10;
10: (* Вперед или стоп *)
IF (D1) THEN
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := FALSE,
STEPPER1_PRU1_stepper_accel_ramp := 5000,
STEPPER1_PRU1_stepper_decel_ramp := 50000,
STEPPER1_PRU1_stepper_max_speed := 10000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 1000000,
STEPPER1_PRU1_stepper_enable := TRUE
);
ELSE SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE); R200 := 15; END_IF
15: (* Пауза *)
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE);
TON3(IN := TRUE, PT:= UT_1S); (* Запустили таймер *) Если уставка таймера 1 сек., то ФБ работает нормально, если 100 мс, то на шаге 20 все стопорится, вал ШД вращается, но с черепашьей частотой
IF (TON3.Q = TRUE) THEN TON3(IN := FALSE, PT:= T#0s); R200 := 20; END_IF
20: (* Назад *)
IF (NOT D1) THEN
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := TRUE,
STEPPER1_PRU1_stepper_accel_ramp := 5000,
STEPPER1_PRU1_stepper_decel_ramp := 50000,
STEPPER1_PRU1_stepper_max_speed := 10000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 1000000,
STEPPER1_PRU1_stepper_enable := TRUE
);
ELSE R200 := 30; END_IF
30: (* Стоп *)
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE);
SSP_Y := TRUE;
END_CASE
Последний раз редактировалось Вольд; 24.03.2017 в 16:28.
Если дать возможность ШД отработать заданное количество импульсов, то все в дальнейшем корректно работает.
Проблема в дальнейшем возникает, если выдать
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE);
до того, как ШД отработает заданное количество импульсов.
Вот так работает корректно
CASE R200 OF
0: (* *)
Stop_Motor();
SSP_Y := FALSE; (* Нет исходного положения *)
TON3(IN := FALSE, PT:= T#0s);
R200 := 10;
10: (* Вперед или стоп *)
IF (D1) THEN
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := FALSE,
STEPPER1_PRU1_stepper_accel_ramp := 5000,
STEPPER1_PRU1_stepper_decel_ramp := 50000,
STEPPER1_PRU1_stepper_max_speed := 10000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 1000000,
STEPPER1_PRU1_stepper_enable := TRUE
);
ELSE R200 := 15; END_IF
15: (* Ждем отработки заданного на предыдущем шаге количества импульсов *)
IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN
SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_enable := FALSE; R200 := 20; END_IF
20: (* Назад *)
IF (NOT D1) THEN
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := TRUE,
STEPPER1_PRU1_stepper_accel_ramp := 5000,
STEPPER1_PRU1_stepper_decel_ramp := 50000,
STEPPER1_PRU1_stepper_max_speed := 10000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 1000000,
STEPPER1_PRU1_stepper_enable := TRUE
);
ELSE R200 := 30; END_IF
30: (* Стоп *)
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE);
SSP_Y := TRUE;
END_CASE
Последний раз редактировалось Вольд; 24.03.2017 в 18:32.
Владимир, какое значение примет
SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state
после того как буде выполнено
SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_enable := FALSE;