SIEMENS, DF&PD

Предыдущее посещение: Сб июл 09, 2016 9:57 Текущее время: Сб июл 09, 2016 9:57

Часовой пояс: UTC + 3 часа




 [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Непонятный цикл в STEP7
СообщениеДобавлено: Чт сен 22, 2011 12:54 
Не в сети
Новый писатель

Зарегистрирован: Ср мар 16, 2011 10:58
Сообщения: 29
Откуда: Саратов
Здравствуйте. Кто-нибудь помогите плз. Можно ли запрограммировать такую формулу Q=((Qi1*ti1*Mi1)+(Qi2*ti2*Mi2)+...)/((ti1*Mi1)+(ti2*Mi2)+...)?? n-число этих скобочек от 0 до 100. Q соответств рассчитывается в зависимости от n.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 22, 2011 13:03 
Не в сети
Новый писатель

Зарегистрирован: Ср мар 16, 2011 10:58
Сообщения: 29
Откуда: Саратов
т.е. на следующем шаге исп. значение предыдущего шага.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 22, 2011 13:33 
Не в сети
Известный Писатель

Зарегистрирован: Пт июн 25, 2010 13:15
Сообщения: 229
Реализовать то можно все что угодно. Про формулу поясните поподробней: откуда берутся значения Qi1,ti1,Mi1 и последующие ? n у вас фиксированное или может менятся?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 23, 2011 7:47 
Не в сети
Известный Писатель

Зарегистрирован: Вт июл 06, 2010 11:44
Сообщения: 315
Откуда: Газ-Система-Сервис Пермь
Немного переделал под Вашу задачу функциональный блок для расчета действующего значения функции за период:
Код:
FUNCTION T_ABS :DINT
TITLE = 'модуль разницы времени'
FAMILY: LIB_TMR
VERSION : '1.5'
//KNOW_HOW_PROTECT
VAR_INPUT
    d: DINT;      //разница времени (now-t)
END_VAR
VAR_TEMP
    t:    DINT;
END_VAR
BEGIN
    // если разница времени меньше 0
    t:=d;
    IF (t<0) THEN t:=(16#7fff_ffff - ABS(t)); END_IF;
    t_abs:=t;
    OK:=true;
END_FUNCTION

FUNCTION_BLOCK IntegrQ
TITLE = 'Расчет действующего значения функции Q*M за N циклов'
(* Q=((Qi1*ti1*Mi1)+(Qi2*ti2*Mi2)+...)/((ti1*Mi1)+(ti2*Mi2)+...)
   интегрируем по времени функцию Q*M
   рассчитываем действующее значение 
*)
FAMILY: LIB_TEST
VERSION: '1.1'
//KNOW_HOW_PROTECT
CONST
    maxN:= 100;                       //максимальное количество циклов
END_CONST
VAR_INPUT
    Qi:       REAL;                   //текущее значение по входу
    Mi:       REAL;                   //текущее значение по входу
    N:        INT;                    //количество циклов интегрирования
    rst:      BOOL;                   //сброс
END_VAR
VAR_OUTPUT
    Res:      BOOL;                   //есть результат (=ENO)
    Q:        REAL;                   //действующее значение за период
END_VAR
VAR
    full:     BOOL;                   //буфер заполнен (N циклов прошло)
    oldN:     INT;                    //предыдущее значение N
    px:       INT :=0;                //указатель на текущую позицию в буфере
    tx:       DINT:=0;                //время последней записи в буфер
    s1, s2:   REAL;                   //суммы по числителю и знаменателю 
    QxTxM:    ARRAY[1..maxN] OF REAL; //кольцевой буфер на N циклов (числитель)
    TxM:      ARRAY[1..maxN] OF REAL; //кольцевой буфер на N циклов (знаменатель)   
END_VAR
VAR_TEMP
    now:      DINT; 
    i:        INT;
END_VAR
BEGIN
  //текущее время
  now:=TIME_TO_DINT(time_tck());
  //исходное состояние
  // при сбросе или первом вызове (tx=0)
  // или период интегрирования не задан (<=0) или больше максимального
  IF (rst OR (tx=0) OR (N<=0) OR (N>maxN)) THEN
    px:=0; tx:=now; oldN:=N;
    s1:=0; s2:=0;
    full:=false; 
  ELSE
    //при изменении времени интегрирования дозаполняем буфер заново
    IF (oldN<>N) AND (px>0) THEN
        full:=false; oldN:=N;
        //пересчитываем суммы
        s1:=0; s2:=0;
        FOR i:=1 TO px DO
            s1:=s1 + QxTxM[px];
            s2:=s2 + TxM[px];
        END_FOR;   
    END_IF;
    //заполнение кольцевого буфера [1;N]
    px:=px+1;
    IF (px>N) THEN full:=true; px:=1; END_IF;     
    //рассчитываем числитель и знаменатель и фиксируем время добавления
    TxM  [px]:=Mi * DINT_TO_REAL(T_ABS(d:=(now-tx)));
    QxTxM[px]:=Qi * TxM[px];
    tx:=now;
    //добавляем новые значения к сумме
    s1:=s1 + QxTxM[px];
    s2:=s2 + TxM[px];
    //если буфер заполнен       
    IF (full) THEN
        //вычисляем результат
        IF s2<>0.0 THEN
           Q:=s1/s2;
        ELSE
           Q:=0.0;
        END_IF;
        //убираем из сумм старое (px+1) значение (вытесняемое)
        i:= (px + 1);
        IF (i>N) THEN i:=1; END_IF;
        s1:=s1 - QxTxM[i];
        s2:=s2 - TxM[i];
    END_IF;   
  END_IF;
  //если буфер заполнен - есть результат
  IF NOT full THEN Q:=0.0; END_IF;
  Res := full;
  OK:=Res;
END_FUNCTION_BLOCK


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 23, 2011 7:58 
Не в сети
Известный Писатель

Зарегистрирован: Вт июл 06, 2010 11:44
Сообщения: 315
Откуда: Газ-Система-Сервис Пермь
Суть алгоритма - кольцевые буфера для хранения предыдущих значений, расчет сумм в числителе и знаменателе с вытеснением старых значений.
Немного непонятна роль переменной Mi в вашей задаче. Если это величина постоянная - то она не влияет на результат (сокращается). Если же это тоже переменная величина - то непонятна ее роль. Получается что-то типа действующего значения Q за период с "относительным весом" мгновенных значений M. Не поясните физическую природу такой постановки задачи?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 23, 2011 10:13 
Не в сети
Новый писатель

Зарегистрирован: Ср мар 16, 2011 10:58
Сообщения: 29
Откуда: Саратов
Средний расход нефти так расчит. Про переменные-это все неважно. Допустим, y=х1+х2+..хn, n=100. Все эти иксы должны храниться в db(как я понял). Средствами steр 7 необх посчит у. Средний расход нефти так расчит. Про переменные-это все неважно. Допустим, y=х1+х2+..хn, n=100. Все эти иксы должны храниться в db(как я понял). Средствами steр 7 необх посчит у.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 23, 2011 10:15 
Не в сети
Новый писатель

Зарегистрирован: Ср мар 16, 2011 10:58
Сообщения: 29
Откуда: Саратов
Сори плиз, с телефона сижу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 26, 2011 9:10 
Не в сети
Новый писатель

Зарегистрирован: Ср мар 16, 2011 10:58
Сообщения: 29
Откуда: Саратов
Есть кто-нибудь?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 26, 2011 12:41 
Не в сети
Новый писатель

Зарегистрирован: Ср мар 16, 2011 10:58
Сообщения: 29
Откуда: Саратов
спасибо всем. нужно было исп. - циклический переход (Loop Jump). и все.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 26, 2011 12:42 
Не в сети
Написал больше чем Вы читали

Зарегистрирован: Вс фев 26, 2006 21:44
Сообщения: 1688
Откуда: Липецк, ОАО "НЛМК"
Что-то совсем плохо понятно, что вам нужно.
"Средний расход."?
y=х1+х2+..хn, n=100
Тупо раз в какое-то время суммировать какое-то число с суммой всех предыдущих?
Создаёте OB, запускающийся в нужном вам цикле, в нём складываете уже имеющееся значение суммы с "новым" числом. Можно так же сделать это два раза - для числителя и для знаменателя, потом поделить и выдать результат куда надо.
Значения суммы лучше держать в DB.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 26, 2011 14:39 
Не в сети
Новый писатель

Зарегистрирован: Ср мар 16, 2011 10:58
Сообщения: 29
Откуда: Саратов
В DB хранятся 100 переменных. Число n (задается) показывает сколько переменных нужно из них сложить. Сейчас нашел пример в Бергере оператора LOOP:
Код:

        L     100
label:  T     MB   100
        //...складываются...
        L     MB   100
        LOOP  label

Общее число циклов, которое необходимо выполнить-100. Переменная MB100 содержит число циклов, которое необходимо выполнить.
Что в середине пока не знаю.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group