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

Тема: Макросы в онлайн базе OWEN Logic

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь Аватар для Эдуард_Н
    Регистрация
    22.09.2014
    Адрес
    Курган
    Сообщений
    1,614

    По умолчанию

    Хочу библиотечный макрос График по четырем точкам (Graf_4pnt_v1.04) переделать под 10 точек, но что-то ума не хватает. Помогите.
    До пилил, вроде работает.
    Вложения Вложения
    Последний раз редактировалось Эдуард_Н; 20.07.2022 в 04:28.

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

    По умолчанию

    Цитата Сообщение от Эдуард_Н Посмотреть сообщение
    Хочу библиотечный макрос График по четырем точкам (Graf_4pnt_v1.04) переделать под 10 точек, но что-то ума не хватает. Помогите.
    Так, вроде, был макрос и на 10 точек и не так давно в какой-то теме это встречалось и выкладывалось, если не ошибаюсь Пётр из Минска выкладывал.
    Я тоже как то думал сделать подобный макрос на 32 точки, но пока руки не дошли!
    Последний раз редактировалось Сергей0308; 15.07.2022 в 13:23.
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

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

    По умолчанию

    Цитата Сообщение от Эдуард_Н Посмотреть сообщение
    Хочу библиотечный макрос График по четырем точкам (Graf_4pnt_v1.04) переделать под 10 точек, но что-то ума не хватает. Помогите.
    Цитата Сообщение от Сергей0308 Посмотреть сообщение
    Так, вроде, был макрос и на 10 точек и не так давно в какой-то теме это встречалось и выкладывалось, если не ошибаюсь Пётр из Минска выкладывал.
    Я тоже как то думал сделать подобный макрос на 32 точки, но пока руки не дошли!
    Мой макрос в базе называется PLA, но я уже на ST вариант выкладывал https://owen.ru/forum/showthread.php...l=1#post369459

    график по 10 точкам, метод поиска делением интервала пополам, известный также как двоичный поиск или Дихотомия
    Код:
    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
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #4
    Пользователь Аватар для Эдуард_Н
    Регистрация
    22.09.2014
    Адрес
    Курган
    Сообщений
    1,614

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Мой макрос в базе называется PLA, но я уже на ST вариант выкладывал https://owen.ru/forum/showthread.php...l=1#post369459

    график по 10 точкам, метод поиска делением интервала пополам, известный также как двоичный поиск или Дихотомия
    Код:
    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
    Спасибо, посмотрю.

Похожие темы

  1. Универсальные макросы для OWEN Logic
    от rovki в разделе Среда программирования OWEN Logic
    Ответов: 827
    Последнее сообщение: 22.12.2023, 13:20
  2. OWEN Logic v1.7
    от Евгений Сергеевич в разделе Среда программирования OWEN Logic
    Ответов: 404
    Последнее сообщение: 25.08.2020, 15:17
  3. OWEN Logic v1.7
    от Евгений Сергеевич в разделе Программируемые реле
    Ответов: 401
    Последнее сообщение: 28.07.2016, 19:46
  4. ПО OWEN Logic !!!
    от Ельцов Андрей в разделе Программируемые реле
    Ответов: 3
    Последнее сообщение: 11.10.2011, 16:33
  5. OWEN Logic 1.2.0.14b
    от Ельцов Андрей в разделе Программируемые реле
    Ответов: 40
    Последнее сообщение: 21.02.2011, 14:16

Ваши права

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