Просмотр полной версии : Вопрос про использование времени
sng21099
02.11.2024, 16:02
Здравствуйте! Помогите пожалуйста как можно проще решить задачу: Есть процесс, который может длиться несколько дней, а потом переключаться на другой процесс. Я должен сохранить дату и время старта процесса и проверять, прошёл ли срок процесса. Проблема в том, что я не могу никак оседлать syslibtime. Я тут на форуме находил функциональный блок, чтобы вытащить по отдельности часы, минуты, дни и т.д, но мне нужно сохранять именно полный формат Date_And_Time. А как этого добиться - не могу понять. При этом на Codesys 3.5 эту задачу решить можно за минуту. Очень надеюсь на вашу помощь
kondor3000
02.11.2024, 17:00
Здравствуйте! Помогите пожалуйста как можно проще решить задачу: Есть процесс, который может длиться несколько дней, а потом переключаться на другой процесс. Я должен сохранить дату и время старта процесса и проверять, прошёл ли срок процесса. Проблема в том, что я не могу никак оседлать syslibtime. Я тут на форуме находил функциональный блок, чтобы вытащить по отдельности часы, минуты, дни и т.д, но мне нужно сохранять именно полный формат Date_And_Time. А как этого добиться - не могу понять. При этом на Codesys 3.5 эту задачу решить можно за минуту. Очень надеюсь на вашу помощь
Из полученных времени и даты по отдельности собираете Дату-Время в формат UnixTime (UDINT или DWORD) , 79795 79800
тут функция https://owen.ru/forum/showthread.php?t=37203
2) fDT_to_UT (Время в секундах в формате UNIX) и из него Дату-Время в формате DT
Всего 2 строки
t_ :=fDT_to_UT(Second,Minute,hour,day,month,year); (* собираете с помощью функции время UnixTime t_:UDINT; например 1730566628 *)
DT1:=DWORD_TO_DT (t_ ); (* Из времени t_:UDINT; получаете Дату и Время в формате DT1: DT; например DT#2024-11-02-16:57:30 *)
Из DT1, так же можно выделить TOD1 : TOD; (Время TOD), конвертация DT_TO_TOD
T2: TIME; (Время TIME ), конвертация TOD_TO_TIME
D1 : DATE; (Дату), конвертация например D1:=DT_TO_DATE(DT1);
Здесь пример работы с биб-кой SysLibTime
5) Работа с библиотекой SysLibTime. Получение реального времени из ПЛК. Задание даты и времени в ПЛК
https://owen.ru/product/codesys_v2/example_program
Есть процесс, который может длиться несколько дней, а потом переключаться на другой процесс. Я должен сохранить дату и время старта процесса и проверять, прошёл ли срок процесса
Какое отношение имеет срок к датам?
Чиста абстрактно. Поменяли/слетела дата на ПЛК, и?
sng21099
05.11.2024, 08:19
Какое отношение имеет срок к датам?
Чиста абстрактно. Поменяли/слетела дата на ПЛК, и?
Вариант с таймером процесса тем более не подходит, так как при перезагрузке время таймера точно слетит. Не знаю действующего способа сохранять время таймера
kondor3000
05.11.2024, 09:13
Вариант с таймером процесса тем более не подходит, так как при перезагрузке время таймера точно слетит. Не знаю действующего способа сохранять время таймера
Кто вам сказал? Вы можете переменную времени таймера или таймер целиком поместить в RETAIN, в обоих случаях таймер будет полностью RETAIN.
Время наработки можно запоминать и отдельно, а таймер запускать с 0 каждый раз, прибавляя к нему наработку. Так можно ограничение 49 дней растянуть на годы.
Можно вообще не использовать таймер, а работать с функцией TIME(); точно так же запоминая наработку.
Делал счётчик каскадом на логических элементах, с возможностью сброса любой.
Даже выкладывал как-то.
Могу перевыложить, там in-out переменные в ретейн загоняются и все. Считать можно что угодно, бутылки, ящики, и дальше. А так же применить ко времени. Секунды, минуты, часы и т.д.
Делал как раз для наработки ещё для ПЛК 63 на CFC.
sng21099
05.11.2024, 11:34
Кто вам сказал? Вы можете переменную времени таймера или таймер целиком поместить в RETAIN, в обоих случаях таймер будет полностью RETAIN.
Время наработки можно запоминать и отдельно, а таймер запускать с 0 каждый раз, прибавляя к нему наработку. Так можно ограничение 49 дней растянуть на годы.
Можно вообще не использовать таймер, а работать с функцией TIME(); точно так же запоминая наработку.
Попробовал на ПЛК210 (110 нет под рукой), если таймер полностью пихать в retain, то после перезапуска контроллера таймер становится в выполненное состояние (ET:=PT, Q:=TRUE) O_o
ET сохранять можно, но как его перепривязывать потом к PT?
Ну это наверное некорректно, перепривязывать ET к PT. Наверное это больше для ситуации возобновления счета после перезапуска. Потом же надо штатное PT восстановить.
sng21099
05.11.2024, 12:05
Ну это наверное некорректно, перепривязывать ET к PT. Наверное это больше для ситуации возобновления счета после перезапуска. Потом же надо штатное PT восстановить.
Это понятно конечно. Имел в виду, что нужно из значения уставки времени вычитать накопленное прошедшее время и каким-то образом загонять его, как новую уставку, после перезапуска контроллера. С реальным временем это, как кажется, должно гораздо проще решиться
kondor3000
05.11.2024, 12:33
Попробовал на ПЛК210 (110 нет под рукой), если таймер полностью пихать в retain, то после перезапуска контроллера таймер становится в выполненное состояние (ET:=PT, Q:=TRUE) O_o
ET сохранять можно, но как его перепривязывать потом к PT?
Выше ответ на это
Время наработки можно запоминать и отдельно, а таймер запускать с 0 каждый раз, прибавляя к нему наработку. Так можно ограничение 49 дней растянуть на годы.
Можно вообще не использовать таймер, а работать с функцией TIME(); точно так же запоминая наработку.
sng21099
05.11.2024, 13:04
Из полученных времени и даты по отдельности собираете Дату-Время в формат UnixTime (UDINT или DWORD) , 79795 79800
тут функция https://owen.ru/forum/showthread.php?t=37203
2) fDT_to_UT (Время в секундах в формате UNIX) и из него Дату-Время в формате DT
Всего 2 строки
t_ :=fDT_to_UT(Second,Minute,hour,day,month,year); (* собираете с помощью функции время UnixTime t_:UDINT; например 1730566628 *)
DT1:=DWORD_TO_DT (t_ ); (* Из времени t_:UDINT; получаете Дату и Время в формате DT1: DT; например DT#2024-11-02-16:57:30 *)
Из DT1, так же можно выделить TOD1 : TOD; (Время TOD), конвертация DT_TO_TOD
T2: TIME; (Время TIME ), конвертация TOD_TO_TIME
D1 : DATE; (Дату), конвертация например D1:=DT_TO_DATE(DT1);
Здесь пример работы с биб-кой SysLibTime
5) Работа с библиотекой SysLibTime. Получение реального времени из ПЛК. Задание даты и времени в ПЛК
https://owen.ru/product/codesys_v2/example_program
Спасибо! Кажется это то, что нужно
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot