15.08.2014, 18:44 | #1 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
timstamp (не unix_time)
Попробовал собрать макросы метки времени, "собирающих" дату и время в одну переменную типа long (с точностью до 1 секунды). В теории должна работать на любом Сегнетиксе, но проверял только на smh2G. Выношу на рассмотрение коллег (макросы открыты для просмотра и даже испохабливания).
1) проверка "истинности" входных данных не проводится - макрос рассчитан на прием данных из соответствующих элементов FBD. Если кому надо вводить их "с клавиатуры" - прошу позаботиться о проверке корректности заранее. 2) На сохранение года осталось 6 бит (это числа от 0 до 63), поэтому за "начальный" год выбран 1984 (он в двоичном коде выглядит как 11111оооооо, т.е. 6 последних бит при записи года в двоичном виде - будут ни чем иным, как смещением от 1984 года до рассматриваемой даты). 3) для выполнения каких-либо вычислений - упакованный формат ts1984 абсолютно непригоден! (впрочем, особые извращенцы вполне могут это сделать - создав обработчик из десятков FBD-блоков).... макросы упаковки ts1984_in и распаковки ts1984_out пригодны в следующем диапазоне дат: с 00:00:00 1.01.1984 по 23:59:59 31.12.2047 (а де-факто сохраняют с 00:00:00 0.00.1984 по 31:63:63 31.15.2047) Arsie DEN Пожалуйста, посмотрите - "оптимизируется" такой макрос вашим компилятором при записи в контроллеры, или сильно более громоздкая конструкция на регистрах сдвига и преобразованиях int->long потребует меньше ресурсов? . Последний раз редактировалось Arsie, 19.08.2014 в 11:04 Причина: добавил п.3, а заодно чуточку переформулировал отдельные пункты (смысл не менял, ничего не удалял) |
18.08.2014, 06:42 | #2 | |
Senior Member
Регистрация: Dec 2011
Сообщения: 768
Благодарил(а): 1 раз(а)
Поблагодарили:
11 раз(а) в 11 сообщениях
|
Ответ: timstamp (не unix_time)
Цитата:
|
|
18.08.2014, 11:51 | #3 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 191
Благодарил(а): 15 раз(а)
Поблагодарили:
666 раз(а) в 608 сообщениях
|
Ответ: timstamp (не unix_time)
Цитата:
Вердикт: если не Пиксель-12, то пользовать как есть. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
18.08.2014, 13:07 | #4 | |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Цитата:
НО - это не юникс-тайм (где отсчет секунд от исходной даты)!!! Это - не более чем уплотненная запись выдаваемых FBD-блоками времени и даты (например, в году 12 месяцев. Ближайшая степень двойки - это четыре бита, диапазон чисел 0...15. Она и используется). Сделано для удобства использования в "журнале" - едиснтвенный EPROM(long), занимающий 4 байта на строку (и допускающий с 1984 по 2047 годы), вместо 6 штук EPROM(int), занимающих 12 байт на строку (если использовать "тупое" сохранение даты и времени из стандартных блоков).... UPD: да, при упомянутой вами доработке - операции отношения будут работать корректно. Сорри, не подумал, когда макрос мастерил... Последний раз редактировалось ailcat, 18.08.2014 в 13:36 |
|
18.08.2014, 13:52 | #5 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Кстати, вопрос:
А может, имеет смысл добавить в SM-Logic блоки подобного назначения (сохранение "обычного" даты-времени в некий формат Long, и распаковывание из этого формата в обычные дату-время)??? Думаю, эти блоки были бы весьма востребованы! |
18.08.2014, 14:03 | #6 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 191
Благодарил(а): 15 раз(а)
Поблагодарили:
666 раз(а) в 608 сообщениях
|
Ответ: timstamp (не unix_time)
Цитата:
Но макрос отжирает только когда используется, а блок - всегда. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
18.08.2014, 17:22 | #7 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Ой ли? Там же чистые lsi/loi, lsr/lor и and/or, повторенные несколько раз...
что по ресурсам, что по быстродействию - достаточно компактные операции. Неужели преобразование каждого бита из (int) в полновесный байт (bool), операции с 32 байтами, а потом обратная их упаковка в 32 бита (long); а при распаковке - обратный процесс - занимает столько же времени и ресурсов? Кхм... В остальном (что макрос жрет только когда есть в программе, а FBD будет жрать ПЗУ всегда) - поспорить сложно... |
18.08.2014, 20:49 | #8 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
timestamp (не unix_time) - обновление
Подправленные макросы: упорядочено старшинство записи: ГГ-ММ-ДД-чч-мм-сс (в исходном часы и секунды были наоборот)...
Соответственно, сравнение двух меток даты-времени в формате ts1984(long) теперь будет происходить корректно. (на всякий случай убрал знак подчеркивания из имени макросов - чтобы не перепутать со старыми) Позже добавлю макрос вычисления разницы между двумя ts1984 - вдруг еще кому пригодится для дела... P.S. Модераторов прошу заменить макросы в первом посте на подправленные из этого . P.P.S. Кто уже скачал прежнюю версию для использования - пожалуйста, обновите! . Удалил макросы по просьбе автора. Последний раз редактировалось Gromov, 21.03.2017 в 10:30 |
19.08.2014, 11:27 | #9 | ||
Senior Member
Регистрация: Dec 2011
Сообщения: 768
Благодарил(а): 1 раз(а)
Поблагодарили:
11 раз(а) в 11 сообщениях
|
Ответ: timstamp (не unix_time)
Цитата:
Цитата:
|
||
19.08.2014, 17:02 | #10 | ||
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Цитата:
Другое дело, что, в случае использования - мой макрос потребует на порядок больше памяти (как памяти программ - минимум в 32 раза, так и оперативной - где-то в 8 раз) и, естетственно, времени. Но, что неоспоримо - макрос отбирает её только когда используется в программе, а не всегда... Цитата:
так что придется крутить третий макрос, вычисляющий разницу между двумя событиями, время которых сохранено в предлагаемом формате ts1984 |
||
27.08.2014, 22:16 | #11 | |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Цитата:
В общем, операции сравнения корректно работают, если обе даты в формате ts1984 принадлежат диапазону до 31.12.2015 года. Или обе - случились не раньше 1.01.2016 года. Причина - блок CMP рассматривает старший бит (long) как знак. Соответственно, операция сравнения работает корректно только тогда, когда знак у обоих "таймштампов" одинаковый. Если же знак разный, то дата по 2015 год будет считаться более "поздней" (ибо число с ней считатется положительным), нежели дата, случившаяся не раньше 2016 года (число с ней считается отрицательным). ВОПРОС К СООБЩЕСТВУ - как будем поступать? Есть два варианта: 1) инвертировать старший бит в значении ts1984(long) при упаковке и распаковке - тогда даты не будут путаться в любом случае ("отрицателным" станет диапазон дат до 2015 года, положительным - начиная с 2016). Но - это будет уже третья версия макросов. Т.к. математика с этим форматом "не работает" - это, пожалуй, будет лучший выход. 2) пишем макрос, в котором определяем знаки используемых для сравнения чисел (значение старшего бита), и, если они разные - через элементы MUX(long) меняем местами числа на входе блока CMP. Решение спорное, зато не меняет последнюю версию макроса... Какой вараинт выбрать??? P.S. Ребят, у меня при загрузке макроса вместо него тупо вставляется "простой" квадратик вместо блока-макроса с выводами - приходится его раскрывать и копировать блок макроса в проект через Ctrl-C/Ctrl-V... Это у меня лоджик так глючит - или проблема у всех, и стоит переписать макрос с нуля, чтоб уйти от проблемы (заодно "убрав" ошибку со сравнением двух меток таймштампов)? |
|
28.08.2014, 10:59 | #12 |
Senior Member
Регистрация: Aug 2013
Адрес: Москва
Сообщения: 600
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: timstamp (не unix_time)
По поводу сохранения, пошагово -
|
28.08.2014, 14:24 | #13 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Обижаешь, начальник! Это я и так знаю (и именно так и делал).
Просто обновил лоджик намедни, переподключил макросы - и неожиданно обнаружил, что вместо них у меня "прямоугольнички". Хотелось понять - то ли мой обновленный лоджик глючит, то ли после крайней правки макрос криво сохраняется... |
28.08.2014, 15:16 | #14 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 191
Благодарил(а): 15 раз(а)
Поблагодарили:
666 раз(а) в 608 сообщениях
|
Ответ: timstamp (не unix_time)
Цитата:
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
29.08.2014, 00:00 | #15 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Проблема в том, что я пытаюсь сохранить большую схему развернутого макроса - а сохраняется "макрос в макросе"...
По ходу, глюк лоджика... Придется перерисовать макрос заново. Заодно исправив проблему со сравнением дат... |
29.08.2014, 11:46 | #16 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 191
Благодарил(а): 15 раз(а)
Поблагодарили:
666 раз(а) в 608 сообщениях
|
Ответ: timstamp (не unix_time)
Лоджик какой версии?
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
29.08.2014, 15:59 | #17 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
|
29.08.2014, 16:40 | #18 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 191
Благодарил(а): 15 раз(а)
Поблагодарили:
666 раз(а) в 608 сообщениях
|
Ответ: timstamp (не unix_time)
Откуда именно скачали? 3.25 или 3.26?
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
29.08.2014, 18:59 | #19 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Не-а. Прикол в другом (дернуло проверить - сработало. Версия SM-Logix - 3.25.0132):
1) если во вкладке "макрос" SM-Logix макрос с таким именем уже подключен - то после правки сохраняется "макрос в макросе". 2) если во вкладке "макросы" его нет - сохраняется корректно (см. вложения). REM: "глюк" воссоздал трижды, причем 2 раза - со вновь созданными макросами. Так что по крайней мере для моей захламленной системы - это факт Arsie, просьба: "грохните", пожаплуйста, предыдущие версии макроса из сообщений.... СООБЩЕСТВУ: Во вложениях - финальная (v.3) версия макросов метки даты-времени. Наконец-то полностью корректно работает с блоком сравнения CMP(long). Математику (ADD,SUB и др.) по-прежнему не поддерживает (и не будет)! |
20.03.2017, 22:34 | #20 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: timstamp (не unix_time)
Прошу специалистов немножко помочь, т.к. Пикселя 25-го (и тем паче 12-го) на руках нет.
Во вложении - два варианта временных меток (на основе прежней разработки, но возможный диапазон дат - с 1.01.2016 по 31.12.2079). Т.к. ввод времени мне неактуален (только фиксация времени события для логов, да сравнение "таймштампов" между собой), GetRealTime и GetDate всунул внутрь макросов. "Базовый" макрос - ts2016bit.msl. Но Arsie говорил, что такой подход жадный до памяти (которой у Пикселя, особенно 12-го, не очень много). Попробовал намутить без разворачивания даты-времени из int в bool и обратной сборки уже в long - это новый макрос ts2016reg.msl. ВОПРОС: Насколько медленнее будет обрабатываться второй макрос (если вообще медленнее), и действительно ли таким подходом удастся заметно выиграть в используемой памяти? |