Тема / Topic: Как узнать свой текущий часовой пояс?
stepagrus
Forum Haunter / Завсегдатай форума
Участник № / Member № 3589
отправлено / posted
Здравия!
вопрос в топике, задача следующая:
при формировании отчета я программно откатываю время периода генерации отчета на 23:00:00
для того чтобы задать нужное количество часов нужно знать часовой пояс. у меня он GMT +6 зимой и GMT+7 летом (но об этом я вспомнил только после перевода времени))
где: T_FROM_IN - изначальное время T_FROM_CHANEL_OUT - откорректированное время TimeZone - часовой пояс, у меня он был равен 6. но после 27 марта результат расчета по форумле стал неверным.
отправлено / posted
Все операции с временем в Trace Mode 6 автоматически учитывают локальные и сезонные сдвиги. Работать с временем надо в локальном формате. Выбирайте в языке FBD блок "Управление по астрономическому времени (ALARM)", задавайте нужное Вам время и формируйте команду на генерацию документа.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
stepagrus
Forum Haunter / Завсегдатай форума
Участник № / Member № 3589
stepagrus
Forum Haunter / Завсегдатай форума
Участник № / Member № 3589
отправлено / posted
окзалось неправдой.
читаем справку: ------------------------------- Управление по астрономическому времени (ALARM)
Данный блок формирует на выходе 1 при совпадении текущего астрономического времени с временем, заданным входами блока. Единица на выходе удерживается в течение одной секунды, затем выход обнуляется.
Вход MON задает номер месяца, DAY – день месяца, DOF – день недели (1 - 7, первый день недели - воскресенье), H – часы, M – минуты и S – секунды. Если хотя бы один из этих параметров не соответствует текущему астрономическому времени, Q0 = 0. При формировании выходного сигнала не учитываются входы со значением -1. ------------------------------------
так что сформировать нужно нам время при помощи этого FBD блока ни как не получится :-(
Так как же все таки мне решить эту проблему? как можно задать в TM нужное мне время: год, месяц, день, час, минута, секунда и получить на выходе дату в формате UDINT
похоже я задачу криво объяснил ... мдя... я лишнего наворотил
я пытался брать дату/время в формате UDINT и работать непосредственно с ней.
stepagrus
Forum Haunter / Завсегдатай форума
Участник № / Member № 3589
отправлено / posted
вопрос возник. 1. а в этот атрибут (12, Час) записывать то можно? 2. с каналом Time происходят странности: если его в программе привязать за атрибут (0,R) и (12, Час), а за атрибут (2, In) не привязывать, то в канале имется значение -1 а дату он показывает 0.1.1900
Сообщения / Posts 136 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Записывать значения в атрибуты канала TIME можно. Начальное значение с датой 1900 г. - вполне закономерно связано с тем, что этот канала ни разу не отработал свой стандартный алгоритм. Если Вы при этом заставляете его отрабатывать только атрибуты часов и дней, не редактируя год, алгоритм обратным пересчетом пытается войти в шкалу с 01.01.1970 и выдает на входе отрицательное число.
Может быть, стоит в рабочем порядке по телефону или e-mail уточнить постановку задачи и обсудить способы ее рационального решения?
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
stepagrus
Forum Haunter / Завсегдатай форума
Участник № / Member № 3589
отправлено / posted
спасибо. я уже решил проблему. решение на самом деле очевидное и простое:
code:
VAR_INPUT T_FROM_IN : UDINT; END_VAR // Вход. Начальная дата VAR_OUTPUT T_FROM_HOUR : INT; END_VAR //Час. Начальная дата VAR_OUTPUT T_FROM_CHANEL_OUT : UDINT; END_VAR // Привязать к каналу с начальной датой в аргумент (3, IN) VAR t : REAL; END_VAR
//Чтобы выставить X часов в нашей дате t = X - T_From_Hour; T_FROM_CHANEL_OUT = T_FROM_IN - (T_FROM_IN mod 3600) + t*3600;
отправлено / posted
Если я правильно понял задачу, Вы хотите изменить час в известной Вам дате. В Вашей программе есть синтаксические ошибки: - переменная VAR_OUTPUT T_FROM_HOUR должна быть VAR_INPUT T_FROM_HOUR, - "Привязать к каналу с начальной датой в аргумент (3, IN)" - здесь номер атрибута д.б. 2. Кроме того, алгоритмически непонятно, как Вы будете задавать X меньший, чем T_From_Hour? Мне кажется, что здесь будет ошибка.
Но самое главное, что эта программа не нужна. Если в канала TIME задана корректная "начальная дата", то простым заданием в атрибуте 12 нужного часа Вы автоматически получите нужную дату-время.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
stepagrus
Forum Haunter / Завсегдатай форума
Участник № / Member № 3589
отправлено / posted
>Вы хотите изменить час в известной Вам дате.
да
>переменная VAR_OUTPUT T_FROM_HOUR должна быть VAR_INPUT T_FROM_HOUR,
согласен. только сейчас заметил, но проект почему то нормально работает, несмотря на то, что аргумент T_FROM_HOUR типа OUTPUT
> "Привязать к каналу с начальной датой в аргумент (3, IN)" - здесь номер атрибута д.б. 2.
да, просто я забыл, что нумерация с 0
>Кроме того, алгоритмически непонятно, как Вы будете задавать X меньший, чем T_From_Hour? Мне кажется, что здесь будет ошибка.
здесь всё нормально работает
>Если в канала TIME задана корректная "начальная >дата", то простым заданием в атрибуте 12 нужного >часа Вы автоматически получите нужную дату-время.
я попытался сделать так, как вы сказали и вот что получилось (верхняя дата на скриншоте (при этом я просто привязался к атрбуту (12, час) и ничего в этот атрибут не записывал пока):
В самом канале -1 (Повторяю! я еще ни чего не записывал в канал) по умолчанию он выставляется другой прогаммой на 1.1.2010)
попробовал ввести дату 1.4.2010 00:00. дата ввелась нормально. нажал кнопку. программа отработала нормально 1.4.2010 12:00.
тут всё вроде бы нормально, если бы не эти страшные значения в начале .
До этого в программе канал Time Был привязан за атрибуе R и за атрибут Час. Так вот не удавалось даже перейти на экран с ГЭ, который отображет этот канал - Windows выдавала ошибку и RTM закрывался.
Сообщения / Posts 136 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
2 поста назад я написал Вам, что внутренние адгоритмы канала TIME без хотя бы одной штатной отработки не функцируют. И в Вашей программе наличие НЕ КОРРЕКТНОЙ "Начальной даты" приведет к не корректному результату.
Достаточно поставить каналу TIME флажок "Отработать на старте" и затем ему можно просто задавать нужную "Начальную дату" и произвольно менять атрибут 12 (Час). Никаких коллизий и фатальных ситуаций не будет.
По поводу "отрицательности t" я выразился неточно. Я имел в виду возможные проблемы с моменты сезонного сдвига времени. При работе через атрибут 12 (Час) эти переходы учтены.