Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 21 по 30 из 31

Тема: CFC last value

  1. #21

    По умолчанию

    Подсчет расхода вообще не похож на то что у "эталона". Это первая проблема.
    Вторая проблема на счет PID регулирования. Даже если выводить его по неправильному расходу на режим, то не получается. Выполнение каждые 100мс кроме блинка на EN/ENO (что не совсем то, как я понимаю)как еще можно сделать?
    2017-07-24 (6).png

  2. #22
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,256

    По умолчанию

    по первой проблеме можно обратится к оскатовскому flow_meter
    по второй в базовом документе КДС есть описание как создать несколько задач с разным временем выполнения
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #23
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,842

    По умолчанию

    Цитата Сообщение от MrR Посмотреть сообщение
    Подсчет расхода вообще не похож на то что у "эталона". Это первая проблема.
    Вторая проблема на счет PID регулирования. Даже если выводить его по неправильному расходу на режим, то не получается. Выполнение каждые 100мс кроме блинка на EN/ENO (что не совсем то, как я понимаю)как еще можно сделать?
    2017-07-24 (6).png
    Если коэффициенты PID взяты с потолка, то выполнение каждые 100мс не спасет.
    Kp=1.2 ? А почему не 0.12 ?
    И Tv=12 ? А почему не 120 ?
    Я бы и Ymin сделал не 0, а -100. Соответственно и у LIN_TRAFO в этом случае д.б IN_MIN=-100
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #24
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,256

    По умолчанию

    100ms спасет несколько от другого, например.За каждый цикл, регулятор будет просчитывать "шумы" датчика и даже при идеальных коэффициентах стабильности не будет, если в регуляторе имеется "мертвая зона", то можно конечно и ей устранять подобные эффекты
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #25

    По умолчанию

    Это Вы же предлагаете ПИД в другую программу поместить и с помощью глобальных переменных задать текущий расход в эту программу. Затем с помощью Task Manager (Конфигурация задач) задать в свойствах задач циклический тип и задать интервал в 100мс, правильно понял?
    на счет flow metr не совсем понимаю, у меня обычный расчет (кол-во импульсов / цена импульса) * 3600 ну в моем случае 720 т.к. период измерения 5 сек. Я как раз брал промежуток в 5 сек кол-во импульсов.
    Спасибо.

  6. #26
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,256

    По умолчанию

    в симесах же обычно используют ОВ35 для вызова регуляторов там, в КДС задачи это нечто похожее на ОВ

    ну а зачем изобретать велосипед, если кто то уже написал блок счетчика
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #27

    По умолчанию

    Извините, не до конца понимаю на счет работы программы в интервале в 100мс. Тот способ который я описал выше ошибочный?

  8. #28

    По умолчанию

    И еще вопрос на счет блока FLOW_METER. Я тяжело воспринимаю ST не могли бы помочь разобраться, а то как полез в эти дебри еще больше запутался.
    Сам блок из OSCAT:
    Код:
    FUNCTION_BLOCK FLOW_METER
    VAR_INPUT
    	VX : REAL;
    	E : BOOL;
    	RST : BOOL;
    END_VAR
    VAR_INPUT CONSTANT
    	PULSE_MODE : BOOL;
    	UPDATE_TIME : TIME := t#1s;
    END_VAR
    VAR_OUTPUT
    	F : REAL;
    END_VAR
    VAR_IN_OUT
    	X : REAL;
    	Y : UDINT;
    END_VAR
    VAR
    	tx, tl : TIME;
    	int1 : INTEGRATE;
    	init: BOOL;
    	e_last : BOOL;
    	tmp: INT;
    	x_last : REAL;
    	y_last : UDINT;
    END_VAR
    
    (*
    version 1.0	23. jan. 2011
    programmer 	hugo
    tested by	oscat
    
    Flow meter measures flow according to gated time or pulses.
    
    *)
    IF NOT init THEN	(* init on power up *)
    	init := TRUE;
    	tl := tx;
    	x_last := X;
    	y_last := Y;
    	int1.K := 2.7777777777777777E-4;
    END_IF;
    
    (* run integrator *)
    int1(E := NOT (RST OR PULSE_MODE) AND E, X := VX, Y := X);	(* gated operation *)
    
    IF RST THEN		(* reset *)
    	X := 0.0;
    	Y := 0;
    	tl := tx;
    	x_last := 0.0;
    	y_last := 0;
    ELSIF E AND PULSE_MODE THEN	(* check for pulse mode *)
    	IF NOT e_last THEN X := X + VX; END_IF;
    END_IF;
    e_last := E;
    
    (* reduce X to be less than 1 and increase Y respectively *)
    IF X > 1.0 THEN
    	tmp := FLOOR(X);
    	Y := Y + INT_TO_UDINT(tmp);
    	X := X - INT_TO_REAL(tmp);
    END_IF;
    
    (* calculate the current flow *)
    tx := DWORD_TO_TIME(T_PLC_MS());
    IF tx - tl >= UPDATE_TIME AND UPDATE_TIME > t#0s THEN
    	F := (UDINT_TO_REAL(Y - y_last) + X - x_last) / TIME_TO_REAL(tx - tl) * 3.6E6;
    	y_last := Y;
    	x_last := X;
    	tl := tx;
    END_IF;
    
    
    
    (* revision history
    hm	23. jan. 2011	rev 1.0
    	original version
    
    *)
    я не понимаю зачем это нужно:
    IF NOT init THEN (* init on power up *)
    init := TRUE;
    tl := tx;
    x_last := X;
    y_last := Y;
    int1.K := 2.7777777777777777E-4;
    END_IF;
    Присвоение значений после сброса питания?!
    Что за синтаксис на счет переменной int1.K := 2.7777777777777777E-4; ? Что такое .K ? И почему такое (2.7777777777777777E-4) значение у переменной?

    и не понимаю эту часть:
    tx := DWORD_TO_TIME(T_PLC_MS());
    IF tx - tl >= UPDATE_TIME AND UPDATE_TIME > t#0s THEN
    Что за время такое?

  9. #29
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,256

    По умолчанию

    NOT init это инициализация при сттарте программы, так что скорее при подаче питания а не сбросе
    int1 это видимо интеграл и следовательно в этом ПОУ переменная К, ей присваивается значение 0.0002777 вроде бы
    T_PLC_MS() выдает результат количества миллисекунд в формате DWORD, её обратно переводят во время, издержки
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  10. #30

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    NOT init это инициализация при сттарте программы, так что скорее при подаче питания а не сбросе
    int1 это видимо интеграл и следовательно в этом ПОУ переменная К, ей присваивается значение 0.0002777 вроде бы
    T_PLC_MS() выдает результат количества миллисекунд в формате DWORD, её обратно переводят во время, издержки
    capzap, я правильно понимаю, что данный блок я могу использовать в своей программе изменив формулу расхода в строке F := (UDINT_TO_REAL(Y - y_last) + X - x_last) / TIME_TO_REAL(tx - tl) * 3.6E6; ?
    И переменная UPDATE_TIME : TIME := t#1s; правильно понимаю, если изменю значение это и есть период обработки значений в блоке?

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Ваши права

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