SA104: Спасибо, за деньги не надо!
Вид для печати
SA104: Спасибо, за деньги не надо!
Насколько я понимаю, в таблице для каждого дня первым должно быть событие ВЫКЛ, а вторым ВКЛ?
Ведь в конструкции "сегодня свет включить в 22-00, в 7-00 выключить" 7-00 относится уже не к сегодня, а к завтра?
А вопрос еще актуальный?
Хотя, посмотрел, что ТС больше не появлялся
Наверно обиделся :confused:
ЗЫ. Может еще вернется?
Бесплатно!Код: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;
Вот как вбивать это расписание? Здесь гораздо интересней задачка.
Автор темы хочет бесплатно, а вы ПЛК предлагаете вместо ПР-ки - для всего одной задачи. :)
Чего там интересного.
Покласть на ретайн чтоб не стать очередным плакальщиком на форуме.
При старте прочитать из файла и выложить в модбас-слейв.
Периодически проверять слейв на изменения, при их наличии (или специальной просьбе от клиента) - сбрасывать в файл.
Внешним модбас-клиентом менять что-угодно в слейве говоря или нет (все равно обнаружит) об этом
Или просто тупо перенести файл данных в плк и сказать ему об этом чтоб прочитал.
Ну и время ему скидывать для синхронизации
В общем - строк 20..40
А первоначальные данные - тупо программно заполнить.
to petera
А зачем считать дни ?
.. schedule : array[1..12,1..31,1..2] of tod;
Первые два индекса правильно возвратит syslibtime )), и дальше без промежуточных переменных
..
stop := schedule[CurSystemTimeDate.Month, CurSystemTimeDate.Day, ..];
..
//какие, блин, длинные имена. Может просто икс ?
Красиво,
но 31 февраля, апреля, июня...?
http://www.owen.ru/forum/attachment....5&d=1425224217уже где-то было...? Почти как 30 Термидора или Брюмера.
Вложение 23754
Валенок, Вы наш новый Шарль-Жильбер Ромм! http://www.owen.ru/forum/attachment....0&d=1441788809Цитата:
Год республиканского календаря состоял из 365 или 366 дней, поделённых на 12 месяцев продолжительностью ровно 30 дней, после которых шло подряд 5 или, соответственно, 6 дополнительных дней, которые назывались «санкюлотиды». Название «санкюлотиды» происходит от слова «санкюлоты» — революционно настроенные массы, — и дословно означает «без коротких бархатных брюк» (такую одежду носили буржуазия и дворяне, а городская беднота, разумеется, не могла себе их позволить). Каждый месяц делился на 3 декады по 10 дней. Гражданам предлагалось самим определить, сколько и какие из этих дней будут для них выходными, но для госслужащих устанавливался лишь один выходной день — последний день каждой декады.
Дни считать предлагаю потому, что
Хотелось, чтобы "помучился" поменьше и не ошибся в днях года, когда будет "вручную прописывать".Цитата:
График утвежждается на год местным руководством. В следующем году может поменяться, а может нет. На год я готов помучиться, вручную прописать.
А с Термидорам или Брюмероми классно бы вышло, только как объяснить начальству, что кроме законных, традиционных каникул в январе, тьфу... в Вандемьере, или вся таки в Нивозе?, еще будут пять санкюлотидов в конце года. Хотя работяги обрадовались бы. :rolleyes:
Вы о чём?
Одно дело перечислять расписание для каждого дня в году (это норм), а другое -- вычислять номер текущего дня в году (это не норм). [1..12, 1..31] -- выглядит вполне разумно.
А чем мешает 31 февраля?
Вы бы лучше не о Брюмерах, а о Медведеве подумали: вот снова сделает он летнее время и будет "превед медвед" два раза в год с переводом часов.
Летнее время? А что это?
http://www.owen.ru/forum/attachment....5&d=1425224217
И чего мне о Медведеве думать? Кто он мне? Никто!
Мне уж если думать, то о Кобякове Андрее Владимировиче.:rolleyes:
Это он.: