PDA

Просмотр полной версии : к петрову и. (про время и даты ...)



Валенок
04.12.2010, 23:34
открытый вопрос к уважаемому игорю петрову

про время, даты ....

ввиду развернутости вопроса, приложил его отдельным файлом.

заранее спасибо.

BETEP
05.12.2010, 11:06
:confused: Прошу прощения что вмешался.

TIME, TIME_OF_DAY (сокр. TOD) содержит время суток, начиная с 0 часов (с точностью до миллисекунд). Диапазон значений TOD от: 00:00:00 до 23:59:59.999
и в то-же время в разделе справки Идентификаторы переменных, границы для TOD не указаны.
т.е. здесь не бред кодесиса, а того кто хелп писал.
а ещё в хелпе есть такая строчка

TIME1 := T#100S12ms; (*Старший компонент может выходить за свой предел*)


В той же справке есть описание того что такое сложение переменных "+"

ADD
Сложение переменных типов: BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, REAL и LREAL.
Две переменных типа TIME можно складывать (напр. t#45s + t#50s = t#1m35s). Результат имеет тип TIME.
DATE в этом списке нет!!!

т.е. сторочку
DATE1 := D#2010-12-10 + T#1d;
кодесис естественно выполнит так как и должен это сделать, преобразует константы в DWORD, выполнит сложение и то что получилось отобразит как дату, т.е полную фигню

Я ноль в кодесисе, но кое что знаю о других языках, например кое где есть функция dateadd.
На детские грабли наступаем? и требуем от компилятора телепатических способностей?

drvlas
05.12.2010, 15:39
можно и я 5 коп?

уважаемый коллега пишет

в разделе справки идентификаторы переменных, границы для Tod не указаны.
т.е. здесь не бред кодесиса, а того кто хелп писал.
...
в той же справке есть описание того что такое сложение переменных "+"
Date в этом списке нет!!!
...
на детские грабли наступаем? и требуем от компилятора телепатических способностей?

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

товарищ валенок и пишет, что он ожидает от столь классной системы. я вполне присоединяюсь (насколько я смог понять). наличие описания неудобностей в хелпе не мешает нам хотеть лучшего.

или?

З.Ы. Блин, да что же это делается с большими буковками??? ЩАС Ветер найдет, что в описании форума есть таки обоснование, что буковки могут (в зависимости от погоды в Зажопинске) преобразовываться в строчные... Тогда и просить админов разобраться с багом не будет оснований :)

BETEP
05.12.2010, 17:05
Все непонятки от того что начали писать программы на верхних языках пропустив понимание самих основ программирования.

Пытаюсь объяснить:
TOD#24:00:01 результат неожидан только если забыть что для машины это 32 бита. а на хелп ссылаюсь для того что-бы обратить внимание на противоречие в нём.

Про сложения и вычитания дат и времени.
DATE1 := DATE2-DATE3; для компилятора ошибка
DATE1 := D#2010-12-10 + T#1d; не ошибка, но кажется странным? а странного ничего нет. запись константы как D#2010-12-10 придумана для удобства человека, реально это опять 32 бита которые без калькулятора человеку не переварить. Для нашего с вами удобства компилятор разберёт текстовую строку на составляющие, выполнит расчёт и запишет в проге 4D016D80. тоже самое сделает и со вторым операндом т.е. запишет как 5265C00.
фактически получается что человек просит машину сложить два числа результат сложения которых 5227C980, это он и запишет в память. Но человеку хочется отобразить это число как дату, ну и пускай посмотрит на D#2013-09-05.

Получается интересная ситуация, кодесис и все остальные для нашего удобства пытаются отобразить для человека информацию в привычном для него виде, как дату, время или десятичное число, а его за это пинают.

А вот мне когда то приходилось записывать в память REAL так, как оно выглядит в шестнадцатиричном виде, контроллер работал с форматом REAL, но компилятор не поддерживал записи константы как asd:=13.5; но позволял записать в ячейку памяти где хранится REAL всё что угодно, ну за сколько секунд вы разложите 13.5 на биты, а потом эти биты пересчитаете в DWORD? конечно можно было без проблем записать число REAL сразу в память контроллера, а не извращаться в программе, только вот прога на флешь пишется, а ретайн на батарейке была. Ну не хотелось мне что-бы контроллер чудить начал через несколько лет когда батарейку забудут заменить.
Или вам в голову не придёт так "странно и неправильно" поступить? Надеюсь теперь понятно, что чьи-то непонятки по поводу DATE1 := D#2010-12-10 + T#1d; у меня вызывают смех?

drvlas
05.12.2010, 17:27
ну, смейтесь, это же нормально :)

а зачем нам-то не позволять предлагать то, что кажется лучшим? неужели ваши проблемы с не очень удобным компилятором дают мне какое-то основание не хотеть простого: прибавить к дате 1 день и получить точно следующую дату?

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

BETEP
05.12.2010, 17:54
Про dateadd слышали?

В писме нет просьбы о добавления в кодесис этой функции, а только баловство с константами и форматами, ну и ошибочные рассуждения из-за непонимания что такое константы и форматы.

Кстати прикольно, в описании к ADD и SUB нет упоминания о работе с DATE, но Вы с Валенком упорно считаете что ADD ОБЯЗАНО выполнять операции с датой, а хелпы и мануалы пишут для ..........

Учится, учится и чё там дедушка ещё говорил?

з.ы. а редактор в кодесисе ужасный, так не хватает мелких фичей как например в VBA, я не защищаю кодесис, редактор для LD наверно там самый худший, переменные списком а не таблицей, поиск не фонтан. Я просто пытаюсь объяснить что Валенок заблуждается споткнувшись на элементарном. Кодесис очень неплохо работает с датой, и его создатели наверно посчитали что dateadd излишне, так как отсутствие этой функции легко обходится. Прикол кстати в том, что одной dateadd не отделаться, пользователю ведь для своего удобства обязательно захочется полный набор стандартных функций (как в некоторых языках) для работы с датой.

BETEP
06.12.2010, 09:08
а вот я умею признавать свои ошибки... прочитайте внимательно мой первый пост.
Он был для Вас. На всякий случай подредактировал и выделил ключевую фразу красненьким.
Остальные посты это ответы для drvlas и разжёвывание что такое константы.

Николаев Андрей
06.12.2010, 10:37
господа, давайте чуть больше позитива...
опять же скоро новый год и рождество...
на сколько я знаю на этой неделе игорь ответить не сможет, так что давайте дождемся его комментариев

BETEP
06.12.2010, 11:01
в училище рассказали. Бауманском.
Андрей, ну разве это не позитив?

BETEP
06.12.2010, 11:37
Ну уже лучше, Вы задумались.
про TOD#24:00:01 похоже вы уже согласились что это косяк хелпа а не кодесиса.

теперь о DATE1 := D#2010-12-10 + T#1d;
Предполагаю что вы то-же согласились что это не должно работать по той простой причине что тип данных DATE не предназначен для работы с функцией ADD. Поэтому возникает вопрос почему компилятор не матерится на DATE1 := DATE2+TIME1; с одной стороны это плохо, т.к. нарушено правило о типах данных и как компилятор в таком случае должен поступить? Привести к одному типу? к DWORD? или всё таки сматерится?
Вот тут уже можно начать спор о том как реагировать компилятору на запрос программиста, послать его, или руководствуясь другими правилами выполнить? И этот спор будет бесполезным, сколько людей столько и мнений, я например за то что-бы компилятор ко мне относился с уважением, и разрешал фокусы в надежде что я понимаю что делаю.

Обратите внимание, DATE1 := DATE2-DATE3; для компилятора ошибка, тип в данных совпадает и их не нужно приводить к одному типу. DATE1 := DATE2+TIME1; тип данных разный, их нужно привести к DWORD а для DWORD ADD работает. т.е. я не вижу непоняток. Компилятор ведь не телепат, он не может угадать что Вы думаете так, а я по другому.

Начинаю подозревать что dateadd сделали специально для того, чтобы избежать подобных недоразумений со стороны программистов.

BETEP
06.12.2010, 12:33
ух, последни раз.

не согласился. что тут такого необычного с точки зрения логики ? почему дату нельзя двигать туды-сюды на время ? нельзя двигать дату функцией Add или Sub. они для этого не предназначены.
ведь в примере с Real/int - кдс все нормально понимает.

з.ы. а я принципиально выполняю операции только с одним типом данных, привычка блин.

Кирилл Валюнин
06.12.2010, 15:24
уважаемые, форумчане. не скатывайтесь во флуд, все-таки тема не в курилке

drvlas
06.12.2010, 16:08
Остальные посты это ответы для drvlas и разжёвывание что такое константы.
Ах вот оно что! Я-то и не понял, что мне разжевывают!
И вот это, оказывается, про меня:


Все непонятки от того что начали писать программы на верхних языках пропустив понимание самих основ программирования.

Так хочу заметить, я не прошу рассказывать мне основы программирования. И ничего нового Вы не сказали. Вы просто зачем-то пытаетесь помешать даже порассуждать об улучшении КДС. Почему?
Потому что Вам и так удобно? Рад, искренне рад за Вас!
Или Вы считаете, что улучшать поведение компилятора не нужно просто потому что не нужно?

А как по мне, то следует минимально:

- либо сообщать о недопустимости операции
- либо выполнять ее правильно.

А сейчас не ругается и выполняется неправильно. Не так, как ожидает инженер.

А прибавление 1 дня к текущей дате (при поддержке представления и даты, и временного отрезка в днях, месяцах, годах) - вполне нормальная операция. Равно как и вычисление "возраста" вычитанием двух дат.
И все это не сложно сделать через пользовательскую функцию. Но было бы красиво и через стандартную библиотеку. А еще круче - грамотно перегружаемыми функциями ADD, SUB.

Назовите причину, почему так не следует делать. Не пояснение, почему "так вышло", а причину, почему будет плохо, если все же сделать.

BETEP
06.12.2010, 16:48
Пожалуй стоит просить модератора оставить только первые два поста, а остальное удалить. Тема действительно переросла во флуд.
drvlas вы считаете что компилятор должен поступить по другому, я считаю что он поступает правильно и предсказуемо. Так что ему всё таки делать? Он наверно должен угадать кто из нас сидит за компом? Наверно Вы правы, нужно улучшать кдс, ему явно не хватает телепатических способностей.

Всё, больше на эту тему молчу, попытался объяснить заблуждения в письме, попытался ещё раз, потом ещё. И что из этого вышло? причём тон я сменил только после Вашего первого сообщения.

drvlas
06.12.2010, 17:10
пожалуй стоит просить модератора оставить только первые два поста, а остальное удалить.
как-то так и выходит, что слишком много модераторов. теперь и вы, уважаемый, решили, что первые два поста хороши. а почему же не первый один пост?

извините, если где-то мой тон был неприятен.
я тоже оставлю эту ветку специалистам.

BETEP
07.12.2010, 19:52
PROGRAM PLC_PRG
VAR
date1: DATE;
date2: DATE;
dt1:DWORD;
dt2: DWORD;
T_dd : TIME := T#1m26s400ms;
T_hh : TIME := T#3s600ms;
day : DWORD := 86400;
hour : DWORD := 3600;
END_VAR
--------------
date1 := D#2010-12-7 - T_dd*365 ;
date2 := D#2010-12-7 - T_hh*24 ;
dt1 :=DateSub(D#2010-12-11,D#2010-11-11,day);
dt2 :=DateSub(D#2010-12-11,D#2010-12-10,hour);
-----------------------------------------------------------------
FUNCTION DateSub : DWORD
VAR_INPUT
First: DATE;
Last: DATE;
interval : DWORD;
END_VAR
----------------
IF First>Last THEN
DateSub := (DATE_TO_DWORD( First) - DATE_TO_DWORD( Last))/interval ;
ELSE
DateSub := (DATE_TO_DWORD( Last) - DATE_TO_DWORD( First))/interval ;
END_IF;
---------------------------------------------------------------


И если я понимаю - как забивают гвозди, не нужны откровения про существование молотка с синей ручкой (типа 'dateadd'). Можно и кирпичом, если чё.

BETEP
07.12.2010, 23:08
:)
Пока не смогли....
date2 := D#2010-12-7 - T_hh*24 ; короче и быстрее этой строчки на форуме пока не было.(+over 9000 мне (это больше чем+1е38)) :)

DateSub у меня быстрее, и скорее всего короче в бинарнике, хоть и банально.( да какая разница)

Ерунда это всё, кодесису действительно не хватает полноценной библиотеки для работы с датой, (это как раз о том) и TIME_SEC не решит проблем. Кроме тех операций, которые Вы описали в письме, для работы с датой нужно гораздо больше, но на уровне библиотеки. Библиотеки с мануалом как её употребить.

И всё же компилятор у кодесиса очень не плох, вполне предсказуем и почти второй хелп в его сообщениях, а вот редактор жуть. Ну на самом деле, не увидел я в Ваших примерах ничего непонятного в поведении компилятора. А если есть желание улучшать кодесис V2, то похоже уже поздно.

Профессиональные форумы нужны не для споров и лузлов (простите модераторы), у них другое назначение, отбросить эмоции, выслушать собеседника и приобрести новый опыт, и даже начать сомневаться в том, в чём был уверен на 100.
С Наступающим Вас !!!

drvlas
08.12.2010, 19:52
кодесису действительно не хватает полноценной библиотеки для работы с датой, (это как раз о том) и Time_sec не решит проблем. кроме тех операций, которые вы описали в письме, для работы с датой нужно гораздо больше, но на уровне библиотеки. библиотеки с мануалом как её употребить.

ну вот и чудненько. а теперь представьте себе, что модератор оставил только первые два поста. как вы думаете, что произведет на людей, влияющих на развитие кдс, большее впечатление - вот тот ваш второй пост, показывающий, что все хорошо, прекрасная маркиза, или трехстраничная дискуссия?

ваше понимание задач форума несколько узковато - на мой взгляд. я считаю, что мы можем изменять не только себя, но и мир вокруг нас. даже через форум. и не надо мне доказывать обратного. я же не говорю, что я прав. я объявляю свою позицию.

спасибо за решение задачи. когда понадобится, обязательно воспользуюсь :)

