[?]: Примеры задач с энкодером

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
max490
Posts: 2
Joined: Wed Jan 30, 2013 6:22 am

[?]: Примеры задач с энкодером

Post by max490 »

может кто то написать пример программы работы энкодера на step 7. И вообще где можно посмотреть примеры программ.
Answers to FAQs
Faq & Info
Faq & Info
Posts: 178
Joined: Thu Oct 13, 2005 6:42 pm
Location: Frequently Asked Questions – Часто Задаваемые Вопросы

Re: Примеры задач с энкодером

Post by Answers to FAQs »

max490
Posts: 2
Joined: Wed Jan 30, 2013 6:22 am

Re: [?]: Примеры задач с энкодером

Post by max490 »

Подскажите как можно решить задачу:
Скорость автомата постоянно меняется. Установка работает на большой скорости. Впрыск происходит по датчику который дает сигнал.
Для того чтобы азот попадал постоянно в бутылку при изменений скорости мне нужно постоянно подстраивать датчик перемещением его механически. Чтобы избежать этой настройки мне нужно сделать задержки сигнала от датчика который дает сигнал на впрыск.
Можете написать пример как это сделать у меня ничего не получается.
Автоматический режим
Show

Code: Select all

      A(    
      O     "M601"
      O     "M603"
      )     
      A     #azot_o
      S     "M1280"

      AN    #azot_o
      R     "M1280"

// Открытие
      A     "кн. управлен. с панели".COMANDO.c648
      O     
      A     "кн. управлен. с панели".COMANDO.c650
      A     "M1280"
      =     #AuxA                       //Открытие
// Закрытие
      A     "кн. управлен. с панели".COMANDO.c649
      O     
      A     "кн. управлен. с панели".COMANDO.c650
      AN    "M1280"
      O     
      AN    #ConMan                     //ручное управление
      AN    #ConAut                     //автоматическое управление
      AN    "M1280"
      =     #AuxB                       //Закрытие
//работа азот-инжектора

      A     #AuxA                       //открытие
      S     #out_azot                   //выход азот-инжектора
      A     #AuxB                       //закрытие
      R     #out_azot                   //выход азот-инжектора
      A     #out_azot

      A     "SQ205.4"
      =     "A331"                      // выход на азот инжектор
un7qbq
Posts: 3
Joined: Tue Feb 28, 2012 11:54 am

Re: [?]: Примеры задач с энкодером

Post by un7qbq »

сигнал с любой фазы энкодера на скоросной счетчик
сброс счетчика по фронту clock memory сигнала -на выходе число пропорциональное скорости машины.
делее разгоняем машину на полную смотрим какое число получится.
эта и будет константа от которой отнимаем число пропорциональное текущей скорости
полученная разность - уставка таймера
чем выше скорость нем меньше уставка таймера
увеличивая константу в большую сторону задается начальная задержка

удачи
NickLu2
Posts: 31
Joined: Wed Apr 21, 2010 4:25 pm

Re: [?]: Примеры задач с энкодером

Post by NickLu2 »

Как вариант - нужно делать задержку не по времени, а по оставшемуся расстоянию. Вот пример FC, который читает текущую позицию с абсолютного энкодера и пересчитывает ее в "OUT_DELTA_SPACE" - пройденное расстояние. Зная, что от датчика до клапана, скажем 1000 мм, интегруруем OUT_DELTA_SPACE и вычитаем это из 1000 мм. Как получится ноль - включаем клапан. Интегратор сбрасываем.
Если энкодер инкрементный - считаем импульсы и делаем то же самое.
Function
Show

Code: Select all

//Function         : 
//This program scales a continuous counter.
//Typical application: FM350 encoder counter module use.
//
//Counter range:   0..2^32..0 and so on...
//Function result: delta space between two conter readings. 
//                 Value is scaled into engineering units

VAR_INPUT
  IN_ACTUAL_COUNTER_VALUE : DWORD ;	//Actual counter value [pulses]
  IN_ENC_SCAL_K : REAL ;	//Encoder counter scaling factor [pulses/eng.unit]
  IN_DELTA_POS_LIMIT : INT ;	//Delta position limit [eng.units]
END_VAR
VAR_OUTPUT
  OUT_DELTA_SPACE : INT ;	//Delta space [eng.unit]
END_VAR
VAR_IN_OUT
  IN_OUT_DELTA_POS_REM : REAL ;	//Aux real used to save delta position reminder [eng.units]
  IN_OUT_POSITION : INT ;	//Position [engineering units]
  IN_OUT_PREV_COUNTR_VALUE : DINT ;	//Counter value at previous loop [pulses]
