Segnetics

Вернуться   Segnetics > Форум Segnetics

Форум Segnetics Территория общения

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.08.2014, 18:44   #1
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: 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, а заодно чуточку переформулировал отдельные пункты (смысл не менял, ничего не удалял)
ailcat вне форума   Ответить с цитированием
Старый 18.08.2014, 06:42   #2
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата 3) для выполнения каких-либо вычислений - упакованный формат ts1984 абсолютно непригоден!
Не все так мрачно. Если расположить данные в порядке возрастания SS-MM-HH-*** и определить "начальный" год как 000000******, то операции отношения должны работать корректно.
tvf вне форума   Ответить с цитированием
Старый 18.08.2014, 11:51   #3
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 017
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от ailcat Посмотреть сообщение
Arsie
DEN
Пожалуйста, посмотрите - "оптимизируется" такой макрос вашим компилятором при записи в контроллеры,
или сильно более громоздкая конструкция на регистрах сдвига и преобразованиях int->long потребует меньше ресурсов?
.
Макросы используют много ОЗУ/ПЗУ и мало тика. На сдвигах будет экономичнее по памяти, но тормознее по тику.

Вердикт: если не Пиксель-12, то пользовать как есть.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 18.08.2014, 13:07   #4
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата
Сообщение от tvf Посмотреть сообщение
Не все так мрачно. Если расположить данные в порядке возрастания SS-MM-HH-*** и определить "начальный" год как 000000******, то операции отношения должны работать корректно.
Про "расположить по порядку" - сегодня же вечером подправлю выложенные макросы, это не проблема!
НО - это не юникс-тайм (где отсчет секунд от исходной даты)!!!
Это - не более чем уплотненная запись выдаваемых FBD-блоками времени и даты (например, в году 12 месяцев. Ближайшая степень двойки - это четыре бита, диапазон чисел 0...15. Она и используется).
Сделано для удобства использования в "журнале" - едиснтвенный EPROM(long), занимающий 4 байта на строку (и допускающий с 1984 по 2047 годы),
вместо 6 штук EPROM(int), занимающих 12 байт на строку (если использовать "тупое" сохранение даты и времени из стандартных блоков)....

UPD: да, при упомянутой вами доработке - операции отношения будут работать корректно. Сорри, не подумал, когда макрос мастерил...

Последний раз редактировалось ailcat, 18.08.2014 в 13:36
ailcat вне форума   Ответить с цитированием
Старый 18.08.2014, 13:52   #5
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от Arsie Посмотреть сообщение
Вердикт: если не Пиксель-12, то пользовать как есть.
Кстати, вопрос:
А может, имеет смысл добавить в SM-Logic блоки подобного назначения (сохранение "обычного" даты-времени в некий формат Long, и распаковывание из этого формата в обычные дату-время)???
Думаю, эти блоки были бы весьма востребованы!
ailcat вне форума   Ответить с цитированием
Старый 18.08.2014, 14:03   #6
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 017
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от ailcat Посмотреть сообщение
Кстати, вопрос:
А может, имеет смысл добавить в SM-Logic блоки подобного назначения (сохранение "обычного" даты-времени в некий формат Long, и распаковывание из этого формата в обычные дату-время)???
Думаю, эти блоки были бы весьма востребованы!
Бессмысленно. Потребление будет аналогично макросам.

Но макрос отжирает только когда используется, а блок - всегда.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 18.08.2014, 17:22   #7
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от Arsie Посмотреть сообщение
Потребление будет аналогично макросам
Ой ли? Там же чистые lsi/loi, lsr/lor и and/or, повторенные несколько раз...
что по ресурсам, что по быстродействию - достаточно компактные операции.
Неужели преобразование каждого бита из (int) в полновесный байт (bool), операции с 32 байтами, а потом обратная их упаковка в 32 бита (long); а при распаковке - обратный процесс - занимает столько же времени и ресурсов? Кхм...

В остальном (что макрос жрет только когда есть в программе, а FBD будет жрать ПЗУ всегда) - поспорить сложно...
ailcat вне форума   Ответить с цитированием
Старый 18.08.2014, 20:49   #8
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию timestamp (не unix_time) - обновление

Подправленные макросы: упорядочено старшинство записи: ГГ-ММ-ДД-чч-мм-сс (в исходном часы и секунды были наоборот)...
Соответственно, сравнение двух меток даты-времени в формате ts1984(long) теперь будет происходить корректно.
(на всякий случай убрал знак подчеркивания из имени макросов - чтобы не перепутать со старыми)
Позже добавлю макрос вычисления разницы между двумя ts1984 - вдруг еще кому пригодится для дела...


