Показано с 1 по 8 из 8

Тема: ПЛК110 + энокдер не работает триггер по переднему фронту.

  1. #1

    По умолчанию ПЛК110 + энокдер не работает триггер по переднему фронту.

    Вроде простая задача, подключить энкодер и считать импульсы.
    Энкодер E6B2-CWZ6C.

    5.png

    Вот такие настройки быстрых портов и код самой программы. Энкодер 500 имульсов на оборот, вращаю рукой, медленно. Триггер не срабатывает. Если вместо триггера указываю вход IN.2, счет идет, как по фазе А так и по В. Значит энкодер подключен верно и работает. Но нужен именно фронт. Где я накосячил?

    1.png

    2.png

    3.png

    4.png
    Последний раз редактировалось Deanisii; 11.06.2024 в 08:34.

  2. #2

    По умолчанию

    Триггер срабатывает на один цикл программы, и когда приходит 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
    Последний раз редактировалось МихаилГл; 11.06.2024 в 09:37.

  3. #3

    По умолчанию

    Спасибо за ответ и предоставленный код.
    Странно то, что код как у меня работает с быстрыми входами, но видимо есть некий нюанс который мне не совсем понятен.
    Делал по видео с ютуба.

    https://youtu.be/8jU-CjICKn8?t=493

    Вроде код повторил в точности, но не работает. У него все ок. Ничего кроме фронтов он не обрабатывает.

    2.png

  4. #4

    По умолчанию

    Не старайтесь понять чужое, иногда это очень трудно, так как некоторые моменты не озвучиваются и начинаются ошибки. Лучше написать своё с нуля)
    Но иногда, конечно, можно и списать...

    Код выше не будет работать на высоких скоростях и с энкодером, у которого много импульсов. Это связано со временем цикла программы. Импульсы начнут теряться. В этом случае для плк210, например, надо переходить с программной реализации на аппаратную. Но в новых плк210 модификаций 1Х этого ещё нет. С плк160 мало работал.
    Последний раз редактировалось МихаилГл; 11.06.2024 в 17:21.

  5. #5

    По умолчанию

    Вроде как у меня триггер срабатывает не в цикле а по таймеру. Это прописано в основной программе и в системных событиях.

  6. #6

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    независимые (без and с кем-то) фронты считаются?
    Да счет идет.

  7. #7

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    для обоих? //A,B
    Вот сейчас, когда начал смотреть считает ли В, обнаружил, что на ней один импульс на оборот. Китайцы накосячили с расцветкой проводов. На В фаза согласно даташиту имеет белый цвет, а в реальности она оранжевая. Ну и Z ось белая вместо оранжевой.

    Всем спасибо за участие. Все работает как нужно с моим кодом.

  8. #8

    По умолчанию

    Ветка бестолковая, пусть хотя-бы код для подключения энкодера и увеличения ко-ва импульсов на один оборот тут будет.
    Новичкам, таким как я, точно пригодится.
    Код:
    (*Объявление переменных*)
    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.
    Последний раз редактировалось Deanisii; 12.06.2024 в 09:26.

Похожие темы

  1. Не работает RS триггер.
    от Gatling в разделе ПЛК2хх
    Ответов: 6
    Последнее сообщение: 08.09.2022, 18:33
  2. Ответов: 14
    Последнее сообщение: 04.05.2018, 20:54
  3. Ложный импульс по фронту R_TRIG
    от skinnbatter в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 19.07.2017, 05:02
  4. ПЛК110-30 не работает
    от приборист в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 05.02.2016, 18:56
  5. Запоминание переменной по фронту импульса
    от Goga2000 в разделе Программируемые реле
    Ответов: 5
    Последнее сообщение: 21.03.2014, 15:40

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •