Страница 52 из 62 ПерваяПервая ... 2425051525354 ... ПоследняяПоследняя
Показано с 511 по 520 из 689

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

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Ну, не знаю, по мне состояния лучше осмысливать через комментарии
    Код:
    case N of
            0:  // Инициализация
                Res := false;
                Q := 0;
            1: // Шаг вправо
                Res := true;
                Q := 1;
            2: // Шаг влево
                Res := true;
                Q := 2;
            3: // Растрел
                Res := true;
                Q := 3;
       end_case

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

    Жаль что в OL это не поддержано (хотя бы константы)

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

    По умолчанию

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

    Жаль что в OL это не поддержано (хотя бы константы)
    утверждаете что так не работает?
    Код:
    case N of
            3: // Растрел
                Res := true;
                Q := 3;
            2: // Шаг влево
                Res := true;
                Q := 2;
            0:  // Инициализация
                Res := false;
                Q := 0;
            1: // Шаг вправо
                Res := true;
                Q := 1;
    end_case
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    утверждаете что так не работает?
    Код:
    case N of
            3: // Растрел
                Res := true;
                Q := 3;
            2: // Шаг влево
                Res := true;
                Q := 2;
            0:  // Инициализация
                Res := false;
                Q := 0;
            1: // Шаг вправо
                Res := true;
                Q := 1;
    end_case
    Нет конечно (хотя кривой порядок сам по себе может сделать неудобным восприятие).
    Это же не единственный вариант их использования, например могло быть так "N > 3 AND N < 10"

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

    По умолчанию

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

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

  5. #5

    По умолчанию

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

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

    По умолчанию

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

  7. #7

    По умолчанию

    Добрый день!
    Подскажите пожалуйста, почему при изменении переменной 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

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

    По умолчанию

    Цитата Сообщение от Александр_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

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

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

    По умолчанию

    Цитата Сообщение от Александр_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.

  10. #10

    По умолчанию

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

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

Страница 52 из 62 ПерваяПервая ... 2425051525354 ... ПоследняяПоследняя

Похожие темы

  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

Ваши права

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