Показано с 1 по 10 из 639

Тема: Создать функцию на ST

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,171

    По умолчанию

    Цитата Сообщение от Эдуард_Н Посмотреть сообщение
    А нельзя добавить вход "Количество точек", "Слева от первой точки – прямая параллельная оси Х" и "Справа от последней точки – прямая параллельная оси Х", такие как в блоке Graf_4pnt_v1.04 из онлайн библиотеки?
    Вариант
    Код:
    function PLA_STmod: 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;
            N: udint;    (*Число точек в графике*)
            Is_L_Line:bool; (*Слева от первой точки. Если 1 прямая параллельная оси Х, если 0 продолжение кривой*)
            Is_R_Line:bool;  (*Справа от последней точки. Если 1 прямая параллельная оси Х, если 0 продолжение кривой*)
            In: real;
        end_var
        
        var //объявление локальных переменных
         i: udint;
         a:udint;    (*Начало интервала поиска*)
         b: udint;    (*Конец интервала поиска*)
         x: array [0..9] of real;
         y: array [0..9] of real;
        end_var
    IF N > 10 THEN   N:= 10;
    ELSIF N < 2 THEN    N:= 2;
    END_IF    
    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
        b:= 1; 
        IF Is_L_Line THEN
            In:= x[0];
        END_IF
    ELSIF IN >= x[N-1] THEN
        a:= N-2;
        IF Is_R_Line THEN
            In:= x[N-1];
        END_IF
     (*Теперь можно начать поиск*)
    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;
    
    END_IF
    (*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
    PLA_STmod:= y[b] - (x[b] - IN) * (y[b] - y[a]) / (x[b] - x[a]);
       
    end_function
    Последний раз редактировалось petera; 01.12.2022 в 11:57.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

Похожие темы

  1. Ответов: 14
    Последнее сообщение: 01.07.2023, 21:30
  2. Ответов: 6
    Последнее сообщение: 22.12.2021, 10:50
  3. Ответов: 3
    Последнее сообщение: 13.09.2021, 13:31
  4. ПЛК160. Чем заменить функцию записи 0x05?
    от FallenDAY в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 26.08.2017, 13:19
  5. Как написать собственную функцию wait()
    от PavelKazakov в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 23.07.2009, 11:37

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

Ваши права

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