Есть свободно исполняемая задача в Кодесис 2.3 для ПОК110 М02 в которой ведётся отсчёт времени процесса от 0 до 1 час 30 мин 00 сек. Но получается очень большое отклонение по времени от "эталонного" секундомера. Код
Код:
PROGRAM TIMER_SEC
VAR
(* глобальные переменные
_SEC : BYTE := 0;
_MIN : BYTE := 0;
_HUR : BYTE := 0;
*)
tx : DWORD;
last : DWORD;
ms : DWORD;
(* ЭЛЕМЕНТЫ *)
R_trigger : R_TRIG;
END_VAR
(* ОБНУЛЕНИЕ ПЕРЕМЕННЫХ ВРЕМЕНИ *)
IF (RESET_TIMER) THEN
_SEC := 0;
_MIN := 0;
_HUR := 0;
_SEC_PROC := 0;
RESET_TIMER := FALSE;
END_IF
(* ТАКТИРОВАНИЕ ТРИГГЕРА *)
R_trigger( CLK := START_TIMER AND NOT (STOP_TIMER) );
(* ЗАПУСК ТАЙМЕРА ПО КОМАНДЕ *)
IF ( START_TIMER AND NOT (STOP_TIMER) ) THEN
(* ВХОД В ФУНКЦИЮ. ВЫПОЛНЯЕТСЯ ОДИН РАЗ ПРИ ВХОДЕ *)
IF R_trigger.Q = TRUE THEN
tx := TIME_TO_DWORD(TIME());
END_IF
ms := TIME_TO_DWORD(TIME()) - tx;
(* УВЕЛИЧЕНИЕ ВРЕМЕНИ ПРОЦЕССА НА 1 сек*)
IF ms >= 1000 THEN
_SEC_PROC := _SEC_PROC + 1;
IF _SEC < 59 THEN _SEC := _SEC + 1; ELSE _SEC := 0;
IF _MIN <59 THEN _MIN := _MIN + 1; ELSE _HUR := _HUR + 1; _MIN := 0; END_IF
END_IF
ms := 0;
tx := TIME_TO_DWORD(TIME());
END_IF
END_IF
Прошу помощи в решении проблемы более точного отсчёта времени.