Помогите перевести кусок STL в LAD

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Mzman
Posts: 40
Joined: Sun Oct 02, 2011 12:13 am

Помогите перевести кусок STL в LAD

Post by Mzman »

Здравствуйте.
Пытаюсь изучать STL и на простом примере не могу воссоздать на LAD небольшой фрагмент из STL.


Code: Select all

CLR   
      O(    
      A     #In_1
      FN    #In_1_fn
      )     
      O(    
      A     #In_2
      FN    #In_2_fn
      )     
      O(    
      A     #In_3
      FN    #In_3_fn
      )     
      A(    
      O     #In_4             
      O     #In_5               
      )     
      =     #Out_1
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: Помогите перевести кусок STL в LAD

Post by Rex2701 »

Как-то так... http://imgur.com/a/FgSfh
Mzman
Posts: 40
Joined: Sun Oct 02, 2011 12:13 am

Re: Помогите перевести кусок STL в LAD

Post by Mzman »

Я тоже так подумал, но это не правильно.Вот что получилось из вашего примера :

Code: Select all

     A(    
      A     #Forward_key
      FN    #Forward_key_fn
      O(    
      A     #Backward_key
      FN    #Backward_key_fn
      )     
      O(    
      A     #Totman_move
      FN    #Totman_key_fn
      )     
      )     
      A(    
      O     #Start_mode_key
      O     #Man_mode_key
      )     
      =     #Temp_1
И работают эти коды тоже по разному.
DiVan
Site Admin
Posts: 127
Joined: Mon Aug 15, 2011 2:27 pm

Re: Помогите перевести кусок STL в LAD

Post by DiVan »

Mzman wrote:Я тоже так подумал, но это не правильно.Вот что получилось из вашего примера :
Mzman wrote:

Code: Select all

CLR   
      O(      
..............
      )     
      =     #Temp_1

Code: Select all

      A(    
..............
      )     
      =     #Temp_1
Кто написал первый код ?
Mzman wrote:И работают эти коды тоже по разному.
Как именно по разному - неправильно и правильно ?
Логика на ЛАДе выглядит логичнее,
Image
а вот приведённый фрагмент похож на ручную правку кода из ЛАДа - поэтому впереди появился CLR (заменили А (верхняя ветка) ?) и за ним ИЛИ... что явно нелогично (boom)
Mzman
Posts: 40
Joined: Sun Oct 02, 2011 12:13 am

Re: Помогите перевести кусок STL в LAD

Post by Mzman »

Первый код писал сторонний программист.
Это не весь код,а только лишь его часть.
Вопрос не стоит о том,правильно ли он работает или нет.
Задача: воссоздать его на LAD.
И воссозданный LAD перевести в STL (STEP7 View->STL).
Коды исходного кода и воссозданного должны быть идентичными.
Значит и логика их работы тоже будет идентична.
DiVan
Site Admin
Posts: 127
Joined: Mon Aug 15, 2011 2:27 pm

Re: Помогите перевести кусок STL в LAD

Post by DiVan »

в ЛАДе нет команды CLR и её назначение в приведённом фрагменте не ясно, также как неясно назначение О(...) после неё
поэтому перевести всё написанное вручную не всегда возможно.
Логика писания постороннего писателя не ясна... приведи копию экрана этой функции с самого начала... даже по её виду можно будет сделать некоторые выводы.
Rex2701 привёл правильный вариант для данного фрагмента - CLR в данном случае не нужна, так как в начале ветки NETWORK это и так автоматом происходит в ЛАДе.
Mzman
Posts: 40
Joined: Sun Oct 02, 2011 12:13 am

Re: Помогите перевести кусок STL в LAD

Post by Mzman »

Это FB и он очень большой.В качестве примера привожу первый Network
Spoiler
Show

Code: Select all

BEGIN
NETWORK
TITLE = 
//Формирование сигнала готовности джойстика. Этот сигнал обеспечивает блокировку 
//самопроизвольного включения привода передвижения и тормоза при:
//   - выходе из строя связанного с передвижением оборудования,
//   - срабатывании защитных устройств.
//А также запуск передвижения возможен при остановленных барабанах, иначе 
//возможно 
//перенатяжение или переослабление кабеля при повторных последовательных 
//запусках.
      L     DINO; 
      T     #DINO; 

      CLR   ; 
// в момент перевода джойстика из положения "вперёд" или "назад" сбрасываем сигнал Ready_for_control, чтобы 
// дальшейшие действия по передвижению были возможны только после установки джойстика в нулевое положение.
      O(    ; 
      A     #Forward_key; 
      FN    #Forward_key_fn; 
      )     ; 
      O(    ; 
      A     #Backward_key; 
      FN    #Backward_key_fn; 
      )     ; 
      O(    ; 
      A     #Totman_move; 
      FN    #Totman_key_fn; 
      )     ; 
      A(    ; 
      O     #Start_mode_key; // в наладочном или
      O     #Man_mode_key; // ручном режиме
      )     ; 
      =     #Temp_1; 

// собираем по "и" всевозможные условия разрешения передвижения.
// есть всевозможные напряжения питания 
      AN    #Temp_1; // если нет выключения передвижения "вперёд" или "назад",
      A     #Control_supply; 
      A     #Sound_supply; 
      A     #Motor_qf; 
      AN    #Main_qs_fail; 
      A     #Brake_supply; 

      AN    #Hardware_fail; 
      A(    ; // не в наладочном режиме нет сбоя в работе кабельных барабанов.
      O     #Start_mode_key; // пока уберём.
      ON    #Drum_fail; 
      )     ; 

// органы управления в нужном состоянии
      A     #Switch_on; 

      AN    #Inch_finish; // и не завершено передвижение "толчками"

