У меня проблемы с моей программой, некоторые вещи, которые я запрограммировал, не выполняют то, что я хочу.
Процедура такова: пользователь нажимает кнопку «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*)
(*===============================================================================================================================================================================================*)