END_VAR
VAR_TEMP
  TMP_DELTA_POS : DINT ;	//Delta position between two samplings [eng.units]
  TMP_DELTA_POS_LIMIT_P : DINT ;	//Delta position limit + [eng.units]
  TMP_DELTA_POS_LIMIT_N : DINT ;	//Delta position limit - [eng.units]
  TMP_AUX_REAL : REAL ;	//Aux real
  TMP_AUX_INT : INT ;	//Aux integer
END_VAR
BEGIN
NETWORK
TITLE =DELTA SPACE CALCULATION AND SCALING
//ENCODER INPUT VARIABLE "IN_ACTUAL_COUNTER_VALUE" DATA STRUCTURE:
//MSW = Number of motor turns
//LSW = Actual motor angle position (0°->360° = 0 -> 65535 pulses)
// RAW DELTA 
// RAW DELTA SPACE [pulses]
      L     #IN_ACTUAL_COUNTER_VALUE; 
      L     #IN_OUT_PREV_COUNTR_VALUE; 
      -D    ; 
      DTR   ; 
      T     #TMP_AUX_REAL; 
      L     #IN_OUT_DELTA_POS_REM; 
      +R    ; 

// SCALED OUTPUT
      L     #IN_ENC_SCAL_K; 
      /R    ; 
      TRUNC ; 
      T     #TMP_DELTA_POS; 

// COMPENSATION BY REMINDER SCALING
      DTR   ; 
      L     #IN_ENC_SCAL_K; 
      *R    ; 
      L     #TMP_AUX_REAL; 
      TAK   ; 
      -R    ; 
// REMINDERS UPDATE
      L     #IN_OUT_DELTA_POS_REM; 
      +R    ; 
      T     #IN_OUT_DELTA_POS_REM; 

      L     #IN_ACTUAL_COUNTER_VALUE; 
      T     #IN_OUT_PREV_COUNTR_VALUE; 


NETWORK
TITLE =TEST OF DELTA POSITION LIMIT

      A(    ; 
      L     #IN_DELTA_POS_LIMIT; 
      ITD   ; 
      T     #TMP_DELTA_POS_LIMIT_P; 
      SET   ; 
      SAVE  ; 
      CLR   ; 
      A     BR; 
      )     ; 
      JNB   _001; 
      L     #TMP_DELTA_POS_LIMIT_P; 
      NEGD  ; 
      T     #TMP_DELTA_POS_LIMIT_N; 
_001: NOP   0; 
NETWORK
TITLE =TEST OF DELTA POSITION LIMIT
//IF delta position in one PLC loop > or < of safe delta position limit
//THEN  delta position = 0
//
//If remote I/O is turned OFF the counter value goes to 0. In this case a dummy 
//delta space may be detected. This limit is used to disregard this dummy delta 
//space. 
//Set the limit following this example:
//Eng. units: mm
//Max speed of equipment: 6000 mm/min (100 mm/sec)
//Plc loop = 20ms
//Max delta space in one plc loop: 100mm/s *0.02s = 2mm
//Safe limit to set: 4 mm (twice the max possible delta pulse)
      A(    ; 
      O(    ; 
      L     #TMP_DELTA_POS; 
      L     #TMP_DELTA_POS_LIMIT_P; 
      >D    ; 
      )     ; 
      O(    ; 
      L     #TMP_DELTA_POS; 
      L     #TMP_DELTA_POS_LIMIT_N; 
      <D    ; 
      )     ; 
      )     ; 
      JNB   _002; 
      L     L#0; 
      T     #TMP_DELTA_POS; 
_002: NOP   0; 
NETWORK
TITLE =POSITION COUNTER IN ENGINEERING UNITS (FUNCTION OUPUT)
//Remark: the position preset is done by the calling program
//0= replaced with TMP_DELTA_POS
      L     #IN_OUT_POSITION; 
      L     0; 
      +I    ; 
      T     #IN_OUT_POSITION; 
      NOP   0; 
NETWORK
TITLE =DELTA SPACE IN ENGINEERING UNITS (FUNCTION OUPUT)

      L     #TMP_DELTA_POS; 
      T     #OUT_DELTA_SPACE; 
      NOP   0; 
NETWORK
TITLE =FUNCTION RETURN

      SET   ; 
      SAVE  ; 
END_FUNCTION
Encoder counter scaling factor [pulses/eng.unit] - коэф. перевода импульсов в пройденный путь - включает в себя число импульсов на оборот энкодера", передаточное число редуктора (если он есть), радиус прижимного (или приводного) ролика и пр. механику

IN_OUT_DELTA_POS_REM - вспомогательный REAL
IN_OUT_PREV_COUNTR_VALUE - вспомогательный AUX DINT

после вызова этого FC, его выход можно проверить на достоверность - чтобы он был (ненулевым Когда_мотор_крутится) И в разумных пределах, т.е между текущим и предыдущим циклами считывания величина "OUT_DELTA_SPACE" не должна превышать заранее определенную величину. Иначе - сигнал неисправности