Просмотр полной версии : ПЛК110 + энокдер не работает триггер по переднему фронту.
Deanisii
11.06.2024, 08:23
Вроде простая задача, подключить энкодер и считать импульсы.
Энкодер E6B2-CWZ6C.
76463
Вот такие настройки быстрых портов и код самой программы. Энкодер 500 имульсов на оборот, вращаю рукой, медленно. Триггер не срабатывает. Если вместо триггера указываю вход IN.2, счет идет, как по фазе А так и по В. Значит энкодер подключен верно и работает. Но нужен именно фронт. Где я накосячил?
76459
76460
76461
76462
МихаилГл
11.06.2024, 09:14
Триггер срабатывает на один цикл программы, и когда приходит In.3, у вас там уже 0
PS
Добавьте/Измените:
If rtrig.Q then alfa:=1
If alfa and In.3 then ...; beta:= true;
if beta then alfa := beta := false
Энкодер на кодесисе 3.5:
PROGRAM POU_ENCODER
VAR
//Энкодер направления вращения
a: BOOL; //Вход датчика А
b: BOOL; //Вход датчика В
a1: BOOL; //Условие 1го положения
a2: BOOL; //Условие 2го положения
a3: BOOL; //Условие 3го положения
a4: BOOL; //Условие 4го положения
//Энкодер направления вращения
//Направление вращения
c0: BOOL; //Вращение вперед
d0: BOOL; //Вращение назад
//Направление вращения
zIMP1: R_TRIG; //Фронт импульса датчика А
zIMP2: R_TRIG; //Фронт импульса датчика В
zIMP3: F_TRIG; //Спад импульса датчика А
zIMP4: F_TRIG; //Спад импульса датчика В
zIMP5: R_TRIG; //Фронт импульса для "Вращение вперед"
zIMP6: R_TRIG; //Фронт импульса для "Вращение назад"
//Определение импульсов сигнала
i1: DINT; //Количество импульсов сигнала датчика А
i2: DINT; //Количество импульсов сигнала датчика В
iF1: DINT; //Количество накопленных импульсов сигнала датчика А для "Вращение вперед"
iF2: DINT; //Количество накопленных импульсов сигнала датчика В для "Вращение вперед"
iR1: DINT; //Количество накопленных импульсов сигнала датчика А для "Вращение назад"
iR2: DINT; //Количество накопленных импульсов сигнала датчика В для "Вращение назад"
//Определение импульсов сигнала
RESET_BIT: BOOL;
END_VAR
VAR_INPUT
iA1: BOOL; //Входной импульс основного датчика
iA2: BOOL; //Входной импульс вспомогательного датчика
END_VAR
VAR_OUTPUT
oC0: BOOL; //Направление вращения - Вперед
oD0: BOOL; //Направление вращения - Назад
oN1: DINT; //Количество импульсов датчика А
oN2: DINT; //Количество импульсов датчика В
END_VAR
//iA1 = 0/1 - Входной импульс основного датчика
a := iA1;
//iA2 = 0/1 - Входной импульс вспомогательного датчика
b := iA2;
//Энкодер направления вращения
IF a AND NOT b THEN a1 := 1; END_IF
IF a AND b THEN a2 := 1; END_IF
IF NOT a AND b THEN a3 := 1; END_IF
IF NOT a AND NOT b THEN a4 := 1; END_IF
IF a1 AND a2 AND a AND b THEN d0 := a3 := a4 := 0; c0 := 1;
ELSIF a2 AND a3 AND NOT a AND b THEN d0 := a4 := a1 := 0; c0 := 1;
ELSIF a3 AND a4 AND NOT a AND NOT b THEN d0 := a1 := a2 := 0; c0 := 1;
ELSIF a4 AND a1 AND a AND NOT b THEN d0 := a2 := a3 := 0; c0 := 1;
ELSIF a1 AND a2 AND a AND NOT b THEN c0 := a3 := a4 := 0; d0 := 1;
ELSIF a2 AND a3 AND a AND b THEN c0 := a4 := a1 := 0; d0 := 1;
ELSIF a3 AND a4 AND NOT a AND b THEN c0 := a1 := a2 := 0; d0 := 1;
ELSIF a4 AND a1 AND NOT a AND NOT b THEN c0 := a2 := a3 := 0; d0 := 1;
END_IF
//Энкодер направления вращения
//Направление вращения
oC0 := c0;
oD0 := d0;
//Направление вращения
zIMP1(CLK := a);
zIMP2(CLK := b);
zIMP3(CLK := a);
zIMP4(CLK := b);
zIMP5(CLK := c0);
zIMP6(CLK := d0);
//Определение импульсов сигнала
IF c0 AND zIMP1.Q THEN i1 := i1 + 1; END_IF
IF d0 AND zIMP3.Q THEN i1 := i1 - 1; END_IF
IF c0 AND zIMP2.Q THEN i2 := i2 + 1; END_IF
IF d0 AND zIMP4.Q THEN i2 := i2 - 1; END_IF
IF c0 AND zIMP1.Q THEN iF1 := iF1 + 1; END_IF
IF zIMP5.Q AND zIMP3.Q THEN iF1 := iF1 - 1; END_IF
IF c0 AND zIMP2.Q THEN iF2 := iF2 + 1; END_IF
IF zIMP5.Q AND zIMP4.Q THEN iF2 := iF2 - 1; END_IF
IF zIMP6.Q AND zIMP1.Q THEN iR1 := iR1 + 1; END_IF
IF d0 AND zIMP3.Q THEN iR1 := iR1 - 1; END_IF
IF zIMP6.Q AND zIMP2.Q THEN iR2 := iR2 + 1; END_IF
IF d0 AND zIMP4.Q THEN iR2 := iR2 - 1; END_IF
//Определение импульсов сигнала
//Количество импульсов
oN1 := i1;
oN2 := i2;
//Количество импульсов
IF RESET_BIT THEN
i1 := i2 := iF1 := iF2 := iR1 := iR2 := 0;
RESET_BIT := a1 := a2 := a3 := a4 := c0 := d0 := 0;
END_IF
Deanisii
11.06.2024, 16:56
Спасибо за ответ и предоставленный код.
Странно то, что код как у меня работает с быстрыми входами, но видимо есть некий нюанс который мне не совсем понятен.
Делал по видео с ютуба.
https://youtu.be/8jU-CjICKn8?t=493
Вроде код повторил в точности, но не работает. У него все ок. Ничего кроме фронтов он не обрабатывает.
76484
МихаилГл
11.06.2024, 17:18
Не старайтесь понять чужое, иногда это очень трудно, так как некоторые моменты не озвучиваются и начинаются ошибки. Лучше написать своё с нуля)
Но иногда, конечно, можно и списать...
Код выше не будет работать на высоких скоростях и с энкодером, у которого много импульсов. Это связано со временем цикла программы. Импульсы начнут теряться. В этом случае для плк210, например, надо переходить с программной реализации на аппаратную. Но в новых плк210 модификаций 1Х этого ещё нет. С плк160 мало работал.
Deanisii
11.06.2024, 20:00
Вроде как у меня триггер срабатывает не в цикле а по таймеру. Это прописано в основной программе и в системных событиях.
Deanisii
11.06.2024, 20:04
независимые (без and с кем-то) фронты считаются?
Да счет идет.
Deanisii
11.06.2024, 22:09
для обоих? //A,B
Вот сейчас, когда начал смотреть считает ли В, обнаружил, что на ней один импульс на оборот. Китайцы накосячили с расцветкой проводов. На В фаза согласно даташиту имеет белый цвет, а в реальности она оранжевая. Ну и Z ось белая вместо оранжевой.
Всем спасибо за участие. Все работает как нужно с моим кодом.
Deanisii
12.06.2024, 09:23
Ветка бестолковая, пусть хотя-бы код для подключения энкодера и увеличения ко-ва импульсов на один оборот тут будет.
Новичкам, таким как я, точно пригодится.
(*Объявление переменных*)
PROGRAM Incoder
VAR
R_TRIG_A1: R_TRIG;
F_TRIG_A1: F_TRIG;
R_TRIG_B1: R_TRIG;
F_TRIG_B1: F_TRIG;
R_TRIG_A2: R_TRIG;
F_TRIG_A2: F_TRIG;
R_TRIG_B2: R_TRIG;
F_TRIG_B2: F_TRIG;
IN: BYTE; (* Образ байта быстрых входов *)
END_VAR
(* Код програvмы Incoder*)
IN:=SysPortIn(0);
A1:=in.0;
B1:=in.1;
A2:=in.2;
B2:=in.3;
R_TRIG_A1(CLK:=A1 , Q=> );
F_TRIG_A1(CLK:=A1 , Q=> );
R_TRIG_B1(CLK:=B1 , Q=> );
F_TRIG_B1(CLK:=B1, Q=> );
R_TRIG_A2(CLK:=A2 , Q=> );
F_TRIG_A2(CLK:=A2 , Q=> );
R_TRIG_B2(CLK:=B2 , Q=> );
F_TRIG_B2(CLK:=B2 , Q=> );
IF R_TRIG_A2.Q AND NOT B2 THEN (* Одиночные импульсы*)
sh_a2:=sh_a2+1; (*Сложение*)
END_IF
IF R_TRIG_A2.Q AND B2 THEN
sh_a2:=sh_a2-1; (*Вычитание*)
END_IF
IF F_TRIG_A2.Q AND B2 THEN (*Удвоение точности*)
sh_a2:=sh_a2+1;
END_IF
IF F_TRIG_A2.Q AND NOT B2 THEN
sh_a2:=sh_a2-1;
END_IF
IF R_TRIG_B2.Q AND A2 THEN (*Утроение точности*)
sh_a2:=sh_a2+1;
END_IF
IF R_TRIG_B2.Q AND NOT A2 THEN
sh_a2:=sh_a2-1;
END_IF
IF F_TRIG_B2.Q AND A2 THEN (*Повышение ко-ва импульсно на 1 оборот в 4 раза*)
sh_a2:=sh_a2-1;
END_IF
IF F_TRIG_B2.Q AND NOT A2 THEN
sh_a2:=sh_a2+1;
END_IF
Основная программа
(*Переменная *)
PROGRAM PLC_PRG
VAR
StartPlc: BOOL:=TRUE;
END_VAR
(*Тело программы*)
IF StartPlc THEN
SetIRQ(20);
END_IF
IF in_z2 THEN
sh_a1:=sh_a1+1;
END_IF
StartPlc:=FALSE;
Тригеры объявлены для двух энкодеров, используется в коде только энкодер 2 с фазами А2 и В2.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot