пора закрывать.
я ему заготовку 30.03 сбросил.
спасибо не сказал.
а вы все рекомендации пишете...:(
Вид для печати
пора закрывать.
я ему заготовку 30.03 сбросил.
спасибо не сказал.
а вы все рекомендации пишете...:(
Всем откликнувшимся-огромное спасибо, отдельно-lara197a !
Извиняюсь за молчание-не было возможности.
Тема еще актуальна, просто жду ПЛК, чтобы проверить. В симуляторе ведь не работает.
Что-то никто не предложил набивать таблицу прямо в КДС, в визуализации.
https://www.youtube.com/watch?v=ochqaMC5pdw
Для упрощения ввода данных пришлось расписание в таблице с Time Of Day заменить на пользовательский тип данных
Код:TYPE Schedule :
STRUCT
HourOff: INT;
MinuteOff: INT;
HourOn: INT;
MinuteOn: INT;
END_STRUCT
END_TYPE
Код:PROGRAM PLC_PRG
VAR RETAIN PERSISTENT
Table:ARRAY [1..366] OF Schedule; (* Расписание: *)
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; (*Освещение вкл.*)
selX:INT :=1; (*Используется в визуализации (в таблице)*)
selY:INT :=1; (*Используется в визуализации (в таблице)*)
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:= DWORD_TO_TOD(INT_TO_DWORD(Table[Curr_DAY].HourOff) * 3600000 + INT_TO_DWORD(Table[Curr_DAY].MinuteOff) * 60000);
Start:=DWORD_TO_TOD(INT_TO_DWORD(Table[Curr_DAY].HourOn) * 3600000 + INT_TO_DWORD(Table[Curr_DAY].MinuteOn) * 60000);
IF stop < start THEN
Light := start <= Now OR Now < stop;
ELSE
Light := start <= Now AND Now < stop;
END_IF;
То, что надо, petera! Спасибо!
petera! Все отлично работает, но возникла другая проблема. Мне необходимо вводить не два, а четыре значения времени на каждый день. В этом случае уже не хватает памяти в ПЛК, чтобы объявить переменные как RETAIN PERSISTENT. Что-либо можно придумать?
Тогда хранить таблицу расписания в файле.
Редактирование файла в визуализации можно сделать по аналогии с тем, как я делал для рецептов (доп кнопки Сохранить и Отменить) http://www.owen.ru/forum/showthread....l=1#post186999
https://www.youtube.com/watch?v=q9sjdc6UYY0
Если сами не справитесь, то буду помогать.
ОК! petera всегда помогает! Буду пробовать, спасибо!
А как сделать, чтобы в таблице было переменное число строк? Сейчас оно равно количеству дней, то есть 365, а нужно чтобы на СПК была такая же таблица, но были кнопки Добавить/Удалить запись. Пользователь сам сможет добавлять/удалять нужную запись с временем включения/выключения
нужно прописывать всю таблицу и через "видимость" открывать-закрывать строки.
(с СПК не работал, как конкретно там не знаю)
кстати у меня пример тоже был с визуализацией.
час, минуты, секунды
и того 6 значений на событие.
т.е. если даже использовать по событию в день, то нужно отрисовать почти 2000 ячеек, присвоить переменные
и свойства заполнить....