PDA

Просмотр полной версии : Проблема с написанием программы



wkdx00
26.05.2025, 19:11
Здравствуйте. ПР200, датчик температуры и ПЧ. Частоту двигателя задаю по modbus, пуск/авария на дискретные входа. Необходимо по команде запускать ПЧ на 10Гц на 60 сек, после включать трехпозиционное регулирование (опрос датчика температуры раз в 30 сек). На ФБ не смог реализовать логику, на ST не могу грамотно реализовать задержки в цикле. Может кто-то подобное уже делал?

CleanS
26.05.2025, 19:33
А в чём проблема с ФБ?
Там есть блок SEL. Как мне кажется с его помощью достаточно не сложно реализовать. Как вариант.
Да, и для оценки уже выполненной работы и поиска затыка, проект бы посмотреть ...

wkdx00
26.05.2025, 22:39
Не пойму как мне поможет SEL. Застопорился, пока выглядит так.

kondor3000
26.05.2025, 22:55
Здравствуйте. ПР200, датчик температуры и ПЧ. Частоту двигателя задаю по modbus, пуск/авария на дискретные входа. Необходимо по команде запускать ПЧ на 10Гц на 60 сек, после включать трехпозиционное регулирование (опрос датчика температуры раз в 30 сек). На ФБ не смог реализовать логику, на ST не могу грамотно реализовать задержки в цикле. Может кто-то подобное уже делал?

Разбейте задачу на части, переключить частоту после отработки времени, можно через SEL.
Время можно отсчитать таймером и на ST. После включить 3-х поз. регулирование. Отдельный блок есть вроде в Менеджере в макросах.
Задержки также реализовать можно таймером на время, линией задержки или триггером на 1 цикл.

EFrol
27.05.2025, 07:54
Не пойму как мне поможет SEL. Застопорился, пока выглядит так.


var
hz : udint := 10;
tStart, tRegul : SYS.TON;
end_var

IF inputWork = TRUE THEN //Если прошла команда Пуск, если нет - ждем
outHZ := hz; //Задача начальной частоты
//Тут должна стоять задержка inputTimeStart
tStart(I:=true, T := udint_to_time(inputTimeStart)); // Держим таймер включеным
If tStart.Q THEN // Есть задержка, иначе - ждем
IF inputRealT > 0 THEN //Проверка температуры, если замерзли - стоим, грустим, даем аварию
//Тут должна стоять задержка опроса inputTimeRegulation
tRegul(I := true, T := udint_to_time(inputTimeRegulation)); // Держим включеным
IF tRegul.Q THEN // Есть задержка, иначе - ждем
tRegul(I := false); // Выключаем таймер
IF inputRealT > (inputAimT + inputDeadBand) THEN
hz := hz + 1;
ELSIF inputRealT < (inputAimT - inputDeadBand) THEN
hz := hz - 1;
ELSE //Мы молодццы, держим частоту
END_IF
END_IF
ELSE outAlarm := TRUE;
hz :=0; tRegul(I := false);
END_IF
END_IF
ELSE outHZ := 0;
tStart(I := false); tRegul(I := false); // Пуск не активен - стоп все таймеры
END_IF

WKD
27.05.2025, 09:27
...
IF inputRealT > (inputAimT + inputDeadBand) AND hz<50 THEN
hz := hz + 1;
ELSIF inputRealT < (inputAimT - inputDeadBand) AND hz>0 THEN
hz := hz - 1;
...

Огромное спасибо за помощь с таймерами в OL, сам я их еще не переварил. Пробовал на FB с SEL реализовать - еще раз убедился, что ST выигрывает. Добавил ограничения по диапазону частоты ПЧ, буду смотреть работу на железе. В эмуляторе задержки как будь-то спешат...