
Сообщение от
Sulfur
Господа программисты, малость облегчу задачу для моего случая. Время работы двигателя транспорта программно ограничено по времени (1 сек) при любом состоянии счетчика и любой ситуации. Это сделано для предотвращения недопустимых ситуаций из за поломки энкодера и\или ошибки оператора станка при его настройке. По расчетам у меня получается примерно следующее: частота вращения двигателя транспорта 3000об\мин = 50 об\с, при разрешении энкодера 500 имп\об имеем 25000 импульсов. При среднем фактическом времени работы 0.4 сек имеем 10000 импульсов. Типы DWORD и DINT в моей задаче не актуальны.
А кто вас спрашивает? Шутка.
Держите программу: pru_cutter_v2.zip
Порядок пользования:
"online -> write file to plc -> PRU0.prg"
перезагружаем ПЛК
ФБ PRU_ABZ и PRU_CUTTER.
Через PRU_ABZ.ZERO_DETECTED можно узнать "обнаружен ли уже ноль"
Через PRU_CUTTER управляем мотором (указываем нужное количество импульсов и говорим "поехали!").
Энкодер подключать к 1-ым трём входам.
На какие именно фронты сигнала энкодера реагировать это, похоже, тот ещё вопрос, поэтому я сделал первое что пришло в голову: блок реагирует на вообще все фронты A и B сигналов. Фильтрации от дребезга нет. Возможно, стоит добавить.
Код:
FUNCTION_BLOCK PRU_ABZ
VAR_INPUT
(*
A -- in1
B -- in2
Z -- in3
*)
END_VAR
VAR_OUTPUT
VALUE : WORD; (* increases or decreases depending on encoder direction *)
COUNTER : WORD; (* always increases *)
ZERO_DETECTED: BOOL; (* true when Z was detected at least once *)
END_VAR
FUNCTION_BLOCK PRU_CUTTER
(*
When ENABLE=TRUE, the block activates out1 until RUN_LENGTH encoder pulses observed.
RUN_LENGTH can be changed at any time.
*)
VAR_INPUT
ENABLE: BOOL;
RUN_LENGTH: DWORD; (* pulses *)
END_VAR
VAR_OUTPUT
STATE : PRU_CUTTER_STATE; (* INIT -> RUN -> STOP *)
OFFSET: DWORD; (* actual offset *)
END_VAR
TYPE PRU_CUTTER_STATE : (
INIT_CUTTER, (* CUTTER is waiting for new configuration and activation ENABLE=TRUE signal *)
RUN_CUTTER, (* CUTTER is moving *)
STOP_CUTTER (* CUTTER is stopped and it is waiting for ENABLE=FALSE to switch to INIT state *)
);
END_TYPE
Собственно, программа:
Снимок экрана 2016-10-07 в 12.07.32.png
PRU_ABZ:
Снимок экрана 2016-10-07 в 12.09.37.png
PRU_CUTTER:
Снимок экрана 2016-10-07 в 12.10.15.png