SA104: Спасибо, за деньги не надо!
SA104: Спасибо, за деньги не надо!
Насколько я понимаю, в таблице для каждого дня первым должно быть событие ВЫКЛ, а вторым ВКЛ?
Ведь в конструкции "сегодня свет включить в 22-00, в 7-00 выключить" 7-00 относится уже не к сегодня, а к завтра?
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
А вопрос еще актуальный?
Хотя, посмотрел, что ТС больше не появлялся
Наверно обиделся
ЗЫ. Может еще вернется?
Бесплатно!Код:PROGRAM PLC_PRG VAR RETAIN PERSISTENT Schedule: ARRAY [1..366, 1..2] OF TOD; (* Расписание: Время Откл, Время Вкл. в формате Time Of Date*) END_VAR VAR CONSTANT dpm: ARRAY [1..12] OF INT := 31, 28, 31,30, 31, 30, 31, 31, 30, 31, 30, 31; (*Чисол дней в месяце*) nulldt: SystemTimeDate; (*нужна для обнуления параметров*) END_VAR VAR CurTimeExInst: CurTimeEx; CurSystemTimeDate: SystemTimeDate; CurSysTime64: SysTime64; year: INT; second: INT; day: INT; hour: INT; minute: INT; month: INT; LEAP_YEAR: BOOL; (*Флаг високосного года*) Curr_DAY: INT; (*Номер дня в году*) i: INT; Now: TOD; (*Текущее время*) Stop: TOD; (*Время выключения*) Start: TOD; (*Время включения*) Light: BOOL; (*Освещение вкл.*) END_VAR CurSystemTimeDate:=nulldt; CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64); year :=CurSystemTimeDate.Year; month :=CurSystemTimeDate.Month; day :=CurSystemTimeDate.Day; hour :=CurSystemTimeDate.Hour; minute :=CurSystemTimeDate.Minute; second :=CurSystemTimeDate.Second; (*------------------------------------------------------------------------*) LEAP_YEAR := SHL(year,14) = 0; (*Проверить високосный год*) (*номер дня в году*) Curr_DAY:=day + BOOL_TO_INT(month > 2 AND LEAP_YEAR); FOR i:=1 TO 12 DO IF i < month THEN Curr_DAY:=Curr_DAY + dpm[i] ; END_IF END_FOR (*------------------------------------------------------------------------*) Now := DWORD_TO_TOD( INT_TO_DWORD(SECOND)*1000+ INT_TO_DWORD(MINUTE) * 60000 + INT_TO_DWORD(HOUR) * 3600000); (*Вкл/Выкл здесь*) Stop:=Schedule[Curr_DAY, 1]; Start:=Schedule[Curr_DAY, 2]; IF stop < start THEN Light := start <= Now OR Now < stop; ELSE Light := start <= Now AND Now < stop; END_IF;
Вот как вбивать это расписание? Здесь гораздо интересней задачка.
Последний раз редактировалось petera; 08.04.2016 в 14:20.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Автор темы хочет бесплатно, а вы ПЛК предлагаете вместо ПР-ки - для всего одной задачи.
Чего там интересного.
Покласть на ретайн чтоб не стать очередным плакальщиком на форуме.
При старте прочитать из файла и выложить в модбас-слейв.
Периодически проверять слейв на изменения, при их наличии (или специальной просьбе от клиента) - сбрасывать в файл.
Внешним модбас-клиентом менять что-угодно в слейве говоря или нет (все равно обнаружит) об этом
Или просто тупо перенести файл данных в плк и сказать ему об этом чтоб прочитал.
Ну и время ему скидывать для синхронизации
В общем - строк 20..40
А первоначальные данные - тупо программно заполнить.
to petera
А зачем считать дни ?
.. schedule : array[1..12,1..31,1..2] of tod;
Первые два индекса правильно возвратит syslibtime )), и дальше без промежуточных переменных
..
stop := schedule[CurSystemTimeDate.Month, CurSystemTimeDate.Day, ..];
..
//какие, блин, длинные имена. Может просто икс ?
Последний раз редактировалось Валенок; 08.04.2016 в 17:48.
Красиво,
но 31 февраля, апреля, июня...?
уже где-то было...? Почти как 30 Термидора или Брюмера.
49489233_revolyucionnuyy_kalendar1.jpg
Валенок, Вы наш новый Шарль-Жильбер Ромм!Год республиканского календаря состоял из 365 или 366 дней, поделённых на 12 месяцев продолжительностью ровно 30 дней, после которых шло подряд 5 или, соответственно, 6 дополнительных дней, которые назывались «санкюлотиды». Название «санкюлотиды» происходит от слова «санкюлоты» — революционно настроенные массы, — и дословно означает «без коротких бархатных брюк» (такую одежду носили буржуазия и дворяне, а городская беднота, разумеется, не могла себе их позволить). Каждый месяц делился на 3 декады по 10 дней. Гражданам предлагалось самим определить, сколько и какие из этих дней будут для них выходными, но для госслужащих устанавливался лишь один выходной день — последний день каждой декады.
Дни считать предлагаю потому, что
Хотелось, чтобы "помучился" поменьше и не ошибся в днях года, когда будет "вручную прописывать".График утвежждается на год местным руководством. В следующем году может поменяться, а может нет. На год я готов помучиться, вручную прописать.
А с Термидорам или Брюмероми классно бы вышло, только как объяснить начальству, что кроме законных, традиционных каникул в январе, тьфу... в Вандемьере, или вся таки в Нивозе?, еще будут пять санкюлотидов в конце года. Хотя работяги обрадовались бы.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Вы о чём?
Одно дело перечислять расписание для каждого дня в году (это норм), а другое -- вычислять номер текущего дня в году (это не норм). [1..12, 1..31] -- выглядит вполне разумно.
А чем мешает 31 февраля?
Вы бы лучше не о Брюмерах, а о Медведеве подумали: вот снова сделает он летнее время и будет "превед медвед" два раза в год с переводом часов.
Последний раз редактировалось petera; 09.04.2016 в 10:20.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg