Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Отсчёт времени ПЛК110 М02 с погрешностью 5 сек за 10 мин

  1. #1

    По умолчанию Отсчёт времени ПЛК110 М02 с погрешностью 5 сек за 10 мин

    Есть свободно исполняемая задача в Кодесис 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
    Прошу помощи в решении проблемы более точного отсчёта времени.
    Последний раз редактировалось Антон_Б; 22.10.2016 в 19:33.

  2. #2

    По умолчанию

    Цитата Сообщение от Антон_Б Посмотреть сообщение
    Прошу помощи в решении проблемы более точного отсчёта времени.
    У вас TIME() выполняется 2 раза. Время между этими вызовами "теряется".

    Лучше в "начале" процесса просто сохраните "текущее время", и когда нужна длительность, то просто вычитайте из текущего времени "время старта".

  3. #3
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    код написан по идиотски. Наличие нескольких вызовов таймеров ни как не влияет, а вот какой то бредовый способ самостоятельно вычислять секунды, минуты и т.д не дает добиться приемливого результата. Ну есть же в оскате функции получения времени из миллисекунд, зачем придумывать "велосипед"
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  4. #4

    По умолчанию

    Подскажите Как называется эта функция? Есть ли она для 2ого кодесус?
    Последний раз редактировалось Антон_Б; 22.10.2016 в 19:44.

  5. #5

    По умолчанию

    ИСПОЛЬЗОВАЛ ФУНКЦИЮ ONTIME из OSCAT и офигел от объёма получившегося кода. Он сразу увеличился на 50 кБ.

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    Цитата Сообщение от Антон_Б Посмотреть сообщение
    ИСПОЛЬЗОВАЛ ФУНКЦИЮ ONTIME из OSCAT и офигел от объёма получившегося кода. Он сразу увеличился на 50 кБ.
    ну значит Вам так хочется. Не проще полученную разницу преобразовать с помощью DWORD_TO_TIME и уже полученное время в любой момент будет актуальным с начала отсчета,+-погрешность контроллера. А затем уже из полученнного времени вычислять отдельно секунды минуты и т.п.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #7

    По умолчанию

    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

    Похоже ошибка в проверке не просто < 59 , а <=59. Недоставало 1 сек 1 мин и т. п.

  8. #8
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    да Вы настырный, всё пытаетесь свой велосипед доделать, так не проще
    Код:
       VAR_INPUT 
          IN : Time;
       END_VAR
    
       VAR_OUTPUT 
          HOUR : Int;
          MINUTE : Int;
          SECOND : Int;
       END_VAR
    
       VAR_TEMP 
          tik : DInt;
       END_VAR
    
    
    BEGIN
    	#tik := TIME_TO_DINT(#IN);
    	#tik := #tik / 1000;
    	#SECOND := DINT_TO_INT(#tik MOD 60);
    	#tik := #tik / 60;
    	#MINUTE := DINT_TO_INT(#tik MOD 60);
    	#tik := #tik / 60;
    	#HOUR := DINT_TO_INT(#tik MOD 24);
    	
    END_FUNCTION
    а раз у Вас уже есть разница в дворд, то и эта функция упростится
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  9. #9

    По умолчанию

    Проблема не в вычислении часов минут секунд, а получении правильного секундного тика из ПЛК.

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    Цитата Сообщение от Антон_Б Посмотреть сообщение
    Проблема не в вычислении часов минут секунд, а получении правильного секундного тика из ПЛК.
    так его не берут через задний проход, ну есть у Вас строка ms := TIME_TO_DWORD(TIME()) - tx; этого достаточно чтоб получить отдельные элементы времени, а все эти вычисления больше либо равно тогдда плюсуем единичку, это и есть Ваша ошибка в неточности полученных значений
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Программирование ПЛК110 [М02] для задач реального времени
    от Филоненко Владислав в разделе ПЛК1хх [М02]
    Ответов: 676
    Последнее сообщение: 27.03.2024, 15:05
  2. Замена ПЛК110-60 [М01] на новую линейку ПЛК110-60 [М02]
    от RomanKuzmin в разделе ПЛК1хх [М02]
    Ответов: 1
    Последнее сообщение: 16.10.2016, 09:36
  3. Ответов: 15
    Последнее сообщение: 13.10.2016, 16:27
  4. Ответов: 5
    Последнее сообщение: 09.08.2016, 13:30
  5. Считывание времени с ПЛК110-32
    от ТКА Иван в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 02.11.2014, 13:33

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •