Показано с 1 по 6 из 6

Тема: Расчёт продолжительности включения в ПЛК

  1. #1

    По умолчанию Расчёт продолжительности включения в ПЛК

    Добрый день. Поставлена задача - подсчёт продолжительности включения (ПВ) механизма по его состоянию (Включено/Выключено). ПВ необходимо считать за последние 30 минут (в любой точке времени, т.е при наступлении 31-й минуты необходимо удалять запись 1-й минуты и т.д.), а также за каждые 0,5 смены (смена 8 часов). Подскажите правильный путь: пользоваться счётчиками для получения секунд или использовать имеющиеся в стандартной библиотеке таймеры.
    Последний раз редактировалось Дмирой; 29.03.2016 в 11:14.
    Дмитрий

  2. #2
    Пользователь
    Регистрация
    10.04.2010
    Адрес
    Алтайский край,г.Рубцовск
    Сообщений
    964

    По умолчанию

    пример лежит наработки

  3. #3
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Скользящая сумма на полчаса с дискретностью в 1 минуту? Значит кольцевой буфер на 30 ячеек, в очередную ячейку на границе минуты скидывать наработку. Про пол-смены не понял: «каждые N» противоречит «в любой точке времени».

  4. #4

    По умолчанию

    Нужно подсчитывать отдельно ПВ за последние 30 минут и отдельно ПВ за 4 часа (0,5 смены). Подскажите, где пример в наработках.
    Дмитрий

  5. #5
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    В переменной uptime_30m будет наработка за последние 30 минут.
    Код:
    VAR
        on: BOOL;
        first_run: BOOL := TRUE;
        uptime_30m_buf: ARRAY [0..29] OF TIME;
        uptime_30m: TIME;
        prev_scan: TIME;
        minute, prev_minute: UDINT;
    END_VAR
    
    IF first_run THEN
        prev_scan := TIME();
        first_run := FALSE;
    END_IF
    
    
    minute := (TIME_TO_UDINT(TIME()) / 60000) MOD 30;
    IF prev_minute <> minute THEN
        uptime_30m_buf[minute] := 0;
    END_IF
    prev_minute := minute;
    uptime_30m_buf[minute] := uptime_30m_buf[minute] + SEL(on, T#0s, TIME() - prev_scan);
    
    
    uptime_30m := T#0s;
    FOR minute := 0 TO 29 DO
        uptime_30m := uptime_30m + uptime_30m_buf[minute];
    END_FOR
    
    
    prev_scan := TIME();
    За 4 часа аналогично.

    Но значение будет правильным только в момент перехода на очередную минуту. Другими словами, uptime_30m хоть и вычисляется постоянно, но правильное значение принимает один раз в минуту. Если не устраивает, то буфер надо брать больше и ячейки переключать чаще.

    Пользуясь случаем, напоминаю, что с часами ПЛК надо аккуратнее: http://www.owen.ru/forum/showthread.php?t=23319
    Последний раз редактировалось Yegor; 29.03.2016 в 14:01.

  6. #6

    По умолчанию

    Спасибо Yegor! Буду разбираться (работаю в LD, FBD и немного в SFC).
    Дмитрий

Похожие темы

  1. Чередование включения
    от Ivan_P в разделе ПЛК1хх
    Ответов: 32
    Последнее сообщение: 03.11.2023, 15:39
  2. Расчёт ЗАРПЛАТЫ
    от Вентсервис в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 20.04.2015, 13:32
  3. Расчёт CRC16-CCITT
    от Андрей007 в разделе ПЛК1хх
    Ответов: 11
    Последнее сообщение: 07.11.2014, 11:16
  4. СИ8 - частые включения
    от ОКА в разделе Эксплуатация
    Ответов: 5
    Последнее сообщение: 11.09.2012, 18:01
  5. время включения плк150
    от Радик в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 23.03.2007, 14:47

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •