У меня проблемы с моими заявлениями IF. Что бы предложить улучшить мой код? - PullRequest
0 голосов
/ 22 октября 2019

У меня проблемы с моей программой, некоторые вещи, которые я запрограммировал, не выполняют то, что я хочу.

Процедура такова: пользователь нажимает кнопку «ENABLE_PROG»: ничего не происходит, пользователь выбирает тип счета (count_type)= 0 «Начинает отсчет времени в порядке возрастания» или count_type = 1 «Начинает отсчет времени в порядке убывания»). На следующем шаге нажимается START_CMD, сгенерированное действие включает порт out_1, и «RUN _STS = TRUE» начинает отсчет времени. В другом случае пользователь нажимает «HOLD_CMD = true», активирует «hold_sts = true» и «RUN_STS = FALSE» и отключает порт «OUT_1 = FALSE и приостанавливает синхронизацию. Снова« HOLD_CMD = TRUE »включает« out_1 = true »и«RUN_STS = TRUE "это действие возвращает счетчик.

VAR_INPUT
ENABLE_PROG : BOOL := FALSE ;

START_CMD   : BOOL  := FALSE        ;
HOLD_CMD    : BOOL  := FALSE        ;

T1_H_STS_ASCEN      :   BOOL    := FALSE;
T1_M_STS_ASCEN      :   BOOL    := FALSE;
T1_S_STS_ASCEN      :   BOOL    := FALSE;

T1_H_STS_DESCEN     :   BOOL    := FALSE;
T1_M_STS_DESCEN     :   BOOL    := FALSE;
T1_S_STS_DESCEN     :   BOOL    := FALSE;

COUNT_TYPE  : USINT := 0            ;
END_VAR

VAR_OUTPUT

OUT_1       : BOOL      := FALSE    ;
RUN_STS     : BOOL      := FALSE    ;
HOLD_STS    : BOOL      := FALSE    ;

COUNT_HOUR  : REAL := 0.0   ;
COUNT_MIN   : REAL := 0.0   ;
COUNT_SEC   : REAL := 0.0   ;

END_VAR

VAR

(*F_OUT1    : BOOL := FALSE;*)


FIRST_CYCLE     :   BOOL    := FALSE;
TIME_0          :   TIME    := T#0ms;
CYCLE_T         :   TIME    := T#0ms;
CYCT_MS         :   DINT    := 0;
CYCT_SS         :   REAL    := 0.0;

PREV_START_CMD  :   BOOL    := FALSE;

F_COUNT_ASCEN   :   BOOL    := TRUE ;
F_COUNT_DESCEN  :   BOOL    := FALSE;
F_COUNT         :   USINT           ;

END_VAR

IF ENABLE_PROG = TRUE THEN

IF START_CMD = TRUE (*AND F_OUT1 = FALSE *) AND OUT_1 = FALSE  THEN
    OUT_1 := TRUE;
    PREV_START_CMD := START_CMD = TRUE;
END_IF; 

(*IF OUT_1 = FALSE F_OUT1 = TRUE THEN
    OUT_1 := TRUE;
END_IF;
*)
IF START_CMD = TRUE AND HOLD_CMD = FALSE  (*AND F_OUT1 = TRUE *)AND  OUT_1 = TRUE THEN
    RUN_STS := TRUE;
END_IF;

IF  NOT FIRST_CYCLE THEN
    FIRST_CYCLE := TRUE;
    TIME_0      := GETTIME(T#0ms);
ELSE
    CYCLE_T := GETTIME(TIME_0);
    TIME_0  := GETTIME(T#0ms);
    CYCT_MS := TIME_TO_DINT(CYCLE_T);
    CYCT_SS := DINT_TO_REAL(CYCT_MS)/1000.0;
END_IF;

(*================================================================================================================================================================================================*)

(*HOLD_CMD*)
IF HOLD_CMD = TRUE THEN
   HOLD_STS := TRUE;    
END_IF;

IF HOLD_CMD = TRUE AND HOLD_STS = TRUE THEN
   RUN_STS := FALSE;
END_IF;

IF (*START_CMD = FALSE* AND*) RUN_STS = FALSE AND HOLD_CMD = TRUE (*AND F_OUT1 = TRUE*) THEN
   (*PREV_START_CMD := START_CMD = FALSE;*)
   (*F_OUT1         := FALSE;*)
   OUT_1          := FALSE;
END_IF;

(*===============================================================================================================================================================================================*)

(*COUNTING*)
IF START_CMD = TRUE AND OUT_1 = TRUE (*AND F_OUT1*) AND RUN_STS = TRUE AND HOLD_CMD = FALSE AND COUNT_TYPE = 0  THEN
   F_COUNT_ASCEN  := TRUE ;
   F_COUNT_DESCEN := FALSE;
END_IF;

(*GROWING ORDER SHOW*)
IF F_COUNT_ASCEN = TRUE AND F_COUNT_DESCEN = FALSE THEN
       IF T1_H_STS_ASCEN = TRUE THEN
                COUNT_HOUR := COUNT_HOUR + (CYCT_SS / 12.0); (*HOURS*)
       END_IF;

       IF T1_M_STS_ASCEN  = TRUE THEN
                COUNT_MIN := COUNT_MIN + (CYCT_SS / 60.0);  (*MINUTES*)
       END_IF;

       IF T1_S_STS_ASCEN  = TRUE THEN
                COUNT_SEC := COUNT_SEC + (CYCT_SS / 3600.0); (*SECONDS*)
       END_IF;

END_IF;

(*GROWING ORDER SHOW*)
IF START_CMD = TRUE AND OUT_1 = TRUE (*AND F_OUT1*) AND RUN_STS = TRUE AND HOLD_CMD = FALSE AND COUNT_TYPE = 1  THEN
   F_COUNT_ASCEN  := FALSE ;
   F_COUNT_DESCEN := TRUE;
END_IF;

    IF F_COUNT_DESCEN = FALSE AND F_COUNT_ASCEN = TRUE  THEN
       IF T1_H_STS_DESCEN = TRUE THEN
                COUNT_HOUR := COUNT_HOUR - (CYCT_SS / 12.0); (*HOURS*)
       END_IF;

       IF T1_M_STS_DESCEN = TRUE THEN
                COUNT_MIN := COUNT_MIN - (CYCT_SS / 60.0);  (*MINUTES*)
       END_IF;

       IF T1_S_STS_DESCEN = TRUE THEN
                COUNT_SEC := COUNT_SEC - (CYCT_SS / 3600.0); (*SECONDS*)
       END_IF;

    END_IF;
END_IF;(*END_IF ENABLE_PROG*)   
(*===============================================================================================================================================================================================*)     






Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...