P.S. Модераторов прошу заменить макросы в первом посте на подправленные из этого .

P.P.S. Кто уже скачал прежнюю версию для использования - пожалуйста, обновите!

.

Удалил макросы по просьбе автора.

Последний раз редактировалось Gromov, 21.03.2017 в 10:30
ailcat вне форума   Ответить с цитированием
Старый 19.08.2014, 11:27   #9
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата Ой ли? Там же чистые lsi/loi, lsr/lor и and/or, повторенные несколько раз...
что по ресурсам, что по быстродействию - достаточно компактные операции.
Боюсь что здесь Arsie прав. Если не ошибаюсь, то сам лоджик сделан по принципу транслятора, где в программе после компиляции каждый блок из библиотеки представлен номером блока и адресами входных и выходных переменных. Сама обработка библиотечного блока прописана в ядре контроллера. Включение блока в библиотеку однозначно увеличивает размер ядра. И ядро и сама программа используют одну и ту же память. Так что увеличение размера ядра уменьшает допустимый размер программы. Далее идут проблемы совместимости со старыми версиями лоджика и более младшими версиями контроллеров.
Цитата НО - это не юникс-тайм (где отсчет секунд от исходной даты)!!!
Да и бог с ним. Главное, что более поздему событию должно соответствовать большее значение переменной. Тогда операции сравнения будут работать корректно. Для применения в устройствах типа расписание или график вполне достаточно. Про корректность выполнения арифметических операция я вроде не говорил.
tvf вне форума   Ответить с цитированием
Старый 19.08.2014, 17:02   #10
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата
Сообщение от tvf Посмотреть сообщение
Боюсь что здесь Arsie прав. Если не ошибаюсь, то сам лоджик сделан по принципу транслятора <...> Включение блока в библиотеку однозначно увеличивает размер ядра. И ядро и сама программа используют одну и ту же память <...>
Arsie однозначно прав в том, что включение этих функций как блоков FBD однозначно займет энергонезависимую память контроллера (это порядка 120-140 байт памяти программ на FBD упаковки и чуть меньше на FBD распаковки, не считая "обвязку" интерпретатора, не зависящую от вида FBD). Вполне естественно, что они будут "откушены" от памяти программ (сократив её на несколько FBD), что может быть весьма актуально для "малых" контроллеров типа Pixel
Другое дело, что, в случае использования - мой макрос потребует на порядок больше памяти (как памяти программ - минимум в 32 раза, так и оперативной - где-то в 8 раз) и, естетственно, времени. Но, что неоспоримо - макрос отбирает её только когда используется в программе, а не всегда...


Цитата
Сообщение от tvf Посмотреть сообщение
Да и бог с ним. Главное, что более поздему событию должно соответствовать большее значение переменной. Тогда операции сравнения будут работать корректно. Для применения в устройствах типа расписание или график вполне достаточно. Про корректность выполнения арифметических операция я вроде не говорил.
Для меня еще актуален UpTime (наработка, т.е. время между включением и сбоем/отключением) -
так что придется крутить третий макрос, вычисляющий разницу между двумя событиями, время которых сохранено в предлагаемом формате ts1984
ailcat вне форума   Ответить с цитированием
Старый 27.08.2014, 22:16   #11
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата
Сообщение от tvf Посмотреть сообщение
Главное, что более поздему событию должно соответствовать большее значение переменной. Тогда операции сравнения будут работать корректно. Для применения в устройствах типа расписание или график вполне достаточно.
Опаньки! Обломинго!!!
В общем, операции сравнения корректно работают, если обе даты в формате 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...
Это у меня лоджик так глючит - или проблема у всех, и стоит переписать макрос с нуля, чтоб уйти от проблемы (заодно "убрав" ошибку со сравнением двух меток таймштампов)?
ailcat вне форума   Ответить с цитированием
Старый 28.08.2014, 10:59   #12
serg-el
Senior Member
 
Регистрация: Aug 2013
Адрес: Москва
Сообщения: 600
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

По поводу сохранения, пошагово -
Миниатюры
Нажмите на картинку для увеличения

Название:  1.jpg
Просмотров: 59
Размер:  108.8 Кбайт   Нажмите на картинку для увеличения

Название:  2.jpg
Просмотров: 79
Размер:  195.0 Кбайт   Нажмите на картинку для увеличения

Название:  3.jpg
Просмотров: 61
Размер:  217.0 Кбайт   Нажмите на картинку для увеличения

