Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 30

Тема: ПР200 зависимая(плавающая) уставка

  1. #1
    Пользователь
    Регистрация
    25.02.2025
    Адрес
    Иркутск
    Сообщений
    8

    По умолчанию ПР200 зависимая(плавающая) уставка

    Здравствуйте!
    Цель: нагрев котла до температуры, зависящей от уличной температуры. Чем холоднее на улице, тем горячее котел в помещении. Не знаю, с чего начать.
    Зависимость t улицы -> t котла должна быть табличной, задаваемой пользователем, 15-20 точек, хранящихся в энергонезависимой памяти, желательно с интерполяцией.
    Как я это представляю: создать 15-20 переменных, каждую по одной выводить на дисплей для редактирования и сохранения, для этого создать столько же экранов. Уличную t сравнивать 20 раз с фиксированной таблицей (-30, -25, -20, ...), находя вилку, в которой она сейчас находится, затем найти относительное смещение в этой вилке 0..5 гр. затем взять два соседних значения из таблицы и найти "среднее" в соответствии с найденным смещением. Полученное значение поместить в уставку, до которой нагревать котел.
    Подскажите, правильно ли я двигаюсь в этом направлении? Или есть другой, более простой способ?

  2. #2

    По умолчанию

    Цитата Сообщение от barrymore Посмотреть сообщение
    Здравствуйте!
    Цель: нагрев котла до температуры, зависящей от уличной температуры. Чем холоднее на улице, тем горячее котел в помещении. Не знаю, с чего начать.
    Зависимость t улицы -> t котла должна быть табличной, задаваемой пользователем, 15-20 точек, хранящихся в энергонезависимой памяти, желательно с интерполяцией.
    Как я это представляю: создать 15-20 переменных, каждую по одной выводить на дисплей для редактирования и сохранения, для этого создать столько же экранов. Уличную t сравнивать 20 раз с фиксированной таблицей (-30, -25, -20, ...), находя вилку, в которой она сейчас находится, затем найти относительное смещение в этой вилке 0..5 гр. затем взять два соседних значения из таблицы и найти "среднее" в соответствии с найденным смещением. Полученное значение поместить в уставку, до которой нагревать котел.
    Подскажите, правильно ли я двигаюсь в этом направлении? Или есть другой, более простой способ?
    Тут готовая функция, на ST вариант макроса PLA (кусочно-линейная аппроксимация) на 10 точек, зависимость Т котла от Т улицы.1 График.jpg
    Задавать можно константами или переменными.
    https://owen.ru/forum/showthread.php?t=35489&page=5

    Таблица должна быть отсортирована по X в порядке возрастания.
    Последний раз редактировалось kondor3000; 25.02.2025 в 11:44.

  3. #3
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    9,002

    По умолчанию

    Цитата Сообщение от barrymore Посмотреть сообщение
    Здравствуйте!
    Цель: нагрев котла до температуры, зависящей от уличной температуры. Чем холоднее на улице, тем горячее котел в помещении. Не знаю, с чего начать.
    Зависимость t улицы -> t котла должна быть табличной, задаваемой пользователем, 15-20 точек, хранящихся в энергонезависимой памяти, желательно с интерполяцией.
    Как я это представляю: создать 15-20 переменных, каждую по одной выводить на дисплей для редактирования и сохранения, для этого создать столько же экранов. Уличную t сравнивать 20 раз с фиксированной таблицей (-30, -25, -20, ...), находя вилку, в которой она сейчас находится, затем найти относительное смещение в этой вилке 0..5 гр. затем взять два соседних значения из таблицы и найти "среднее" в соответствии с найденным смещением. Полученное значение поместить в уставку, до которой нагревать котел.
    Подскажите, правильно ли я двигаюсь в этом направлении? Или есть другой, более простой способ?
    Я обычно формулу придумывал за 5-10 минут, чтобы функция выполнялась с точностью до одной десятой градуса, что мне кажется вполне достаточно, можно конечно и кусочно-линейной интерполяцией забацать, но это немного сложней, в смысле, Вы не найдёте готовых макросов на 20 точек, на форуме встречал до 10 точек и предпочитаю использовать один экран для ввода всех точек, зачем все стремятся для каждой точки свой экран использовать, мне неведомо, наверно занять себя больше нечем!
    Здесь подобное делали: https://owen.ru/forum/showthread.php?t=34853&page=4
    Последний раз редактировалось Сергей0308; 26.02.2025 в 09:11.
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

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

    По умолчанию

    Цитата Сообщение от barrymore Посмотреть сообщение
    Здравствуйте!
    Цель: нагрев котла до температуры, зависящей от уличной температуры. Чем холоднее на улице, тем горячее котел в помещении. Не знаю, с чего начать.
    Зависимость t улицы -> t котла должна быть табличной, задаваемой пользователем, 15-20 точек, хранящихся в энергонезависимой памяти, желательно с интерполяцией.
    Как я это представляю: создать 15-20 переменных, каждую по одной выводить на дисплей для редактирования и сохранения, для этого создать столько же экранов. Уличную t сравнивать 20 раз с фиксированной таблицей (-30, -25, -20, ...), находя вилку, в которой она сейчас находится, затем найти относительное смещение в этой вилке 0..5 гр. затем взять два соседних значения из таблицы и найти "среднее" в соответствии с найденным смещением. Полученное значение поместить в уставку, до которой нагревать котел.
    Подскажите, правильно ли я двигаюсь в этом направлении? Или есть другой, более простой способ?
    ST функция графика кусочно-линейной апроксимации https://owen.ru/forum/showthread.php...l=1#post369459
    Код:
    function PLA_ST: real; //    (c) PeterA
        var_input //объявление входных переменных
            x1: real;
            x2: real;
            x3: real;
            x4: real;
            x5: real;
            x6: real;
            x7: real;
            x8: real;
            x9: real;
            x10: real;
            y1: real;
            y2: real;
            y3: real;
            y4: real;
            y5: real;
            y6: real;
            y7: real;
            y8: real;
            y9: real;
            y10: real;
            In: real;
        end_var
        
        var //объявление локальных переменных
         a:udint;    (*Начало интервала поиска*)
         b: udint;    (*Конец интервала поиска*)
         N: udint;    (*Число точек в графике*)
         i: udint;
         x: array [0..9] of real;
         y: array [0..9] of real;
        end_var
        
    N:= 10;
    x[0]:= x1;
    x[1]:= x2;
    x[2]:= x3;
    x[3]:= x4;
    x[4]:= x5;
    x[5]:= x6;
    x[6]:= x7;
    x[7]:= x8;
    x[8]:= x9;
    x[9]:= x10;
    
    y[0]:= y1;
    y[1]:= y2;
    y[2]:= y3;
    y[3]:= y4;
    y[4]:= y5;
    y[5]:= y6;
    y[6]:= y7;
    y[7]:= y8;
    y[8]:= y9;
    y[9]:= y10;
    
    (*Начальные значения интервала поиска*)
    a:=0;
    b:=N-1;
    
    (*Обрезание графика для крайних точек*)
    IF IN<=x[0] THEN
        PLA_ST:=y1;
    ELSIF IN>= x[N-1] THEN
        PLA_ST:= y[N-1];
    (*Теперь можно начать поиск*)
    ELSE
        WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
        i:=(a+b)/2;    (*Делим интервал поиска пополам*)
        IF IN=x[i+1] THEN    (*Может нам повезло, и мы сразу нашли точку? *)
        a:=i; b:=i+1;            (*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
        (*мимо :( ,тогда посмотрим в какую половину интервала попали*)
        ELSIF IN>x[i] THEN    (*Если входной сигнал больше середины интервала поиска,*)
        a:=i;                     (*то следующий поиск будем делать начиная от середины и до конца массива*)
        ELSE                    (*А если входной сигнал меньше середины интервала поиска,*)
        b:=i;                     (*то следующий поиск будем делать начиная от начала и до середины массива*)
        END_IF
    (*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину значений
    две соседние координаты X(a) и Х(а+1), меду которыми попадает входной сигнал найдем очень быстро
    для 8 точек графика нужно не более 3 итераций
    при 9..16 точек в графике нужно не более 4 итераций
    при 17..32 точек в графике нужно не более 5 итераций
    при 33..64 точек в графике нужно не более 6 итераций
    при 65..128 точек в графике нужно не более 7 итераций
    инфа точная - 100% ;) *)
    END_WHILE;
    (*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
    PLA_ST:= y[b] - (x[b] - IN) * (y[b] - y[a]) / (x[b] - x[a]);
    END_IF
    
       
    end_function
    Количество пар точек Xi Yi можно увеличить
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #5

    По умолчанию

    Я раньше тоже использовал таблицы, но задавал их константами в самом проекте (редактирование таблицы крайне редкое занятие).
    Сейчас просто подбираю формулу (функцию), которая как можно ближе подходит к описанию зависимости и рассчитываю коэффициенты (обычно 2 числа с плавающей запятой). Взял из п, дьяконов СПРАВОЧНИК ПО РАСЧЕТАМ НА МИКРОКАЛЬКУЛЯТОРАХ
    Owen2.jpg

  6. #6
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,619

    По умолчанию

    Ну и до кучи, еще здесь можно посмотреть
    https://owen.ru/forum/showthread.php...l=1#post422461

  7. #7
    Пользователь
    Регистрация
    25.02.2025
    Адрес
    Иркутск
    Сообщений
    8

    По умолчанию

    Не ожидал такой быстрой реакции! Спасибо всем ответившим!
    Перед вызовом функции или макроса значения таблицы перекодировки уже должны быть заполнены, как я понимаю. То есть все пары (Xn, Yn).
    Значения Xn редактировать не нужно(константы), они будут идти с фиксированным шагом 5 градусов, например. А вот выходные значения должен вводить пользователь кнопками на дисплее и далее иметь возможность их редактировать в процессе эксплуатации. Как это проще всего реализовать, если будет 20 переменных?

  8. #8

    По умолчанию

    Цитата Сообщение от barrymore Посмотреть сообщение
    Не ожидал такой быстрой реакции! Спасибо всем ответившим!
    Перед вызовом функции или макроса значения таблицы перекодировки уже должны быть заполнены, как я понимаю. То есть все пары (Xn, Yn).
    Значения Xn редактировать не нужно(константы), они будут идти с фиксированным шагом 5 градусов, например. А вот выходные значения должен вводить пользователь кнопками на дисплее и далее иметь возможность их редактировать в процессе эксплуатации. Как это проще всего реализовать, если будет 20 переменных?
    Лучший вариант наверно будет добавлять или убавлять коррекцию к рассчитанной уставке.
    И 20 переменных это лишнее, 10 точек за глаза. Иногда даже уменьшают до 2-4 точек.
    Последний раз редактировалось kondor3000; 25.02.2025 в 12:43.

  9. #9

    По умолчанию

    Цитата Сообщение от barrymore Посмотреть сообщение
    Не ожидал такой быстрой реакции! Спасибо всем ответившим!
    Перед вызовом функции или макроса значения таблицы перекодировки уже должны быть заполнены, как я понимаю. То есть все пары (Xn, Yn).
    Значения Xn редактировать не нужно(константы), они будут идти с фиксированным шагом 5 градусов, например. А вот выходные значения должен вводить пользователь кнопками на дисплее и далее иметь возможность их редактировать в процессе эксплуатации. Как это проще всего реализовать, если будет 20 переменных?
    В реальной жизни не нужно такое количество точек. График легко задаётся максимум 6 точками, причём крайние точки могут одновременно являться его "срезками" сверху и снизу.
    Таким образом, вам понадобится 6 пар переменных. Лучше иметь возможность изменять все значения

  10. #10

    По умолчанию

    Ну, если очень хочется, то я бы сделал так:
    Код:
    function PLAst: real;
        
        var_input
            Y0, Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, Y9, Y10: real;
            Y11, Y12, Y13, Y14, Y15, Y16, Y17, Y18, Y19, Y20: real;
            X: real;
        end_var
        
        var 
            i: udint;
            ri: real;
        end_var
        
        for i := 0 to 20 do
            ri := udint_to_real(i);
            if X * ri >= 5 * ri and X * ri < (ri + 1) * 5 then exit; end_if
        end_for
        
        case i of
            0: PLAst := Y0 + (Y1 - Y0) / 5 * (X - (5 * ri)); 
            1: PLAst := Y1 + (Y2 - Y1) / 5 * (X - (5 * ri)); 
            2: PLAst := Y2 + (Y3 - Y2) / 5 * (X - (5 * ri)); 
            3: PLAst := Y3 + (Y4 - Y3) / 5 * (X - (5 * ri)); 
            4: PLAst := Y4 + (Y5 - Y4) / 5 * (X - (5 * ri)); 
            5: PLAst := Y5 + (Y6 - Y5) / 5 * (X - (5 * ri)); 
            6: PLAst := Y6 + (Y7 - Y6) / 5 * (X - (5 * ri)); 
            7: PLAst := Y7 + (Y8 - Y7) / 5 * (X - (5 * ri)); 
            8: PLAst := Y8 + (Y9 - Y8) / 5 * (X - (5 * ri)); 
            9: PLAst := Y9 + (Y10 - Y9) / 5 * (X - (5 * ri)); 
            10: PLAst := Y10 + (Y11 - Y10) / 5 * (X - (5 * ri)); 
            11: PLAst := Y11 + (Y12 - Y11) / 5 * (X - (5 * ri)); 
            12: PLAst := Y12 + (Y13 - Y12) / 5 * (X - (5 * ri)); 
            13: PLAst := Y13 + (Y14 - Y13) / 5 * (X - (5 * ri)); 
            14: PLAst := Y14 + (Y15 - Y14) / 5 * (X - (5 * ri)); 
            15: PLAst := Y15 + (Y16 - Y15) / 5 * (X - (5 * ri)); 
            16: PLAst := Y16 + (Y17 - Y16) / 5 * (X - (5 * ri)); 
            17: PLAst := Y17 + (Y18 - Y17) / 5 * (X - (5 * ri)); 
            18: PLAst := Y18 + (Y19 - Y18) / 5 * (X - (5 * ri)); 
            19: PLAst := Y19 + (Y20 - Y19) / 5 * (X - (5 * ri)); 
            20: PLAst := Y20; 
        end_case
    
    end_function
    Все Yn на одном экране по порядку.

    Owen.jpg

Страница 1 из 3 123 ПоследняяПоследняя

Похожие темы

  1. Настройка ПИД в ПР200 (уставка/время)
    от Anthony.Alekseev в разделе Программируемые реле
    Ответов: 4
    Последнее сообщение: 12.09.2024, 09:29
  2. ТРМ-151 Уставка
    от Чернявый в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 25.09.2011, 10:13
  3. Плавающая обшибка конфигуратора ТРМ202
    от geaden в разделе Сервисное ПО
    Ответов: 4
    Последнее сообщение: 14.11.2008, 12:30
  4. уставка
    от незарегистрированный в разделе Подбор Оборудования
    Ответов: 5
    Последнее сообщение: 17.07.2007, 09:51
  5. уставка на трм 151-03
    от Виктор Федорович Алжиков в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 23.06.2007, 21:45

Метки этой темы

Ваши права

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