Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 21

Тема: Использование переменной TIME

  1. #11
    Пользователь
    Регистрация
    18.07.2008
    Адрес
    Владимир
    Сообщений
    113

    По умолчанию

    Вот пример в CFC использования функции time для счета времени работы агрегата, может кому пригодиться
    Вложения Вложения
    Последний раз редактировалось kucherik; 15.02.2009 в 17:55. Причина: файл надо прикрепить

  2. #12

    По умолчанию

    Цитата Сообщение от kucherik Посмотреть сообщение
    Вот пример в CFC использования функции time для счета времени работы агрегата, может кому пригодиться
    Идентификатор time в кодесис уже зарезервирован. Назовите хотя-бы time1.

  3. #13
    Пользователь
    Регистрация
    18.07.2008
    Адрес
    Владимир
    Сообщений
    113

    По умолчанию

    так его же и использую (time), только если человек будет работать с ним постоянно, придется учесть переход через переполнение, а это так пример для короткой засечки времени

  4. #14

    По умолчанию

    Если вычитать 2 беззнаковых числа - разница между ними не зависит от переполнения. (маленкий программистский хитрост)

  5. #15
    Пользователь
    Регистрация
    18.07.2008
    Адрес
    Владимир
    Сообщений
    113

    По умолчанию

    тогда более всего подойдет тип
    UDINT: от 0 до 4294967295 32 Бит

  6. #16

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    Эпилог: есть еще функция TIME(), которая возвращает системное время…
    Кто бы из знающих подсказал:

    Функция ведет отсчет, базируясь на данных RTC ?
    Хотелось бы знать точность этого времени.

    Потому что у меня такая проблема - беру время функцией GetTimeEx - на основе его формирую секундные и минутные стробы
    Программа работает на 16-ти ПЛК - половина из них ПЛК150, половина ПЛК110

    На 150-ых - все нормально, а на 110ых - иногда в минуте бывает 59 секунд (в результате того, что поле .Second обновляется как то не равномерно)
    За сутки таких минут набирается около 50-ти

    Код:
    VAR_OUTPUT
    	sec_pulse	: BOOL := FALSE;
    	min_pulse	: BOOL := FALSE;
    END_VAR
    VAR
    	clock		: CurTimeEx;
    	datetime	: SystemTimeDate;
    	uptime		: SysTime64;
    
    	second_counter	: BYTE := 0;
    	second_copy	: BYTE := 0;
    
    	minute_counter	: BYTE := 0;
    	hour_counter	: BYTE := 0;
    
    	prew_second	: INT;
    	prew_minute	: INT;
    
    END_VAR
    VAR CONSTANT
        nulldt: SystemTimeDate;	(*нужна для обнуления параметров*)
    END_VAR
    
    ...
    datetime := nulldt;
    clock(SystemTime := uptime, TimeDate := datetime);
    sec_pulse := datetime.Second <> prew_second;
    IF sec_pulse THEN
    	prew_second := datetime.Second;
    END_IF
    min_pulse := datetime.Minute <> prew_minute;
    IF min_pulse THEN
    	prew_minute := datetime.Minute;
    END_IF
    
    (* Счет импульсов *)
    IF sec_pulse THEN
    	second_counter := second_counter + 1;
    END_IF
    IF min_pulse THEN
    	second_copy := second_counter;		(* Вот здесь бывает 60 сек. а иногда - 59 сек. *)
    						(* Также в первую минуту это значение может быть не корректно, не обращать внимание *)
    	second_counter := 0;
    END_IF
    Может кто посоветует, Как формировать секундные и минутные стробы с максимально возможной точностью, и чтобы не было потерь секунд.
    Уход за сутки +/- 5 минут удовлетворяет, но не больше (((((
    К тому же вижу, что часы на самом ПЛК идут достаточно точно.
    Цикл плк 15 мс, за это время програма формирования импульсов вызывается от 20 до 120 раз в секунду (понимаю ,что когда она вызывается 20 раз - плк немножко перегружен, но это бывает примерно раз в минуту), но по идее, этого должно быть достаточно, чтобы поймать изменение времени на 1 секунду
    Последний раз редактировалось vasylye; 05.12.2015 в 20:20.

  7. #17
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,054

    По умолчанию

    Для этих стробов syslibtime не нужен
    sec_pulse,min_pulse : f_trig;
    sec : byte;

    sec_pulse(CLK := (time_to_dword(time()) mod 1000) > 500);
    sec := (sec + sel(sec_pulse.q,0,1)) mod 60;
    min_pulse(CLK := sec = 0);

    Точней - ни как.

  8. #18

    По умолчанию

    Спасибо, выручили! )))

  9. #19

    По умолчанию

    Цитата Сообщение от Николаев Андрей Посмотреть сообщение
    Мне кажется как то все сложно...
    А нельзя просто использовать круговую синусоиду для Вашей задачи: y:=a*SIN(6.28*t*f)
    Или библиотека Util.lib. Блок GEN.
    В нем есть переменная период, которая как раз в формате времени.
    Попробуйте блок подключить и посмотреть как происходит работа при изменении значения входных переменных блока на визуализации. Все на свои места станет.

    Используйте как отдельный блок, вызываемый по времени и все.


    А как обозначить t и f. как программа их узнает? это наверно время и частота!? или нет?

  10. #20

    По умолчанию

    Всем здравствуйте, подскажите как мне найти WORD_TO_TIME или DWORD_TO_TIME их просто напросто нет CDS v3.5 может они в какой-то особой библиотеке?! Хочу передавать значения в панели оператора и использовать их в таймере

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Ваши права

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