// рельсовые захваты разжаты
      AN    #Rail_clamp_1_on; 
      AN    #Rail_clamp_2_on; 
      A     #Rail_clamp_1_off; 
      A     #Rail_clamp_2_off; 

      A(    ; // в ручном режиме при укладке работает стреловой конвейер.
//      O     #Boom_conveyor_on
      O     #Start_mode_key; //       
//      O     #Auto_mode_key         // в автоматическом режиме стреловой тоже должен работать
      O     #Capture_mode; 
      )     ; 

//   A(                                // и в ручном режиме при заборе работает роторное колесо
//  O     #Rotor_wheel_on
//  O     #Start_mode_key             //       
//  O     #Auto_mode_key
//  O     #Packing_mode
//  )     

      AN    #Brake_R_overheat; 
      AN    #Wind; 

// температура масла в редукторах в норме.
      AN    #T_03_LF_M1_ah; 
      AN    #T_03_RF_M2_ah; 
      AN    #T_03_RF_M3_ah; 
      AN    #T_03_LF_M1_al; 
      AN    #T_03_RF_M2_al; 
      AN    #T_03_RF_M3_al; 

// нет столкновения со штабалем и защитные тросы целостны.
      AN    #Hit_left; 
      AN    #Hit_right; 
      AN    #Protect_rope_left; 
      AN    #Protect_rope_right; 

      AN    #Mode_change; // и режим работы неизменен в процессе работы в одном из режимов,

// добавляем блокировку включения не из нейтрального положения джойстика.
      A(    ; 

      O(    ; // джойстик в нейтральном положении 
      O     #Start_mode_key; // в наладочном или
      O     #Man_mode_key; // ручном режиме
      A     #Stop_key; 
      AN    #Forward_key; 
      AN    #Backward_key; 
//      AN    #Brake_drum_on_state        // чтобы следующее передвижение было возможно только после останова барабанов,

// иначе возможно перенатяжение (переослабление) кабеля при запуске.
      )     ; 

      O(    ; 
      AN    #Forward_auto; // нет сигнала запуска в автоматическом режиме работы
      AN    #Backward_auto; 
      A     #Auto_mode_key; 
      )     ; 

      O     #Ready_for_control; 
      )     ; 

      SAVE  ; 
// не достигнуты пределы передвижения
      AN(   ; 
      O     #Start_mode_key; // в наладочном или
      O     #Man_mode_key; // ручном режиме
      A     #Forward_limit; 
      A     #Forward_req; // при движении вперёд
      )     ; 

      AN(   ; 
      O     #Start_mode_key; // в наладочном или
      O     #Man_mode_key; // ручном режиме
      A(    ; 
      O     #Backward_limit; 
      O     #Backward_lim_switch_freq; 
      )     ; 
      A     #Backward_req; // при движении назад.
      )     ; 

      AN(   ; // при этом стрела по повороту
// не выполняется следующее
      O(    ; 
      O     #Sklad_zone_turn; // в зоне складского конвейера
      O     #Left_shtabel; // или в зоне левого штабеля
      A     #Forward_limit_1; // когда машина в зоне узла пересыпки
      =     #Block_turn_left; 
      )     ; 
      O     #Forward_lim_switch_freq; 
      A     #Forward; // и идёт передвижение вперёд
      )     ; 

      =     #Ready_for_control; 

// --------- Формируем сигналы готовности к передвижению вперёд и назад для ОР.
      A     BR; 
      AN    #Forward_limit; 
      AN(   ; 
      O     #Sklad_zone_turn; // в зоне складского конвейера
      O     #Left_shtabel; // или в зоне левого штабеля
      A     #Forward_limit_1; // когда машина в зоне узла пересыпки
      )     ; 
      AN    #Forward_lim_switch_freq; 
      =     #Ready_for_forward_OP; 

      A     BR; 
      AN    #Backward_limit; 
      AN    #Backward_lim_switch_freq; 
      =     #Ready_for_backward_OP; 
// ---------
CoMod
Site Admin
Posts: 3992
Joined: Thu Feb 16, 2006 3:25 pm
Location: Russia

Re: Помогите перевести кусок STL в LAD

Post by CoMod »

Весь блок можно переписать в несколько веток LAD.
Предложенный Rex2701 вариант для данного фрагмента правильный.
При применении оператора А в начале он становится визуализированным во всех языках = результат будет идентичным - можешь проверить в симуляторе.
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: Помогите перевести кусок STL в LAD

Post by Rex2701 »

Mzman wrote:Я тоже так подумал, но это не правильно.Вот что получилось из вашего примера :

...

И работают эти коды тоже по разному.
Я переводил свой LAD в STL, и да, заметил разницу. Но эта разница абсолютно непринципиальна, и вот почему:
1. Для нормального выполнения кода необходимо, чтобы флаг RLO = 1. Именно его проверяет первый оператор "А": (RLO AND BR) = (1 AND 1) = 1.
2. В вашем случае, зачем-то RLO сбрасывается, но следующему оператору "O" на это наплевать и в итоге разницы не будет: (RLO OR BR) = (0 OR 1) = 1.

Если вы считаете, что разница между CLR-O и просто A принципиальна - приведите бОльший кусок кода, где будет видна необходимость такой конструкции.
И соглашусь с выше отписавшимися - подобные конструкции LAD-редактором никогда не генерируются, это явное вмешательство человека.
Mzman
Posts: 40
Joined: Sun Oct 02, 2011 12:13 am

Re: Помогите перевести кусок STL в LAD

Post by Mzman »

Я писал,что коды исходного STL и восстановленного LAD работают по разному. На самом деле это так,если из этих кодов делать FC. При FB все работает одинаково.
Всем спасибо.
Хотя мне и не понятно почему на FC коды отрабатывают по разному.