Изучение структурированного текста, функциональный блок для управления толкателем

У меня есть опыт программирования на ПК (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. Тест был в середине декабря, но я хочу узнать больше о структурированном тексте и разработке программ для ПЛК. Также код предназначен для работы в ЦП Mitsubishi FXCPU и написан в GX Works 2.


plc
person Richard87    schedule 01.01.2015    source источник


Ответы (1)


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

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

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

person Bill J.    schedule 16.01.2015
comment
Привет, спасибо за ответ :) Мой TON сбрасывается каждый раз, когда переменная IN становится низкой. Я посмотрю на структуры Case :) - person Richard87; 17.01.2015
comment
Ага :D Спасибо, этот комментарий решил проблему ;) Проблема была в том, что SkyvIn не сбрасывается при активации Reset :) Спасибо! - person Richard87; 17.01.2015