Название:  4.jpg
Просмотров: 54
Размер:  16.2 Кбайт  
serg-el вне форума   Ответить с цитированием
Старый 28.08.2014, 14:24   #13
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата
Сообщение от serg-el Посмотреть сообщение
По поводу сохранения, пошагово
Обижаешь, начальник! Это я и так знаю (и именно так и делал).

Просто обновил лоджик намедни, переподключил макросы - и неожиданно обнаружил, что вместо них у меня "прямоугольнички". Хотелось понять - то ли мой обновленный лоджик глючит, то ли после крайней правки макрос криво сохраняется...
ailcat вне форума   Ответить с цитированием
Старый 28.08.2014, 15:16   #14
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 017
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от ailcat Посмотреть сообщение
Обижаешь, начальник! Это я и так знаю (и именно так и делал).

Просто обновил лоджик намедни, переподключил макросы - и неожиданно обнаружил, что вместо них у меня "прямоугольнички". Хотелось понять - то ли мой обновленный лоджик глючит, то ли после крайней правки макрос криво сохраняется...
Вы сохраняете "макрос в макросе", поэтому и прямоугольнички.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 29.08.2014, 00:00   #15
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от Arsie Посмотреть сообщение
Вы сохраняете "макрос в макросе", поэтому и прямоугольнички.
Проблема в том, что я пытаюсь сохранить большую схему развернутого макроса - а сохраняется "макрос в макросе"...
По ходу, глюк лоджика... Придется перерисовать макрос заново. Заодно исправив проблему со сравнением дат...
ailcat вне форума   Ответить с цитированием
Старый 29.08.2014, 11:46   #16
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 017
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от ailcat Посмотреть сообщение
Проблема в том, что я пытаюсь сохранить большую схему развернутого макроса - а сохраняется "макрос в макросе"...
По ходу, глюк лоджика... Придется перерисовать макрос заново. Заодно исправив проблему со сравнением дат...
Лоджик какой версии?


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 29.08.2014, 15:59   #17
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от Arsie Посмотреть сообщение
Лоджик какой версии?
Скачал с вашего сайта после 15, но не позже 18 августа. Посмотреть до понедельника врядли смогу (посмотрю - напишу точную версию)...
ailcat вне форума   Ответить с цитированием
Старый 29.08.2014, 16:40   #18
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 017
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: timstamp (не unix_time)

Цитата:
Сообщение от ailcat Посмотреть сообщение
Скачал с вашего сайта после 15, но не позже 18 августа. Посмотреть до понедельника врядли смогу (посмотрю - напишу точную версию)...
Откуда именно скачали? 3.25 или 3.26?


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 29.08.2014, 18:59   #19
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
Exclamation Ответ: timstamp (не unix_time)

Цитата:
Сообщение от Arsie Посмотреть сообщение
Вы сохраняете "макрос в макросе", поэтому и прямоугольнички.
Не-а. Прикол в другом (дернуло проверить - сработало. Версия SM-Logix - 3.25.0132):
1) если во вкладке "макрос" SM-Logix макрос с таким именем уже подключен - то после правки сохраняется "макрос в макросе".
2) если во вкладке "макросы" его нет - сохраняется корректно (см. вложения).
REM: "глюк" воссоздал трижды, причем 2 раза - со вновь созданными макросами. Так что по крайней мере для моей захламленной системы - это факт

Arsie, просьба: "грохните", пожаплуйста, предыдущие версии макроса из сообщений....


СООБЩЕСТВУ:
Во вложениях - финальная (v.3) версия макросов метки даты-времени.
Наконец-то полностью корректно работает с блоком сравнения CMP(long).
Математику (ADD,SUB и др.) по-прежнему не поддерживает (и не будет)!
Вложения
Тип файла: msl ts1984in.msl (12.5 Кбайт, 96 просмотров)
Тип файла: msl ts1984out.msl (12.1 Кбайт, 93 просмотров)
ailcat вне форума   Ответить с цитированием
Старый 20.03.2017, 22:34   #20
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: 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.
ВОПРОС:
Насколько медленнее будет обрабатываться второй макрос (если вообще медленнее), и действительно ли таким подходом удастся заметно выиграть в используемой памяти?
Вложения
Тип файла: msl ts2016bit.msl (12.4 Кбайт, 13 просмотров)
Тип файла: msl ts2016reg.msl (7.6 Кбайт, 24 просмотров)
ailcat вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать свои сообщения

BB code is Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 14:48.


Версия vBulletin: 3.8.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Segnetics 2005 - 2023