Таймер обратного отсчета в PL C - структурированный текст - PullRequest
0 голосов
/ 02 марта 2020

Будучи новичком в программировании на PL C, я борюсь с программированием таймера обратного отсчета на PL C. Я хочу добавить таймер обратного отсчета на 90 дней, который будет сброшен до 90 дней после нажатия кнопки на ЧМИ. Время обратного отсчета должно отображаться на дисплее HMI. IO не подключен, только таймер обратного отсчета.

1 Ответ

1 голос
/ 02 марта 2020

Ваш вопрос слишком широк, на мой взгляд. Вы пытались решить это самостоятельно? Какую среду PL C вы используете?

Возможно, для начала есть кое-что?

  1. Когда кнопка нажата, сохраните текущую метку времени в переменной и сбросьте сброс request
  2. Каждый цикл PL C: Рассчитать разницу с сохраненной переменной и текущей отметкой времени. Сохраните разницу в переменной и покажите в HMI.
  3. , если разница> 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;
...