Какой элемент в КДС может заменить "DC32" из ОЛ?
Вид для печати
Какой элемент в КДС может заменить "DC32" из ОЛ?
Добрый день.
Нахожусь в некотором замешательстве. В основной программе вызывается блок для подсчёта максимального количества работавших за час насосов:
И эти данные, соответственно, раз в час сохраняются в файл.Код:(* фронты включения насосов *)
rtrPumpOn1(CLK:= inNA1, Q=> );
rtrPumpOn2(CLK:= inNA2, Q=> );
rtrPumpOn3(CLK:= inNA3, Q=> );
rtrPumpOn4(CLK:= inNA4, Q=> );
rtrPumpOn5(CLK:= inNA5, Q=> );
rtrPumpOn6(CLK:= inNA6, Q=> );
(* фронты выключения насосов *)
ftrPumpOn1(CLK:= inNA1, Q=> );
ftrPumpOn2(CLK:= inNA2, Q=> );
ftrPumpOn3(CLK:= inNA3, Q=> );
ftrPumpOn4(CLK:= inNA4, Q=> );
ftrPumpOn5(CLK:= inNA5, Q=> );
ftrPumpOn6(CLK:= inNA6, Q=> );
(* считаем количество работающих насосов *)
pumpsCount := pumpsCount + BOOL_TO_INT(rtrPumpOn1.Q) + BOOL_TO_INT(rtrPumpOn2.Q) + BOOL_TO_INT(rtrPumpOn3.Q) + BOOL_TO_INT(rtrPumpOn4.Q) + BOOL_TO_INT(rtrPumpOn5.Q) + BOOL_TO_INT(rtrPumpOn6.Q) -
BOOL_TO_INT(ftrPumpOn1.Q) - BOOL_TO_INT(ftrPumpOn2.Q) - BOOL_TO_INT(ftrPumpOn3.Q) - BOOL_TO_INT(ftrPumpOn4.Q) - BOOL_TO_INT(ftrPumpOn5.Q) - BOOL_TO_INT(ftrPumpOn6.Q);
(* запоминаем максимальное количество работающих насосов *)
IF maxPumpsCount < pumpsCount THEN
maxPumpsCount := pumpsCount;
END_IF;
IF rtrHour.Q THEN
dataFlow.maxPumpsOn[tmTimeNow.Hour] := INT_TO_STRING(maxPumpsCount); (* сохраняем значение в структуру *)
maxPumpsCount := 0; (* обнуляем значение *)
oldHour := tmTimeNow.Hour; (* обнуляем разницу времени *)
END_IF;
Что непонятно, так это то, что в некоторые часы я получаю нулевые значения, хотя на 100% уверен, что в эти часы не было такого, что ни один насос не работал. После этого блока уже вызывается программа записи в файл, которая пишет значения структуры "dataFlow", также раз в час по фронту "rtrHour.Q". Как то можно это объяснить?
Ну мне нужно знать сколько максимум насосов работало в этом часу, а не сколько работает в текущий момент сохранения.
После обнуления:
maxPumpsCount все равно становится равным количеству работающих насосов в этот момент, согласноКод:IF rtrHour.Q THEN
maxPumpsCount := 0; (* обнуляем значение *)
END_IF;
И всё работает как задумано, но в некоторые часы (процентов 5% случаев может, не считал точно) maxPumpsCount оказывается равным 0, хотя это не так. вот и пытаюсь понять в чем косякКод:(* запоминаем максимальное количество работающих насосов *)
IF maxPumpsCount < pumpsCount THEN
maxPumpsCount := pumpsCount;
END_IF;
Чтобы знать сколько максимум насосов работало в этом часу, а не сколько работает в текущий момент сохранения совсем не обязательно подсчитывать фронты включения и фронты выключения.
Для этого есть стандартный оператор MAX() и как было верно сказано, нужно просто посчитать количество включенных насосов
Никаких промежуточных счетчиков не нужно!!
Как в прочем и r_trigg, f_trigg
Обратите внимание, что я не обнуляю maxPumpsCount после записи в структуру, а присваиваю ей количество работающих насосов в данный момент времени.Код:maxPumpsCount := MAX (maxPumpsCount , (BOOL_TO_INT(inNA1) +BOOL_TO_INT( inNA2) + BOOL_TO_INT(inNA3) +
BOOL_TO_INT(inNA4) +BOOL_TO_INT( inNA5) +BOOL_TO_INT( inNA6) ) );
IF rtrHour.Q THEN
dataFlow.maxPumpsOn[tmTimeNow.Hour] := INT_TO_STRING(maxPumpsCount); (* сохраняем значение в структуру *)
oldHour := tmTimeNow.Hour;
(* А теперь, подсчитать количество ВКЛЮЧЕННЫХ. насосов на начало следующего часа *)
maxPumpsCount := BOOL_TO_INT(inNA1) +BOOL_TO_INT( inNA2) + BOOL_TO_INT(inNA3) +
BOOL_TO_INT(inNA4) +BOOL_TO_INT( inNA5) +BOOL_TO_INT( inNA6);
END_IF;
И для следующего часа это и будет начальным значением максимального количества включенных насосов.
Имеется ПЛК110, являющийся в системе устройством ввода вывода. Передача по modbus. Сам ПЛК является slave устройством. Необходимо выставлять регистры состояния входов, записывать значения выходов и получать из сети промежуточные переменные. Все бы ничего, но мастер при опросе ищет устройство, регистры которого начинаются с адреса 0ХА400. В конфигураторе ПЛК для слэйва задание адреса не подразумевается, они поочередно идут, начиная с нулевого. Каким образом можно обозвать переменную и присвоить ей конкретный адрес регистра? И еще: можно ли знать, что переменная прочитана (пришел запрос на чтение данного регистра соответсвующей функцией)? Хотел через modbus.lib но он работает только с мастером.
Да, действительно,что то я забыл про МАХ(). Думаю ваш вариант будет правильнее работать. Спасибо.
Здравствуйте, нужна помощь. Некорректно работает тайм аут мастера: Панель СПК110 (мастер), подключение по modbus через 485; 2 слейва из 3 отключены; Тайм аут мастера стоит 200 мс; Время между фреймами 20 мс; Реальное время, которое уходит на эти 2 отключенных слейва 20 с! Как исправить? Спасибо за помощь
Добрый день! ПЛК пока не приобретен. Ориентируясь на ПЛК73, дописываю программу управления системой отопления и горячей водой под 2 существующих источника тепла (твердотопливный и электро) + в перспективе третий (газ) на CFC. Много чего удалось победить: управление одной кнопкой двумя-тремя разными *родственными* режимами, управление одной кнопкой взаимоисключающими режимами, управление задвижкой двустороннего действия. Много времени ушло на проработку *защиты от дурака*, когда например начинают нажимать лихорадочно на все подряд кнопки, нажимают и удерживают, и так далее. Но споткнулся о задачу реализации режима работы электронагревом в ночное время суток - с 23час5мин до 5час55мин. Интуитивно понимаю, что решение крутится вокруг таймера RTC. Но у него какой -то странный (обрезанный) функционал. Не понятно, зачем этот таймер вообще есть в стандарт.либ. Вопрос у меня разветвленный. Как сделать автоматическое считывание времени из ЦП персонального компьютера (для режима эмуляции) или ПЛК, и записи на вход блока PDT? Второй вариант вопроса. Как написать суточный (не недельный) таймер вручную с нуля? И в догонку еще вопрос. Извините, я еще только учусь, но есть ли в ПЛК функция автостарта программы на случай отключения электричества?