Создание и редактирование функции на scl для step 7

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Looneyatwar
Posts: 2
Joined: Fri Nov 15, 2013 7:15 am

Создание и редактирование функции на scl для step 7

Post by Looneyatwar »

Доброго времени суток!)
У меня возникла необходимость создания функции для масштабирования и последующей обработки сигнала с пирометра (нахождение разброса, медианы и т.п.). Сигнал заходит на модуль аналогового ввода sm431. Принцип работы функции следующий: если на вход поступает температура меньше 605 град, то на выходе постоянно 600 градусов. Если температура больше, то начинается нахождение среднего значения температуры за 50 измерений. Но у меня не получилось это реализовать, подскажите пожалуйста, в чём могут быть ошибки?
Ещё проблема в том, что таких пирометров несколько и если я вызываю одну и туже функцию по несколько раз и завожу на неё значения с разных пирометров. На выходах двух одинаковых функций я получаю одинаковые значения при разных входных данных. Если к примеру на входе одной функции ноль, а на другой какое-то значение, то в обоих функциях происходит расчёт и соответственно на первой показываются ложные значения (не ноль, а значения с других пирометров). Как от это избавится? Пробовал использовать var_temp - не помогло. Пробовал создавать разные функции с одинаковыми переменными - все равно не помогло(.
Заранее спасибо!)
code
Show

Code: Select all

FUNCTION FC33 : VOID
VAR_INPUT
    data_in:INT;
    reset:BOOL;
END_VAR

VAR_OUTPUT
    OUT:REAL;
    OUT2:REAL;
    VERT_Q:REAL;
    end_mes:BOOL;
    OBERG:REAL; 
    UNTERGR:REAL;   
END_VAR

VAR
    tmp:DINT;
    temper:REAL;
    COUNT:INT;
    //COUNT:INT;         // Число измерений
    MIWERT:REAL;       // Среднее занчение
    SIGMA:REAL;        // СУММА КВАДРАТОВ
    VERT:REAL;
END_VAR

BEGIN 
 IF RESET THEN 
  COUNT:=0;
  MIWERT:=0.0;
  SIGMA:=0.0;
  VERT:=0.0;  
  end_mes:=0;
 END_IF;
  tmp:=INT_TO_DINT(data_in);
  temper:=DINT_TO_REAL(tmp);
  temper:=(temper*0.01822234)+600.0;
     IF temper>650.0 
      THEN
       MIWERT:=MIWERT+temper;
       COUNT:=COUNT+1;    
       SIGMA:=SIGMA+(temper*temper);
      //ELSE
      //out:=600;      
    END_IF;
    
       IF COUNT>=50 THEN
        MIWERT:=MIWERT/COUNT;
        out:=MIWERT;
        SIGMA:=SQR((SIGMA-((MIWERT*MIWERT)*COUNT))/(COUNT-1));  // Вычисляем разброс
        VERT_Q:=(SIGMA*0.2841)/MIWERT;               
        OBERG:=MIWERT+SIGMA+(MIWERT*0.05);
        UNTERGR:=MIWERT-SIGMA-(MIWERT*0.05);
        end_mes:=1;
        COUNT:=0;
       END_IF;
END_FUNCTION     
Image (pm)
Image
Image
Schtiel
Site Admin
Posts: 1122
Joined: Wed Sep 06, 2006 12:03 pm
Location: CIS

Re: Создание и редактирование функции на scl для step 7

Post by Schtiel »

Функции не сохраняют значения внутренних переменных между вызовами, поэтому COUNT не будет увеличиваться и т.п. VAR и VAR_TEMP для функций - одно и то же (область TEMP).

Используйте вместо функций функциональные блоки.