Вот пример в CFC использования функции time для счета времени работы агрегата, может кому пригодиться
Вид для печати
Вот пример в CFC использования функции time для счета времени работы агрегата, может кому пригодиться
так его же и использую (time), только если человек будет работать с ним постоянно, придется учесть переход через переполнение, а это так пример для короткой засечки времени
Если вычитать 2 беззнаковых числа - разница между ними не зависит от переполнения. (маленкий программистский хитрост)
тогда более всего подойдет тип
UDINT: от 0 до 4294967295 32 Бит
Кто бы из знающих подсказал:
Функция ведет отсчет, базируясь на данных 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 секунду
Для этих стробов 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);
Точней - ни как.
Спасибо, выручили! )))
Всем здравствуйте, подскажите как мне найти WORD_TO_TIME или DWORD_TO_TIME их просто напросто нет CDS v3.5 может они в какой-то особой библиотеке?! Хочу передавать значения в панели оператора и использовать их в таймере