Страница 43 из 58 ПерваяПервая ... 33414243444553 ... ПоследняяПоследняя
Показано с 421 по 430 из 579

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

  1. #421
    Пользователь
    Регистрация
    01.11.2022
    Адрес
    <7924127@mail.ru> Минск
    Сообщений
    489

    По умолчанию


    Проверил - посыпаю голову пеплом.

    Очень благодарен, что делаете работу за ОВЕН...

    Я пробовал один из примеров из кодесус перенести в ОЛ - там сразу проверка подавилась.

    Это хелп такой...

    Не понимаю, зачем они скрывают возможности?

  2. #422

    По умолчанию

    Цитата Сообщение от ПавелП Посмотреть сообщение
    Не понимаю, зачем они скрывают возможности?
    Никто не скрывает, в Лоджике действительно пока урезанный ST, но кое что тут есть. Самое плохое, то что сделали только функции, был бы ФБ с несколькими выходами, уже бы намного лучше стало. Всё это писали ещё на первых страницах темы, а воз и ныне там.

    Обещали сделать не только ФБ, но и TIME(); переменные TIME, DWORD, INT, BYTE. Год прошёл!!!
    Одни баги и недоделки. На новой ПР103 урезали Мастера до 64 переменных!!! Не зря я только на ПЛК работаю, нахрен эти ПР.
    Последний раз редактировалось kondor3000; 29.11.2022 в 21:17.

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

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    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
    Вложение 58155
    А нельзя добавить вход "Количество точек", "Слева от первой точки – прямая параллельная оси Х" и "Справа от последней точки – прямая параллельная оси Х", такие как в блоке Graf_4pnt_v1.04 из онлайн библиотеки?

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

    По умолчанию

    Цитата Сообщение от Эдуард_Н Посмотреть сообщение
    А нельзя добавить вход "Количество точек", "Слева от первой точки – прямая параллельная оси Х" и "Справа от последней точки – прямая параллельная оси Х", такие как в блоке 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/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

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

    По умолчанию

    Спасибо petera.

  6. #426
    Пользователь
    Регистрация
    01.11.2022
    Адрес
    <7924127@mail.ru> Минск
    Сообщений
    489

    По умолчанию Время реакции функции на ST

    Вот интересно, в функцию ST вход и выход внешние.
    Фильтры входа не включаем. ПР200

    Какую частоту ST через себя пропустит, не искажая входной сигнал?

    Какой мах цикл можно создать внутри, типа:

    for i :=0 to 1 by X do i:=i+1; i:=i-1; end_for
    X - мах число


    ST, по идее должен работать на частоте ядра.

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

    По умолчанию

    Цитата Сообщение от ПавелП Посмотреть сообщение
    Вот интересно, в функцию ST вход и выход внешние.
    Фильтры входа не включаем. ПР200

    Какую частоту ST через себя пропустит, не искажая входной сигнал?

    Какой мах цикл можно создать внутри, типа:



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

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

  8. #428
    Пользователь
    Регистрация
    01.11.2022
    Адрес
    <7924127@mail.ru> Минск
    Сообщений
    489

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    это не компьютерный язык программирования, здесь сперва придет значение текущее аналогово входа, потом выполнится весь код, включая функцию ST, затем что то уйдет на выхода и далее повториться следующая итерация цикла контроллера, поэтому ни о какой фильтрации внутри макроса речи быть не может
    Это понятно.
    Я про булевый вход и выход (например байт -> байт), и только ST, без других кодов - только одна функция на чистом листе.
    Выполнении цикла и вычислений в цикле произойдёт на частоте ядра?

    Вроде как ничто не должно "мешать" выполнится ST функции???

    PHP код:
    for :=0 to 1 by X  do Input1:= Input1+1;  end_for
    мах число       и выдать Input 8 бит на выход 
    Получится какой программный быстрый обработчик реализовать?
    Интересует именно пик быстродействия.

    И ещё - прирвёт ли что-нить обработку функции?
    Последний раз редактировалось ПавелП; 03.12.2022 в 22:44.

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

    По умолчанию

    Цитата Сообщение от ПавелП Посмотреть сообщение
    Это понятно.
    Я про булевый вход и выход (например байт -> байт), и только ST, без других кодов - только одна функция на чистом листе.
    Выполнении цикла и вычислений в цикле произойдёт на частоте ядра?

    Вроде как ничто не должно "мешать" выполнится ST функции???

    PHP код:
    for :=0 to 1 by X  do Input1:= Input1+1;  end_for
    мах число       и выдать Input 8 бит на выход 
    Получится какой программный быстрый обработчик реализовать?
    Интересует именно пик быстродействия.

    И ещё - прирвёт ли что-нить обработку функции?
    догонит и еще раз прирвёт
    Для начала Вы разберитесь как цикл FOR работает, если Х больше чем единица, то произойдет одна итерация
    О каких 8 битах идет речь, если в ОЛ есть только були, целочисленные и вещественные числа, желательно бы сформулировать задачу, так чтоб она была понятна
    Хотите какое то быстродействие проверить, собирайте схему сами, запускайте и вычисляйтевозможности ПР, если что то не понятно выкладывайте код с объяснением что хотели получить и что в итоге получается
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  10. #430
    Пользователь
    Регистрация
    01.11.2022
    Адрес
    <7924127@mail.ru> Минск
    Сообщений
    489

    По умолчанию Время реакции функции на ST

    Цитата Сообщение от capzap Посмотреть сообщение
    О каких 8 битах идет речь, если в ОЛ есть только були,
    А я про что?
    >> Я про булевый вход и выход (например байт -> байт),

    Входы I1..I8 сформируют входной байт.
    Выходы Q1..Q8 выходной байт.
    Цитата Сообщение от capzap
    и вычисляйте возможности ПР, если что то не понятно выкладывайте код
    Спрашивалось у народа про:
    >> "Какую частоту ST через себя пропустит, не искажая входной сигнал?"
    Если вы не знаете, то так и скажите.

    Подразумевается, что тут гуру за годы уже "собаку съели"!

    В понедельник на работе и проверим.
    P.S. Кстати.
    Цитата Сообщение от capzap
    это не компьютерный язык программирования,
    - Это компьютерный язык программирования!!!
    То что его зажали в функцию, совершенно не мешает
    управлять сложным устройством.
    По крайней мере я справился, отчего и задался максимумом.

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

Похожие темы

  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

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

Ваши права

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