This is topic Как узнать свой текущий часовой пояс? in forum Редактор проекта TRACE MODE 6 / at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/32/t/000338.html

Posted by stepan (Участник № / Member № 3589) on :
 
Здравия!

вопрос в топике, задача следующая:

при формировании отчета я программно откатываю время периода генерации отчета на 23:00:00

для того чтобы задать нужное количество часов нужно знать часовой пояс. у меня он GMT +6 зимой и GMT+7 летом (но об этом я вспомнил только после перевода времени))

время откатываю по такой формуле:

T_FROM_CHANEL_OUT = T_FROM_IN - (T_FROM_IN + TimeZone*3600) mod 86400 + 23*3600;

где: T_FROM_IN - изначальное время
T_FROM_CHANEL_OUT - откорректированное время
TimeZone - часовой пояс, у меня он был равен 6. но после 27 марта результат расчета по форумле стал неверным.

вопрос: как мне узнать часовой пояс для выбранной даты, чтобы правильно рассчитывать смещения? [Насмешка / Razz]
 
Posted by Romсheg (Участник № / Member № 3792) on :
 
Похоже, что только если написать свою DLL.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Все операции с временем в Trace Mode 6 автоматически учитывают локальные и сезонные сдвиги.
Работать с временем надо в локальном формате.
Выбирайте в языке FBD блок "Управление по астрономическому времени (ALARM)", задавайте нужное Вам время и формируйте команду на генерацию документа.
 
Posted by stepan (Участник № / Member № 3589) on :
 
спасибо! завтра попробую
 
Posted by stepan (Участник № / Member № 3589) on :
 
окзалось неправдой.

читаем справку:
-------------------------------
Управление по астрономическому времени (ALARM)


Данный блок формирует на выходе 1 при совпадении текущего астрономического времени с временем, заданным входами блока. Единица на выходе удерживается в течение одной секунды, затем выход обнуляется.

Вход MON задает номер месяца, DAY – день месяца, DOF – день недели (1 - 7, первый день недели - воскресенье), H – часы, M – минуты и S – секунды. Если хотя бы один из этих параметров не соответствует текущему астрономическому времени, Q0 = 0. При формировании выходного сигнала не учитываются входы со значением -1.
------------------------------------

так что сформировать нужно нам время при помощи этого FBD блока ни как не получится :-(

Так как же все таки мне решить эту проблему? как можно задать в TM нужное мне время: год, месяц, день, час, минута, секунда и получить на выходе дату в формате UDINT

похоже я задачу криво объяснил
...
мдя... я лишнего наворотил

я пытался брать дату/время в формате UDINT и работать непосредственно с ней.

гораздо проще использовать атрибут [12, Час] канала #TIME )))
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Действительно, надо точно объяснить задачу.
 
Posted by stepan (Участник № / Member № 3589) on :
 
вопрос возник.
1. а в этот атрибут (12, Час) записывать то можно?
2. с каналом Time происходят странности: если его в программе привязать за атрибут (0,R) и (12, Час), а за атрибут (2, In) не привязывать, то в канале имется значение -1 а дату он показывает 0.1.1900
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Записывать значения в атрибуты канала TIME можно.
Начальное значение с датой 1900 г. - вполне закономерно связано с тем, что этот канала ни разу не отработал свой стандартный алгоритм.
Если Вы при этом заставляете его отрабатывать только атрибуты часов и дней, не редактируя год, алгоритм обратным пересчетом пытается войти в шкалу с 01.01.1970 и выдает на входе отрицательное число.

Может быть, стоит в рабочем порядке по телефону или e-mail уточнить постановку задачи и обсудить способы ее рационального решения?
 
Posted by stepan (Участник № / Member № 3589) on :
 
спасибо. я уже решил проблему.
решение на самом деле очевидное и простое:
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 by AdAstra Technical Support (Участник № / Member № 4) on :
 
Если я правильно понял задачу, Вы хотите изменить час в известной Вам дате.
В Вашей программе есть синтаксические ошибки:
- переменная VAR_OUTPUT T_FROM_HOUR должна быть VAR_INPUT T_FROM_HOUR,
- "Привязать к каналу с начальной датой в аргумент (3, IN)" - здесь номер атрибута д.б. 2.
Кроме того, алгоритмически непонятно, как Вы будете задавать X меньший, чем T_From_Hour? Мне кажется, что здесь будет ошибка.

Но самое главное, что эта программа не нужна.
Если в канала TIME задана корректная "начальная дата", то простым заданием в атрибуте 12 нужного часа Вы автоматически получите нужную дату-время.
 
Posted by stepan (Участник № / Member № 3589) on :
 
>Вы хотите изменить час в известной Вам дате.

да

>переменная VAR_OUTPUT T_FROM_HOUR должна быть VAR_INPUT T_FROM_HOUR,

согласен. только сейчас заметил, но проект почему то нормально работает, несмотря на то, что аргумент T_FROM_HOUR типа OUTPUT [Недоумение / Confused]

> "Привязать к каналу с начальной датой в аргумент (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 закрывался.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
2 поста назад я написал Вам, что внутренние адгоритмы канала TIME без хотя бы одной штатной отработки не функцируют.
И в Вашей программе наличие НЕ КОРРЕКТНОЙ "Начальной даты" приведет к не корректному результату.

Достаточно поставить каналу TIME флажок "Отработать на старте" и затем ему можно просто задавать нужную "Начальную дату" и произвольно менять атрибут 12 (Час). Никаких коллизий и фатальных ситуаций не будет.

По поводу "отрицательности t" я выразился неточно. Я имел в виду возможные проблемы с моменты сезонного сдвига времени. При работе через атрибут 12 (Час) эти переходы учтены.

Однако, если Вас устраивает найденный Вами вариант, работайте с ним.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2