Ваш вопрос слишком широк, на мой взгляд. Вы пытались решить это самостоятельно? Какую среду PL C вы используете?
Возможно, для начала есть кое-что?
- Когда кнопка нажата, сохраните текущую метку времени в переменной и сбросьте сброс request
- Каждый цикл PL C: Рассчитать разницу с сохраненной переменной и текущей отметкой времени. Сохраните разницу в переменной и покажите в HMI.
- , если разница> 90 дней, установите запрос на сброс и go для шага 1
Редактировать: Здесь это рабочая программа для Infoteam OpenPCS. Я никогда не использовал это прежде, но должен был проверить это на любопытство. Мне удалось получить текущую дату и время, но я не смог преобразовать в DWORD
для расчета, поэтому я использовал такой подход (Сергей, вы знаете, как это сделать? Я пытался преобразовать его, используя POINTER
, но не смог не разыменовывайте его ..) Я не проверял его на более длительные задержки, поэтому, пожалуйста, обратите внимание, что он может не работать на 100%.
Он рассчитывает 60-секундные интервалы (= минуты) и когда прошло достаточно минут Таймер останавливается. Обратите внимание, что минуты должны быть сохранены в постоянной памяти, если потери питания et c. не должно влиять на это.
VAR
RunTimer : BOOL;
MinutesElapsed : UDINT;
StartTime : TIME;
TimeDifference : TIME;
END_VAR
IF RunTimer THEN
IF StartTime = t#0s THEN
StartTime := GetTime(StartTime);
END_IF;
TimeDifference := GetTime(StartTime);
(*IF one minute has elapsed*)
IF TimeDifference >= t#1m THEN
MinutesElapsed := MinutesElapsed + 1;
(*Reset StartTime to start minute over*)
StartTime := t#0s;
END_IF;
(*IF enough minutes has passed, stop (90*24*60 = 90 days)*)
IF MinutesElapsed >= (90 * 24 * 60) THEN
RunTimer := false;
StartTime := t#0s;
TimeDifference := t#0s;
MinutesElapsed := 0;
END_IF;
else
(*Time is not running*)
StartTime := t#0s;
TimeDifference := t#0s;
MinutesElapsed := 0;
(*Here we would set RunTimer to TRUE when button is pressed to start time again*)
END_IF;