2015-01-01 4 views
0

Я исхожу из фона в компьютерном программировании (VB/C# .Net и PHP) и изучаю программирование ПЛК в школе. В недавнем тесте мы имели, где создать функциональный блок, который будет подталкивать элемент производственной линии и в контейнер.Изучение структурированного текста, функциональный блок для управления «толкателем»

Теперь это довольно просто, поэтому я добавил сигнал тревоги в свой код, если «толкатель» (из-за отсутствия лучшего слова), который активируется, если маневр не будет завершен в течение 10 секунд.

Моя проблема заключается в том, что толкатель сразу переходит в состояние тревоги, и кажется, что он довольно искажен: (Таким образом, любой ответ даст некоторое представление о том, как лучше структурировать код, или выяснить, почему он переходит в сигнал тревоги быстро ...

(* INIT *) 
(* Drive the pusher back if its out on init *) 

IF M8002 THEN 
     SkyvTilbake := TRUE; (* My "Function"/Step to retract the pusher *) 
     Ferdig := FALSE; (*Let other components know that the pushers operation has completed *) 
     SkyverUtMotor := FALSE; (*This is the engine output for driving the pusher out *) 
     SkyverInnMotor := FALSE; (* This is the engine output for driving the pusher in *) 
END_IF; 

(* "Aktiver" is a input to activate the pusher *) 
IF Aktiver THEN 
    SkyvTilbake := FALSE; 
    SkyvUt := TRUE; (* My "Function"/Step" to push the pusher out *) 
    Ferdig := FALSE; 
END_IF; 

(* Push out step *) 
IF SkyvUt AND NOT SkyvTilbake AND NOT Alarm THEN 
    TON_1(IN:= SkyvUt ,PT:= AlarmTid ,Q:= Alarm ,ET:= TimeLeft); 
    SkyverUtMotor := TRUE; 

    (* When sensor out activates (input), retract the pusher *) 
    IF SensorUte THEN 
     SkyvUt := FALSE; 
     SkyvTilbake := TRUE;  
     SkyverUtMotor := FALSE; 
    END_IF; 

(* retract the pusher as long as there are no alarms *) 
ELSIF SkyvTilbake AND NOT Alarm THEN 
    TON_2(IN:= SkyvTilbake ,PT:= AlarmTid ,Q:= Alarm ,ET:= TimeLeft); 
    SkyverInnMotor := TRUE; 

    (* When it reach the normal position, activate "Ferdig" *) 
    IF SensorInne THEN 
      SkyverInnMotor := FALSE; 
      SkyvTilbake := FALSE; 
      Ferdig := TRUE; 
    END_IF; 
END_IF; 

(* When the alarm activates, stop all the engines *) 
IF Alarm THEN 
    SkyverUtMotor := FALSE; 
    SkyverInnMotor := FALSE; 
END_IF; 

(* RESET ALARM *) 
IF Reset THEN 
    Alarm := 0; 
    SkyvTilbake := TRUE; 
END_IF; 

PS. испытание было в середине декабря, но я ищу, чтобы узнать больше о структурированном тексте и разработке программ PLC. Кроме того, код разработан для работы в Mitsubishi FXCPU , и написано в GX Works 2

ответ

1

Я не вижу, где вы на самом деле устанавливаете продолжительность времени для своего таймера (PT: = AlarmTid).

Кроме того, поскольку я не знаком с Mitsubishi PLC, выполняйте автоматическую перезагрузку таймеров? Похоже, как только ваш таймер включен, он никогда не отключается.

Вы также можете изучить использование CASE. , , WHERE ', он стремится очистить код.

+0

Привет, спасибо за ответ :) Мой TON сбрасывается каждый раз, когда переменная 'IN' идет низко. Я рассмотрю структуры Case :) – Richard87

+0

Aha: D Спасибо, этот комментарий решил это;) Проблема была SkyvIn не сбрасывается при активации Reset :) Thx! – Richard87