Страница 58 из 66 ПерваяПервая ... 8485657585960 ... ПоследняяПоследняя
Показано с 571 по 580 из 658

Тема: Функциональные блоки на языке ST

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

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Нет конечно (хотя кривой порядок сам по себе может сделать неудобным восприятие).
    предлагалось вообще не воспринимать цифры, а вдумчиво вчитываться в коммент к кейсу
    Цитата Сообщение от 1exan Посмотреть сообщение
    Это же не единственный вариант их использования, например могло быть так "N > 3 AND N < 10"
    чем это предложение отличается от простой переменной? Константа удобна тем что запись в неё вызовет скорее всего ошибку компилятора, а так её спокойно заменяет обычная переменная, где это возможно в зависимости от среды разработки
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  2. #572

    По умолчанию

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

  3. #573
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,596

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Не, именованые константы/перечисления - очень удобны для таких вещей.
    Например, если бы мне надо было вставить в код выше состояние "Прыжок на месте" - то не пришлось бы перенумеровывать все состояния ниже внутри кода, достаточно поправить константы.

    Жаль что в OL это не поддержано (хотя бы константы)
    Перечисления, структуры и константы удобны в больших программах, когда в разных блоках нужно использовать унифицированные значения. В Лоджике же блоки на ST - это, все-таки локальные самодостаточные макросы. Не думаю, что ST в Лоджике перерастет во что-то большее - для этого, думаю, надо заново всю среду разработки переписывать

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

    По умолчанию

    программа может быть несложной, но из полсотни шагов. И ни какое комментирование, особенно на пнр, не заменит автоматическую перенумерацию которая пофакту будет при использовании констант/перечислений. Особенно при куче ветвлений.

  5. #575

    По умолчанию

    Добрый день!
    Подскажите пожалуйста, почему при изменении переменной udisel оператор if не переключает выходы?
    Необходимо что бы выход Start кратковременно менял значение при изменении udisel для работы Rise_fall.

    //область кода

    xOut1 := 0;
    xOut2 := 0;
    xOut3 := 0;
    Start := false ;

    if (udiSel >= 0) or (udiSel <= 1) then
    xOut1 := IN0_0;
    xOut2 := IN0_1max;
    xOut3 := D0_1;
    Start := true ;
    ELSIF udiSel >= 2 THEN
    Start := false ;

    ELSIF (udiSel >= 2) or (udiSel <=7) then
    xOut1 := IN0_1max;
    xOut2 := IN2_7max;
    xOut3 := D2_7;
    Start := true ;
    ELSIF udiSel >= 8 THEN
    Start := false ;

    end_if

    end_function_block

  6. #576

    По умолчанию

    udiSel >= 0 захватывает весь диапазон значений udiSel

    наверно хотели написать что-то типа
    (udiSel >= 0) AND (udiSel <= 1) ?

    попробуйте CASE - наверное будет проще
    Последний раз редактировалось 1exan; 12.08.2024 в 12:24.

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

    По умолчанию

    Цитата Сообщение от Александр_004 Посмотреть сообщение
    Добрый день!
    Подскажите пожалуйста, почему при изменении переменной udisel оператор if не переключает выходы?
    Необходимо что бы выход Start кратковременно менял значение при изменении udisel для работы Rise_fall.

    //область кода

    xOut1 := 0;
    xOut2 := 0;
    xOut3 := 0;
    Start := false ;

    if (udiSel >= 0) or (udiSel <= 1) then
    xOut1 := IN0_0;
    xOut2 := IN0_1max;
    xOut3 := D0_1;
    Start := true ;
    ELSIF udiSel >= 2 THEN
    Start := false ;

    ELSIF (udiSel >= 2) or (udiSel <=7) then
    xOut1 := IN0_1max;
    xOut2 := IN2_7max;
    xOut3 := D2_7;
    Start := true ;
    ELSIF udiSel >= 8 THEN
    Start := false ;

    end_if

    end_function_block
    Answer | Phind Instant Model

    В вашем коде есть несколько моментов, которые могут привести к тому, что оператор if не переключает выходы так, как вы ожидаете. Давайте разберемся с ними подробнее:
    Проблема с логикой условий

    Ваш код содержит несколько блоков ELSIF, каждый из которых проверяет различные диапазоны значений udiSel. Однако, последовательность этих условий и их формулировка могут приводить к непредвиденному поведению. В частности, если udiSel находится в диапазоне от 2 до 7 включительно, то выполняется только первый блок ELSIF, который устанавливает Start в true, но не обновляет значения xOut1, xOut2, и xOut3. Это происходит потому, что после выполнения первого условия, остальные условия не проверяются из-за использования ключевого слова ELSIF.

    Чтобы исправить это, вам нужно либо объединить условия, чтобы они корректно перекрывались, либо использовать отдельные операторы if для каждого условия, чтобы каждое из них могло быть проверено независимо.
    Использование OR вместо >=

    Вы используете оператор or (or) для проверки диапазонов значений udiSel. Это может привести к тому, что одно из условий будет истинным даже если udiSel находится вне этого диапазона. Например, (udiSel >= 0) or (udiSel <= 1) будет истинным для любого значения udiSel, поскольку хотя бы одно из условий всегда выполняется. Возможно, вы хотели использовать оператор and (and), чтобы оба условия должны выполняться одновременно.
    Рекомендации по исправлению

    Пересмотрите логику условий: Убедитесь, что условия корректно перекрывают все возможные значения udiSel и что нет случайных истинностей из-за неправильного использования операторов or или and.

    Используйте отдельные операторы if для каждого блока: Это позволит каждому блоку условий быть проверенным независимо, избегая проблем с перекрытием.

    Проверьте логику установки Start: Убедитесь, что установка Start в false соответствует вашим требованиям и не мешает правильной работе системы.

    Пример исправленного кода:
    Код:
    xOut1 := 0;
    xOut2 := 0;
    xOut3 := 0;
    Start := false;
    
    if (udiSel >= 0) and (udiSel <= 1) then
    begin
        xOut1 := IN0_0;
        xOut2 := IN0_1max;
        xOut3 := D0_1;
        Start := true;
    end
    else if udiSel >= 2 and udiSel < 8 then
    begin
        xOut1 := IN0_1max;
        xOut2 := IN2_7max;
        xOut3 := D2_7;
        Start := true;
    end
    else if udiSel >= 8 then
    begin
        Start := false;
    end;
    так ответила бездушная машина, вдруг угадала
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  8. #578
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,596

    По умолчанию

    Цитата Сообщение от Александр_004 Посмотреть сообщение
    Добрый день!
    Подскажите пожалуйста, почему при изменении переменной udisel оператор if не переключает выходы?
    Необходимо что бы выход Start кратковременно менял значение при изменении udisel для работы Rise_fall.

    //область кода

    xOut1 := 0;
    xOut2 := 0;
    xOut3 := 0;
    Start := false ;

    if (udiSel >= 0) or (udiSel <= 1) then
    xOut1 := IN0_0;
    xOut2 := IN0_1max;
    xOut3 := D0_1;
    Start := true ;
    ELSIF udiSel >= 2 THEN
    Start := false ;

    ELSIF (udiSel >= 2) or (udiSel <=7) then
    xOut1 := IN0_1max;
    xOut2 := IN2_7max;
    xOut3 := D2_7;
    Start := true ;
    ELSIF udiSel >= 8 THEN
    Start := false ;

    end_if

    end_function_block
    А можно поинтересоваться, как вы именно хотите моргать переменной Start? При каждом изменении udiSel взвести на один цикл или сбросить на один цикл?
    И да, у вас тут несколько ошибок
    1. if (udiSel >= 0) or (udiSel <= 1) then - сразу отбрасывает все остальные сравнения, наверное, вы хотели if (udiSel = 0) or (udiSel = 1)
    2. ELSIF udiSel >= 2 THEN - отбрасывает следующее сравнение, вероятно здесь вы пытались моргнуть
    3. ELSIF (udiSel >= 2) or (udiSel <=7) then - отбрасывает следующее сравнение, тут, наверное ELSIF (udiSel >= 2) and (udiSel <=7)
    4. ELSIF udiSel >= 8 THEN - как бы лишний, потому что вначале вы уже сбросили переменную Start
    Последний раз редактировалось Dimensy; 12.08.2024 в 12:54.

  9. #579

    По умолчанию

    Да, мне нужно при каждом изменении значения udiSel, на один цикл изменять выход Start. Спасибо за поправки

    С поправками выше, стало работать, переключает. Но как кратковременно менять значение выхода Start (bool) в цикле программы? При переключении выходов должен сбросится регулятор подключенный к данным выходам.
    Последний раз редактировалось Александр_004; 12.08.2024 в 13:06.

  10. #580

    По умолчанию

    Цитата Сообщение от Александр_004 Посмотреть сообщение
    Да, мне нужно при каждом изменении значения udiSel, на один цикл изменять выход Start. Спасибо за поправки

    С поправками выше, стало работать, переключает. Но как кратковременно менять значение выхода Start (bool) в цикле программы? При переключении выходов должен сбросится регулятор подключенный к данным выходам.
    Для этого можно использовать код R_Trig, включение выхода на 1 цикл, где In и Q вход и выход
    Код:
    var //объявление локальных переменныx
           R:bool; //локальная переменная с типом данных bool
    end_var    
    
        Q:=In and not R;
        R:=In;

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

Похожие темы

  1. ПЛК73 (Функциональные кнопки)
    от necro в разделе ПЛК63/73
    Ответов: 8
    Последнее сообщение: 18.05.2022, 10:03
  2. Функциональные блоки
    от ribamuka в разделе СПК2xx (архив)
    Ответов: 4
    Последнее сообщение: 08.04.2018, 15:01
  3. Функциональные блоки насосов в CoDeSys
    от Алексей Ермолаев в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 28.03.2017, 13:50
  4. Функциональные блоки- где искать?
    от Xops в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 01.03.2016, 11:07
  5. СПК функциональные клавиши
    от Lyohin в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 30.03.2015, 15:10

Ваши права

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