Какой элемент в КДС может заменить "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;
И для следующего часа это и будет начальным значением максимального количества включенных насосов.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
https://www.youtube.com/@%D0%9F%D0%B...BA%D0%BE%D0%B2
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Имеется ПЛК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? Второй вариант вопроса. Как написать суточный (не недельный) таймер вручную с нуля? И в догонку еще вопрос. Извините, я еще только учусь, но есть ли в ПЛК функция автостарта программы на случай отключения электричества?