МИХАИЛ
09.12.2010, 16:36
извиняюсь, что влезаю, но по моему у и.в. петрова есть статья "программируем временные сложности", где все разжевано до нельзя. если нужна - плиз - мыло - вышлю . вес всего 400кб. И еще ссылочка http://www.prolog-plc.ru/art10

BETEP
10.12.2010, 10:14
http://www.codesys.ru/docs/TimeExperience.pdf
похоже автор не подозревает про TOD#24:00:01
но с датами и временем предлагает работать через самописные функции, (а что такое библиотека?) и автор против добавления в кодесис дополнительных типов на время и дату, температуру и прочее. Так какой смысл этих трёх страниц?

Игорь Петров
24.12.2010, 14:01
Я похоже тут назначен крайним за косяки МЭК стандарта. Давайте будем реалистами. Вы требуете слишком много от простых инструментов. Ну не написано инструкции к пиле, сколько кубов земли ей можно вырыть. Такой вот ужасный косяк авторов пилы :)

Тема поднята непростая, за раз не осилим, давайте постепенно.

1. Тип TIME – это не время, а длительность. Название в МЭК выбрали неудачно, но так уж сложилось исторически :( Бывает. Cо страной ‘Гондурас’ тоже промашка вышла :)

С TIME можно делать вычисления и сравнения. Внутри это обычный целый тип DWORD со всеми вытекающими. Операции вычислений и сравнений, которые умеет делать сам микропроцессор с целыми без знака, тут подходят. В ассемблер компилируется без вопросов. Остается только сделать преобразование в человеческое представление в компиляторе, отладчике и визуализации.

Человеческое представление – это дни, часы, минуты и пр. В хелпе есть замечание (*Старший компонент может выходить за свой предел*). Это вполне логично. Например, можем думать в минутах и писать 10 минут, 10.5 (десять с половиной) минут или 1000 минут. Вполне удобно. Можем работать в часах, но тогда уж минут должно быть не больше 59. Можем ввести секунды, но тогда не используем доли минут. Логично. Иначе человек сломает голову при разборе.

К хелпу есть базовое требование чтобы букв было минимум при максимуме пользы. Стоит ли по TIME писать в нем подробнее, чем есть сейчас?

2. Займемся TOD - время дня. Название хорошее. В хелпе написано: ‘Диапазон значений TOD от: 00:00:00 до 23:59:59.999.’ Попробуем ввести TOD1 := TOD#26:00:00; Компилятор дает ошибку. Правильный компилятор. Проверка делается на ПК и не напрягает проц. ПЛК. Пусть она будет.

Тип TOD обычно нужен чтобы получить время из некоего места, например аппаратных часов, и выполнить нужную операцию в нужное время. Например, так:

IF TOD1 > TOD#17:00 THEN bLight := FALSE END_IF

Можно применять сравнения. Можно выполнять преобразования. Можно вычитать и получать длительность. Можно добавлять длительность. Дополняет TOD тип DATA. Можем сделать структуру с датой и точным, до мс, временем. Нормально.

Остается вопрос о контроле переполнения TOD. Стоит ли в каждую вычислительную операцию вводить обрезание по суткам? Хорошо, будет защита от дурака. Но, это дополнительный процессорный код на каждую операцию, он однозначно даст тормоза всех вычислений. Я бы не стал даже только поэтому. Кроме того, после добавления к времени дня интервалов может получиться новый день. Может быть нужда его поймать и перенести в дату. С обрезанием получим большой облом. Итого, просится не водить контроль, а считать что программист умный и понимает что делает. ИМХО CoDeSys хорош быстрым кодом и расширениями МЭК, рассчитанными на умных пользователей. Значит все гармонично.

В ключе этих мыслей TIME_TO_TOD( T#1d1s ) должно дать TOD#24:00:01. Оно и дает.

Пока не вижу никакого криминала с TOD в CoDeSys. Можем поменять в хелпе фразу c ‘Диапазон значений TOD от: 00:00:00 до 23:59:59.999.’ на: ‘Диапазон значений констант TOD от: 00:00:00 до 23:59:59.999.’ Будет точнее. Меняем?

Игорь Петров
24.12.2010, 14:23
...кодесису действительно не хватает полноценной библиотеки для работы с датой...
Да, и много других не хватает! В статье не было даже попытки сделать биб-ку. Задача была разжевать базовые типы на примерах. Накрутить вокруг даты можно кучу полезных функций – планировщики и др. и пр. Давайте сделаем такую биб-ку, но.. только в следующем году. Коллеги настойчиво предлагают попробовать интересный подарочный напиток ‘Овновка’, пора :p С наступающим!

Игорь Петров
27.12.2010, 16:34
А про : ( A + B - A ) <> ( A - A + B ) таки и не пояснили.
Согласен, что вычисления с датой могут вызывать законное удивление.

Увы, нельзя переделывать CoDeSys под здравый смысл, который мы имеем сейчас. Он обязан подчинятся стандарту МЭК 61131-3 и здравому смыслу, который тогда был. Представляете, какой он был? Была куча очень разных ПЛК с собственными языками. В некоторых, очень продвинутых, были аппаратные часы. В них год, месяц и пр. представлены отдельными регистрами. Так удобно для вывода на цифровые индикаторы. Для глобализации ПЛК желательно бы ввести единообразное ‘человеческое’ представление. Ну, вот и ввели тип data и повелели его представлять как 'year'-'month'-'day '. Внутренне представление стандартом не регламентируется никак! Это может быть целое (как в CoDeSys) или структура. Кому как удобнее. Никаких вычислительных операций с таким типом быть не должно. Единственное, не знаю почему, возможно кто-то особо настаивал, прописали вычитание двух дат с результатом TIME. Но, с особым примечанием: deprecated (не рекомендуется).

Разница двух дат не вызывает вопросов. Со сложением сложнее. Вчера + полдня = вечером уже сегодня, а утром еще вчера. Часа в дате нет и ‘нормальный’ ответ может быть разный у разных людей. Без ‘Овновки’ не разобраться :)

>>Эти приколы с DATE - нормальны?
Соответствуют требованим стандарта МЭК.

Игорь Петров
27.12.2010, 18:04
...если есть желание улучшать кодесис V2, то похоже уже поздно.
Хм. Все ‘опытно-революционные’ идеи вносятся только в V3. Это логично. В V2 продолжается шлифовка. За этот год прошла куча доработок. Документацию правим регулярно. В декабре провели тотальный контроль интерфейса, одних сообщений на русском добавлено под 2 сотни. В следующий патч все будет включено.

Что касается изменений среды программирования и компилятора, то это тоже возможно. Конечно, нужно понимать, что это всегда серьезная работа, а ресурсы не безграничны и нужно верно расставлять приоритеты. Предложение должно быть проработано и должно быть доказано, что это оно нужно не только одному человеку. 24-25 Мая 2011 состоится конференция в Смоленске. Пожалуйста, подготовьте презентацию с предложениями. В расписании под это время мы выкроим. Интерес к этой теме будет точно и обсуждение будет точно. Реально принять решение о необходимости планирования и проведения такой работы может только Дитер Хесс. Он руководитель проекта CoDeSys. За математику отвечает Хилмар Панцер. Они оба любезно согласились приехать на конференцию, чтобы рассказать своих работах и нас послушать. Так что, шлагбаум открыт.

capzap
15.11.2011, 14:48
:) Не выдержал до юбилея темы, решил спросить
команда STRING_TO_TIME('T#9h30m'); не превращает строчку в тот же интервал, в онлайне переменная TIME выглядит как T#570m...
Вопрос, как выудить из этой переменной часы не прибегая к конвертированию в DWORD?

swerder
15.11.2011, 15:34
div 60
p.s. у меня временная никогда не принимает тип старшего числа больше минуты
+ при задании дней в строковой преобразование игнорирует эти дни

Игорь Петров
17.11.2011, 14:48
Вопрос, как выудить из этой переменной часы не прибегая к конвертированию в DWORD?
V2.3 :(
V3.4 показывает T#9h30m

capzap
17.11.2011, 14:52
Может Вы как нибудь Дитеру или Хилмару намекнете, чтоб шлифанули 2.3 :)