Хоть бы в свойствах входов-выходов комментарии заполнили.
Вид для печати
Хоть бы в свойствах входов-выходов комментарии заполнили.
Начал разбираться с макросом для подготовки описания, возникли некоторые вопросы. Задам их здесь, чтобы потенциальные пользователи тоже могли найти ответы:
-макрос на который есть ссылка в первом сообщении не имеет блоков, как у Вас на картинке, это такой-же макрос только компактно представленный или там были изменения, мои вопросы будут относится именно к макросу внутренних макросов
-вход время работы в часах, внутри идет умножение на 1800000, что значит это число, время работы можно задавать кратно 30 минутам? Я так понял этим временем мы задаем время через которое включается другой насос и так по кругу пока есть вход вкл/выкл?
-в летнем режиме все остается так-же только снимается единица и при смене насоса он работает 10 сек и все, затем отсчитывается время переключается на другой насос и опять работает 10 сек?
В начале макрос, который упаковывает стандартные дата_время в UNIX формат ( в кодесис это формат DATA_AND_TIME).
Вложение 26324
На выходе собственно упакованное DT и на двух дополнительных выходах - младший и старший WORD этого самого DT.
Выход DT можно использовать в самом ПР, например расчитывать интервалы для событий реального времени, например для вкл/выкл по расписанию. Ведь DT можно складывать, вычитать и сравнивать между собой, т.к. любое DT это всего лишь число секунд с 0 часов 1 января 1970г.
К выходам Lo_wDT и Hi_wDT нужно подключать две сетевые переменные с последовательными адресами, тогда панель или скада или ПЛК смогут прочитать DT как переменную DWORD.
Вложение 26323
ВНИМАНИЕ.
Т.к. в ПР не поддерживается работа со знаковыми целыми числами, макрос будет корректно работать только с даты "эры Unix" - с 0 часов 1 января 1970г. Зато не будет проблемы 2038г, когда 19 января 2038 многие системы сойдут сума и время у них потечет вспять. У нас, в макросе, эра Unix закончится 5 февраля 2106г.:rolleyes:
Теперь макросы, которые позволяют использовать в программах это самое Unix-время.
Вложение 26325
Вложение 26315
ЗЫ.
Пришлось пост разбить на части. Больше 8 картинок прикрепить нельзя:confused:
1. ExtrD_T. Извлекает из DT дату и время суток, как отдельные части, что позволят использовать их по отдельности.
Вложение 26326
Этот макрос используется в
DT_to_UTC
2. Собственно из TIME можно получит только Час, Мин и Сек времени суток. Чем и будет заниматься макрос ExtrTime
Вложение 26327
Этот макрос используется в
DT_to_UTC
3. DayOfYear. Определяет по Дате номер дня в году.
Вложение 26328
Этот макрос используется в
ExtrMonth
ExtrDay
DT_to_UTC
4. LeapYear. Макрос для определение високосного года
Вложение 26329
Этот макрос используется в
ExtrMonth
ExtrDay
DT_to_UTC
5. ExtrYear. Извлекает Год из упакованной Даты.
Вложение 26330
Этот макрос используется в
DT_to_UTC
6. ExtrMonth. Извлекает из упакованной Даты номер месяца.
Вложение 26331
Этот макрос используется в
ExtrDay
7. D_of_W. Возвращает день недели. Пн - 1, .. Вс - 7 из упакованной даты.
Вложение 26332
Этот макрос используется в
DT_to_UTC
8. ExtrDay. Извлекает номер дня месяца из упакованной Даты. А также определяет признак четного дня месяца, может кто захочет расписание врачей сделать.:)
Вложение 26333
petera, вот гду вы раньше были??!:confused:
Выкладываю аналогичные макросы (не зря же делал) упаковки/распаковки времени в формате Unix.
Основные макросы:
1. DT_TO_DW - упаковка времени в формат Unix с разбивкой на два регистра (для отправки по сети).
2. DW_TO_DT - распаковка времени из формата Unix. Если на вход dwDT блока подается значение, то расчёт идет по нему, иначе расчёт идет по входам highDT и lowDT (используется в случае прихода данных по сети).
Вложение 26337
Пример использования макросов, приведенных в предыдущем посте.
Вложение 26334 Вложение 26335
А теперь макрос DT_to_UTC обратного преобразования из времени Unix в стандартное время.
Вложение 26336
Чтобы не плодить вложенные макросы, DayOfYear и LeapYear вынес из других наружу.
Пример с этим макросом
Вложение 26338
Вложение 26339
Вложение 26340
Значение DT может поступать и через сетевые переменные, в примере этого делать не стал, как "склеить" из двух сетевых переменных одну 32 битную, надеюсь понятно.
Так не проще разбить, чисто механически, переменную пополам, если 16 старших бит сами отсекаются:
Вложение 26343