-
Собственно, вот текст той "кривой козы", на которой объезжали недостаточную разрядность регистра кодесисовского "encoder":
Во первых, в настройках модуля "энкодер" указывается RING - энкодер будет кольцевым, и количество импульсов, равное тому, который считает ПЛК на цикл. Т.е. 200-импульсному энкодеру соответствует 800 в настройках.
Далее, определяем программно направление вращения вала энкодера:
STATE1.0 := ENCODER_A; - вход с фазой А
STATE1.1 := ENCODER_B; - вход с фазой В
IF STATE0 = 1 AND STATE1 = 3 THEN
DIRECT_MOVE :=TRUE;
END_IF;
IF STATE0 = 3 AND STATE1 = 2 THEN
DIRECT_MOVE :=TRUE;
END_IF;
IF STATE0 = 2 AND STATE1 = 0 THEN
DIRECT_MOVE :=TRUE;
END_IF;
IF STATE0 = 0 AND STATE1 = 1 THEN
DIRECT_MOVE :=TRUE;
END_IF;
IF STATE0 = 0 AND STATE1 = 2 THEN
DIRECT_MOVE :=FALSE;
END_IF;
IF STATE0 = 2 AND STATE1 = 3 THEN
DIRECT_MOVE :=FALSE;
END_IF;
IF STATE0 = 3 AND STATE1 = 1 THEN
DIRECT_MOVE :=FALSE;
END_IF;
IF STATE0 = 1 AND STATE1 = 0 THEN
DIRECT_MOVE :=FALSE;
END_IF;
STATE0 := STATE1;
Синтезировать последовательностные схемы на языках МЭК можно, но было лень. Поэтому и была сделана поочередная проверка на направление вращения. Два бита фаз энкодера образовывали число, которое менялось либо так:
1->3->2->0->1...
либо так:
0->2->3->1->0...
В зависимости от направления вращения.
Делаем из уровня фронт:
Z_TRIG(CLK := ENCODER_Z ); - третий вывод энкодера, Z
При наезде на концевик телегой происходило следующее:
IF SW1_END_RAIL THEN
HI_BITS_ENCODER :=0; - это переменная, в которой запоминается, сколько оборотов (через через метку Z) сделал вал телеги
END_IF;
После чего телега ехала в сторону увеличения координат до тех пор, пока не случался первый Z. Он и становился меткой начала пути.
IF ENCODER_Z THEN
ENCODER_PT := ADR(ENCODER); - а это - волшебная штука, которая
ENCODER_PT^:= 0; работает только на самой последней прошивке ПЛК Овен - обнуление регистра "энкодера" через указатель.
Иначе говоря, проходя каждый оборот, синхронизируется метка Z и счетчик импульсов энкодера.
END_IF;
А при возникновении фронта импульса Z в дополнительно созданном регистре, где хранятся "старшие биты" - а точнее - количество полных оборотов вала телеги учитываем их в зависимости от заранее определенного направления движения.
IF Z_TRIG.Q AND DIRECT_MOVE THEN
HI_BITS_ENCODER := HI_BITS_ENCODER + 1;
END_IF;
IF Z_TRIG.Q AND (NOT DIRECT_MOVE) THEN
HI_BITS_ENCODER := HI_BITS_ENCODER - 1;
END_IF;
Таким способом, можно учитывать пробег энкодером существенных расстояний. При этом в переменной, не совсем удачно названной HI_BITS_ENCODER, можно хранить огромное количество полных оборотов вал, а точный "хвост" внутри каждого оборота считывать собствеенно из регистра модуля "энкодер".
Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
-
Правила форума