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

Тема: СПК110 + МВ110 32ДН Грамотный опрос каналов счетчика

  1. #1

    По умолчанию СПК110 + МВ110 32ДН Грамотный опрос каналов счетчика

    Добрый день, уважаемые коллеги!
    В проекте используется связка СПК110 с модулями Мх110. Встала задача контроля и учета расхода сырья с использованием импульсного расходомера (Kracht VC). Для подсчета импульсов используем каналы счетчика модуля МВ110-24.32ДН.

    Задача и решение тривиальное - опрашиваем каналы счетчика, раз в секунду сохраняем значения, обнуляем каналы.
    Вроде бы ничего криминального в такой логике нет и все работает.

    Вот выдержка исходного кода:
    Код:
    flush_cnt_on_timeout := FALSE;
    
    IF cnt_timeout.Q THEN
    	r1 := 1.48*WORD_TO_REAL(cnt_03_ch_16_19_read[1]);
    	r2 := 0.45*WORD_TO_REAL(cnt_03_ch_16_19_read[3]);
    	cnt_03_ch_16_19_write[1] := 0;	
    	cnt_03_ch_16_19_write[3] := 0;
    	flush_cnt_on_timeout := TRUE;		
    END_IF
    
    cnt_timeout(IN:=((auto_mode AND out_open_horizont AND out_open_vertical) OR ((manual_mal_circ OR manual_bol_circ) AND out_enable_invrtors)) AND NOT flush_cnt_on_timeout,PT:=T#1S);
    где flush_cnt_on_timeout - булева переменная, по триггеру R_EDGE которой происходит обнуление каналов счетчика, cnt_timeout.Q - выход TON'a cnt_timeout, отрабатывающий с частотой раз в секунду, r1 и r2 - значения с каналов счетчика, уже преобразованные и умноженные на необходимый коэффициент.

    Сам модуль в списке устройств выглядит следующим образом:
    ss.PNG

    Проблема в том, что стабильно раз в 3 секунды считанное значение "прыгает", являясь, по сути, суммой текущего и предыдущего, например ... 65,3 ; 60 ; 125,3 ... В отладчике та же картина, раз в 3 секунды значение счетчика не обнуляется. Но почему так выходит?

    Как я понимаю, у модуля, после переполнения счетчика (значение 65535) автоматическое обнуление канала не происходит, поэтому непрерывный подсчет импульсов произвести не удастся. Сейчас думаю обнуление производить не ежесекундно, а по значению счетчика (скажем, по условию >50 000).
    Такой подход корректен?

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

    По умолчанию

    не надо не чего обнулять... просто в программе вычитаешь из нового значения то которое было при прошлом считывании (если новое больше), если новое меньше то значит мы прошли уже через 65535 и число импульсов будет новое значение + 65535-старое значение. Как то так. Но все равно ошибка будет из-за неточности временных интервалов и времени опроса модуля. (небольшая)
    Dmitriy Murashov
    SPS Software Engineer Automation Engineering RUS

  3. #3

    По умолчанию

    Цитата Сообщение от murdemon Посмотреть сообщение
    если новое меньше то значит мы прошли уже через 65535
    Так я так и хотел изначально. А это точно, что счетчик через ноль проходит?

    При переполнении счетчика его значение обнуляется, и счет продолжается.
    Все, простите за невнимательность, в документации все черным по белому написано.
    Спасибо!
    Последний раз редактировалось Sepsis; 27.10.2015 в 12:09.

  4. #4

    По умолчанию

    Дорвался я на прошлых выходных до контроллера, поправил код с учетом прохождения счетчика через ноль. В итоге он выглядит так:
    Код:
    IF cnt_timeout.Q THEN
        r1_current := cnt_03_ch_16_19_read[1];
        r2_current := cnt_03_ch_16_19_read[3];
        
        IF r1_current < r1_old THEN
            r1 := r1_kef*WORD_TO_REAL(65535-r1_old+r1_current+1);
        ELSE
            r1 := r1_kef*WORD_TO_REAL(r1_current-r1_old);
        END_IF
        IF r2_current < r2_old THEN
            r2 := r2_kef*WORD_TO_REAL(65535-r2_old+r2_current+1);
        ELSE
            r2 := r2_kef*WORD_TO_REAL(r2_current-r2_old);
        END_IF
        
        r1_old := r1_current;
        r2_old := r2_current;
        
        recharge_cnt_timer := TRUE;
    END_IF
    И вроде бы не на что списать больше скачки значений расхода - а по факту, такое хоть и реже стало происходить, но все же проявляется с определенной периодичностью.
    Поток сырья не изменяется, значения расходомеров, к примеру, в течении нескольких секунд вполне адекватно меняются, скажем, 50.3 г/с, 50.8 г/с, 50.5 г/с ... а потом разовый скачок до 70 г/с.

    Чем может быть вызвано такое поведение программы? (значения меняются не только на визуализации, такой скачок в отладчике проскакивает точно так же).
    Единственное, что могу предположить, "подвисание" цикла исполнения программы на СПК110.
    Может быть стоит, например, производить опрос чаще, 5 раз в секунду, усреднять и выводить на визуализацию раз в секунду?
    Последний раз редактировалось Sepsis; 09.11.2015 в 15:07.

Похожие темы

  1. Ответов: 9
    Последнее сообщение: 30.10.2014, 11:45
  2. СПК110 + 32ДН
    от МаксТТ в разделе СПК1хх
    Ответов: 4
    Последнее сообщение: 12.08.2014, 18:45
  3. ТРМ200 опрос 2 каналов
    от Chupakabra в разделе Помощь Разработчикам
    Ответов: 2
    Последнее сообщение: 27.04.2007, 15:17
  4. ТРМ200 опрос 2 каналов
    от Chupakabra в разделе Эксплуатация
    Ответов: 0
    Последнее сообщение: 27.04.2007, 13:48

Ваши права

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