Страница 55 из 58 ПерваяПервая ... 5455354555657 ... ПоследняяПоследняя
Показано с 541 по 550 из 579

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

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    то что показано на видео это обычная запись строки в конец файла, имя которому что_то_там.csv
    И указанием винде что csv файлы открывать екселем
    Спасибо!
    Я уже перебрался с этим вопросом, в тему - посмотрю что подскажут.

  2. #542

    По умолчанию

    Цитата Сообщение от 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
    petera, зачем такие сложности. Температурный график достаточно прост (см.картинку). Таким образом, достаточно знать координаты двух точек перегиба графика.
    Изображения Изображения
    Последний раз редактировалось IVM; 30.04.2023 в 15:26.

  3. #543

    По умолчанию

    Цитата Сообщение от CORSAR1500 Посмотреть сообщение
    Добрый вечер! Конечный автомат сделать можно. На входе создаете переменную, например, PrevState. И с помощью "линии задержки" передаете выходное значение Q (UDInt - код шага в автомате) на вход. Таким образом при вызове функция узнает на каком шаге автомата она остановилась в прошлом цикле. Внутри делаете CASE по PrevState и все. Получился такой себе FB с хранением предыдущего состояния "снаружи". Все таймеры внешние. Если шаг =10, то таймер 1 запустить. Таймер через время задержки Т выдает TRUE на вход функции. Управление исполнительными механизмами - по номеру состояний. Вложение 58181Вложение 58182
    Интерсное применение рекурсии
    красиво!

  4. #544

    По умолчанию

    Здравствуйте. Пишу здесь первый раз. Просто хочется разобраться. У нас на производстве наливают, бочки, кубы, цистерны. И по запросу операторов им нужны переносные пульты для включение и отключение насосов, да еще и реверс. Так как за разумные деньги только ПКТ, но у него два нормально открытых. Сделал систему на ПР. Решил сделать так, чтобы при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался. Пробовал написать несколько программ. Так вот получился у меня интересный случай. Одна функция нормально работает, как я и хотел. Другая не в какую. Кто-нибудь может помочь разобраться? Файл и код прилагаю
    Эта функция не работает.
    Код:
    function motorvper: bool; //имя функции и тип данных выхода
        var_input //объявление входных переменных
            //входная переменная с типом данных bool
            vper : bool;
            nazad : bool;
            puskv : bool;
            puskn : bool;
        end_var
        
        var //объявление локальных переменных
        end_var
        
       if vper=true or puskv=true and nazad=false and puskn=false then motorvper := true;
       end_if 
       
        if vper=true or nazad=true and puskv=true then motorvper := false ;
        end_if
        
    end_function
    А эта работает.
    Код:
    function motornazad: bool; //имя функции и тип данных выхода
        var_input //объявление входных переменных
            vpered : bool;//входная переменная с типом данных bool
            nazad : bool;
            puskv : bool;
            puskn : bool;
        end_var
        
        var //объявление локальных переменных
        end_var
        
       if nazad=true or puskn=true and vpered=false and puskv=false then motornazad := true;
       end_if 
       
        if vpered=true or nazad=true and puskn=true then motornazad := false;
       end_if
        
    end_function
    Вложения Вложения

  5. #545

    По умолчанию

    Алексаныч
    при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался
    Так а если без функции делать? Взять R_TRIG по нажатию на кнопки и AND с выходом насоса? А насосом управлять по RS-триггеру (с приоритетом R)?
    То есть, описать условие "Если прошёл импульс наражтия кнопки И насос работает - выключить".
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  6. #546
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,278

    По умолчанию

    Вторые строчки в топку
    Сравнение с труе/фальсе в топку
    Явные скобки в логических выражениях
    И разберетесь

  7. #547

    По умолчанию

    Цитата Сообщение от Алексаныч Посмотреть сообщение
    Здравствуйте. Пишу здесь первый раз. Просто хочется разобраться. У нас на производстве наливают, бочки, кубы, цистерны. И по запросу операторов им нужны переносные пульты для включение и отключение насосов, да еще и реверс. Так как за разумные деньги только ПКТ, но у него два нормально открытых. Сделал систему на ПР. Решил сделать так, чтобы при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался. Пробовал написать несколько программ. Так вот получился у меня интересный случай. Одна функция нормально работает, как я и хотел. Другая не в какую. Кто-нибудь может помочь разобраться? Файл и код прилагаю
    Эта функция не работает.
    У вас в обеих функциях, последние IF одинаковые, а должны быть разные.
    Код:
       
    //    if vper=true or nazad=true and puskv=true then motorvper := false ;   //Это ваш код
    //    end_if
    
    if nazad or vper and puskv then motorvper := false ; // рабочий код
        end_if
    end_function
    И линии задержки сделайте, вместо жёлтых линий
    А можно вторые IF вообще выбросить в обеих, тоже работать будет.
    Последний раз редактировалось kondor3000; 30.05.2023 в 09:11.

  8. #548

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Алексаныч
    Так а если без функции делать? Взять R_TRIG по нажатию на кнопки и AND с выходом насоса? А насосом управлять по RS-триггеру (с приоритетом R)?
    Да можно. Интересно было написать на ST. Скажем честно я в нем профан и поэтому познаю потихоньку.

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    У вас в обеих функциях, последние IF одинаковые, а должны быть разные.
    Код:
       
    //    if vper=true or nazad=true and puskv=true then motorvper := false ;   //Это ваш код
    //    end_if
    if nazad or vper and puskv then motorvper := false ; // рабочий код
        end_if
    end_function
    И линии задержки сделайте, вместо жёлтых линий
    А можно вторые IF вообще выбросить в обеих, тоже работать будет.
    Спасибо. Буду дальше разбираться в ST.

  9. #549

    По умолчанию

    Цитата Сообщение от Алексаныч Посмотреть сообщение
    Интересно было написать на ST. Скажем честно я в нем профан и поэтому познаю потихоньку.
    Спасибо. Буду дальше разбираться в ST.
    Можно обе функции записать без IF, по совету Валенка
    Код:
    motorvper:=(vper or puskv and not nazad);  //  1 функция
    
    motornazad:=(nazad or puskn and not vpered); //   2 функция
    Последний раз редактировалось kondor3000; 30.05.2023 в 10:38.

  10. #550

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Можно обе функции записать без IF, по совету Валенка
    Код:
    motorvper:=(vper or puskv and not nazad);  //  1 функция
    
    motornazad:=(nazad or puskn and not vpered); //   2 функция
    Да если бы он вот так объяснил, было бы намного лучше.
    Но походу или я тупой или плохо обрисовал задачу. Если вот так прописать, как в первом варианте(даже с линиями задержки, и без вторых IF) или вариант Валенка. То на симуляции это работает так. На примере команды "Вперед". Подается сигнал на первый выход(пуск двигателя вперед). Если нажать повторно кнопку "Вперед" двигатель остановится. Но вот если вместо кнопки "Вперед", нажать "Назад" двигатель не остановится, а мгновенно включиться сигнал на второй выход(пуск двигателя в реверс). А мне надо, чтобы он остановился и уже при следующем нажатии кнопки оператор может запустить двигатель в нужный момент. Просто у нас растительное масло, а оно способно сделать залипании кнопки.

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

Похожие темы

  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

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

Ваши права

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