Владимир Ситников
Начал испытания в железе на столе. Обнаружил проблему с обменом.
Когда обращаюсь так:
имею пустые данные, т. е. обмена нет. Как со входными, так и с выходными данными.Код:Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_ENCOER_COUNTER_Enc_Position;(*Показания энекодера*)
Когда обращаюсь так:
То проблем нет, всё работает нормально.Код:ENCODER_AND_COUNTER_Pru0MemoryTransfer( PRU_ENCOER_COUNTER_DO3:=FDO3 , (*Прямое управление выходом FDO3*) PRU_ENCOER_COUNTER_DO4:=FDO4 , (*Прямое управление выходом FDO4*) PRU_ENCOER_COUNTER_count_Enable:=RunTransport ,(*Запуск транспорта*) PRU_ENCOER_COUNTER_count_Lenght:= Lenght ,(*Пройденный путь*) running=> , writeFails=> , readFails=> , PRU_ENCOER_COUNTER_Enc_Position=>Enc ,(*Показания энкодера*) PRU_ENCOER_COUNTER_Enc_ZeroDetect=>ZeroDetect ,(*Обнаружение машинного нуля*) PRU_ENCOER_COUNTER_count_Path=>Path );(*Пройденный путь транспорта*)
В обоих случаях компиляция происходит без ошибок и предупреждений.
Вполне допускаю, что напутал с синтаксисом в первом случае.
Завтра напишу что получилось.
С моим дубовым ФБ опроса энкоднра ситуация такая. ШД нормально управляются, а при медленном вращении вала энкодера считываемое значения (position) принимает попеременно два состояния - 0 и 1. Фазы А и В энкодера подключены к 1 и 2 быстрым дискретным входам ПЛК.
Код ФБ опроса энкодера прилагаю.
Так работает
PRU_ENCOER_COUNTER_Enc_Position=>Enc ,(*Показания энкодера*)
а так не работает
Enc:=ENCODER_AND_COUNTER_Pru0MemoryTransfer.PRU_EN COER_COUNTER_Enc_Position;(*Показания энкодера*)
Получается в первом случае обмена с PRU0 нет поэтому состояние position и не меняется.
А разве у 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;