Страница 5 из 58 ПерваяПервая ... 345671555 ... ПоследняяПоследняя
Показано с 41 по 50 из 579

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

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

    По умолчанию

    ST вариант моего макроса PLA (кусочно-линейная аппроксимация) по мотивам https://owen.ru/forum/showthread.php...l=1#post220263
    график по 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
    Захват-05.png
    Последний раз редактировалось petera; 01.12.2021 в 01:30.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  2. #42

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Ура!
    Моя первая функция - Вычисление дня недели

    Вложение 58152 Вложение 58154

    Нашёл давно на просторах интернета такой метод

    Скрытый текст:
    dayOfWeek = (year+year/4+ ММ[mounth] + day) MOD 7
    где
    year - год;
    day - номер дня в месяце;
    ММ[mounth] - значение из массива
    январь 5 (4 - для високосного года)
    февраль 1 (0 - для високосного года)
    март 1
    апрель 4
    май 6
    июнь 2
    июль 4
    август 0
    сентябрь 3
    октябрь 5
    ноябрь 1
    декабрь 3


    В вычислениях используются только целочисленные значения
    Код:
    FUNCTION dayOfWeek : UDINT;     // (c)  PeterA
    VAR_INPUT
        year: udint;
        mounth: udint;
        day:udint;
    END_VAR
    VAR
        MM: ARRAY [1..12] OF udint := [5,1,1,4,6,2,4,0,3,5,1,3];
    END_VAR
    
    IF udint_to_bool(year MOD 4 ) THEN
        MM[1]:= 5; MM[2]:= 1;
    ELSE
        MM[1]:= 4; MM[2]:= 0;
    END_IF
    
    dayOfWeek:= (year+year/4+ MM[mounth] + day) MOD 7;
        
    end_function
    Ну с массивами придётся обождать/аккуратно разграничивать. Пока ST и остальной код ОвенЛоджика это как 2 континента с узким подвесным мостом. В Лоджике пока ещё только bool, unsigned long и float. Остальные типы не поддерживаются
    Тролль-наседка, добрый, нежный и ласковый

  3. #43

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Ура!
    Моя первая функция - Вычисление дня недели

    Код:
    FUNCTION dayOfWeek : UDINT;     // (c)  PeterA
    VAR_INPUT
        year: udint;
        mounth: udint;
        day:udint;
    END_VAR
    VAR
        MM: ARRAY [1..12] OF udint := [5,1,1,4,6,2,4,0,3,5,1,3];
    END_VAR
    
    IF udint_to_bool(year MOD 4 ) THEN
        MM[1]:= 5; MM[2]:= 1;
    ELSE
        MM[1]:= 4; MM[2]:= 0;
    END_IF
    
    dayOfWeek:= (year+year/4+ MM[mounth] + day) MOD 7;
        
    end_function
    Протестируйте свою функцию с любым днем 2000 года.

  4. #44

    По умолчанию

    Цитата Сообщение от Rake Runner Посмотреть сообщение
    Протестируйте свою функцию с любым днем 2000 года.
    Уже протестировал, всё работает. А вы не забыли прибавить 2000 к году?

  5. #45

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Уже протестировал, всё работает. А вы не забыли прибавить 2000 к году?
    Тоже ошибся - имел в виду 2100 год.

    2021-12-01_9-58-40.png 2021-12-01_9-58-56.png

  6. #46

    По умолчанию

    Rake Runner, а на кой нам загдядывать в ту пору прекрасную, где жить не придется ни мне, ни тебе? Да и что ПР будет, тоже далеко не факт. Упрощённого алгоритма, справедливого в рамках нашего столетия, предостаточно для большинства наших задач.

  7. #47

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    ST вариант моего макроса PLA (кусочно-линейная аппроксимация)
    Вот это прям мега полезная тема, вспомнил как оформлял PLA для онлайн базы макросов, сколько времени потратил на соединения всех блоков, недавно понадобился блок на 15 точек, я взгрустнул, сейчас же потратил 2 минуты на переделку макроса.
    С уважением, Ревака Юрий.
    Инженер группы технической поддержки компании "ОВЕН"
    e-mail: yu.revaka@owen.ru

    Шаблон описания ошибки ПР или OL http://ftp-ow.owen.ru/softupdate/OWE...s/Shablon.docx
    Видео уроки по ПР200 и OWEN Logic http://edu.owen.ru/series/pr200_rev/
    Другие видеоролики по тематике ПР https://www.youtube.com/channel/UCj4...H5H3d_t6iDlQOQ

  8. #48

    По умолчанию

    Цитата Сообщение от Адрей Посмотреть сообщение
    Радость была не долгой.
    Макрос на ST давайте а не функцию.
    Об этом писал ещё несколько месяцев назад, почему функция, а не ФБ ?
    Мне вот понадобились таймеры TON и TP со вторым выходом отсчёта времени, ща бы на раз сделал.
    Почему таймеры в базе только с булевым выходом, время где? Да и вообще функции не рулят!
    Последний раз редактировалось kondor3000; 01.12.2021 в 11:03.

  9. #49

    По умолчанию

    Цитата Сообщение от Адрей Посмотреть сообщение
    Радость была не долгой.
    Макрос на ST давайте а не функцию.
    Не все сразу, OwenLogic с FBD в том виде как сейчас тоже не за один день появился.
    С уважением, Ревака Юрий.
    Инженер группы технической поддержки компании "ОВЕН"
    e-mail: yu.revaka@owen.ru

    Шаблон описания ошибки ПР или OL http://ftp-ow.owen.ru/softupdate/OWE...s/Shablon.docx
    Видео уроки по ПР200 и OWEN Logic http://edu.owen.ru/series/pr200_rev/
    Другие видеоролики по тематике ПР https://www.youtube.com/channel/UCj4...H5H3d_t6iDlQOQ

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

    По умолчанию

    Цитата Сообщение от dan75 Посмотреть сообщение
    Rake Runner, а на кой нам загдядывать в ту пору прекрасную, где жить не придется ни мне, ни тебе? Да и что ПР будет, тоже далеко не факт. Упрощённого алгоритма, справедливого в рамках нашего столетия, предостаточно для большинства наших задач.
    Спасибо за поддержку!
    Именно этими соображениями и руководствовался для упрощения способа определения високосного года.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

Страница 5 из 58 ПерваяПервая ... 345671555 ... ПоследняяПоследняя

Похожие темы

  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, 12:37

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

Ваши права

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