Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 606

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

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

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

    По умолчанию

    Добрый день,

    Приведенный ниже код почему то возвращает 0 или 1 в зависимости от значения inputVariable
    Если убрать оба exit; то возвращает как ожидается - 55 всегда
    Такое ощущение что exit; неправильно работает внутри case of
    может кто сталкивался?
    версия 1.23.301.0

    Код:
    function function1: udint; 
        var_input 
            inputVariable : bool; 
        end_var
        var 
            localVariable : udint := 0; 
        end_var
        repeat
    
            case bool_to_udint(inputVariable) of
            0:
              localVariable := 55;
              exit;
            1:
              localVariable := 55;
              exit;          
          end_case
        until true
        end_repeat
        
        function1 := localVariable;
        
    end_function

  2. #2

    По умолчанию

    Цитата Сообщение от Andrey G Посмотреть сообщение
    Добрый день,

    Приведенный ниже код почему то возвращает 0 или 1 в зависимости от значения inputVariable
    Если убрать оба exit; то возвращает как ожидается - 55 всегда
    Такое ощущение что exit; неправильно работает внутри case of
    может кто сталкивался?
    версия 1.23.301.0

    Код:
    function function1: udint; 
        var_input 
            inputVariable : bool; 
        end_var
        var 
            localVariable : udint := 0; 
        end_var
        repeat
    
            case bool_to_udint(inputVariable) of
            0:
              localVariable := 55;
              exit;
            1:
              localVariable := 55;
              exit;          
          end_case
        until true
        end_repeat
        
        function1 := localVariable;
        
    end_function
    Поддержка отписала что проблема действительно в компиляторе и ее когда-нибудь починят.

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

    По умолчанию

    Цитата Сообщение от Andrey G Посмотреть сообщение
    Поддержка отписала что проблема действительно в компиляторе и ее когда-нибудь починят.
    TRUE для repeat это выход из цикла (это про то, что тут нет бесконечных циклов до которых доколебались)

    А так, видимо exit здесь мастерили сишники)) Описанные симптомы располагают
    Последний раз редактировалось Валенок; 20.09.2022 в 19:02.

  4. #4

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    TRUE для repeat это выход из цикла (это про то, что тут нет бесконечных циклов до которых доколебались)

    А так, видимо exit здесь мастерили сишники)) Описанные симптомы располагают
    Респект вам что код посмотрели ) Я так то про exit спрашивал но почему то дискуссия в сторону циклов ушла и советов как мне писать автомат.

    repeat с безусловным выходом использую чтобы выскочить из case вызвав там exit. Я вообще думал это стандартная конструкция для ST, странно что такой ажиотаж вокруг нее.

  5. #5

    По умолчанию

    Цитата Сообщение от Andrey G Посмотреть сообщение
    Респект вам что код посмотрели ) Я так то про exit спрашивал но почему то дискуссия в сторону циклов ушла и советов как мне писать автомат.

    repeat с безусловным выходом использую чтобы выскочить из case вызвав там exit. Я вообще думал это стандартная конструкция для ST, странно что такой ажиотаж вокруг нее.
    оператор CASE в ST:

    "CASE
    Аналогичен switch в C. Альтернативные ветки не имеют закрывающей программной скобки
    и не могут выполняться одна за другой. Соответственно оператор break не имеет смысла и
    отсутствует. "

    в справке ОЛ по CASE тоже ни exit ни repeat не упоминаются

  6. #6

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    оператор CASE в ST:

    "CASE
    Аналогичен switch в C. Альтернативные ветки не имеют закрывающей программной скобки
    и не могут выполняться одна за другой. Соответственно оператор break не имеет смысла и
    отсутствует. "

    в справке ОЛ по CASE тоже ни exit ни repeat не упоминаются
    break; в СИ так же удобно использовать если вам не нужно выполнять всю ветку.
    например если у вас в ветке несколько проверок перед выполнением остального кода. Тогда у Вас есть вариант поместить код который должен выполнится под условие

    Код:
    case 1:
      if (условие)
      {
         код;
      }
      break;
    Когда условий много, вложенность if становится большой.

    Код:
    case 1:
      if (условие1)
      {
         if (условие2)
        {
           if (условие3)
           {
              код;
           }
         }
       }
       break;

    В таком случае бывает удобно записать так:
    Код:
    case 1:
      if (!условие1) break;
      if (!условие2) break;
      if (!условие3) break;
         
      код;
      break;

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Этот код сам по себе не логичен, зачем здесь бесконечный цикл? Не удивительно что компилятор работает не корректно
    Я собственно про некорректность работы компилятора и пишу.
    Если компилятор код скомпилировал, то он должен работать в соответствии с документацией. Если не может скомпилировать - должен выдать ошибку.
    Здесь налицо непредсказуемое поведение которое кому-нибудь точно потратит много времени
    Я понимаю что у нас тут не gcc и никто ничего не вылизывал годами. Нашел ошибку, поделился с сообществом и разработчиками.
    Пример написан для демонстрации неправильной работы компилятора, чтобы не утруждать Вас чтением 200+ строк кода.
    Про логичность я кажется ничего не спрашивал.

  8. #8

    По умолчанию

    Цитата Сообщение от Andrey G Посмотреть сообщение
    Я собственно про некорректность работы компилятора и пишу.
    Если компилятор код скомпилировал, то он должен работать в соответствии с документацией. Если не может скомпилировать - должен выдать ошибку.
    Здесь налицо непредсказуемое поведение которое кому-нибудь точно потратит много времени
    Я понимаю что у нас тут не gcc и никто ничего не вылизывал годами. Нашел ошибку, поделился с сообществом и разработчиками.
    Пример написан для демонстрации неправильной работы компилятора, чтобы не утруждать Вас чтением 200+ строк кода.
    Про логичность я кажется ничего не спрашивал.
    Приложите, пожалуйста, проект здесь или если будет удобнее можете направить на почту.
    Менеджер по продукту | Owen Logic
    email: soft@owen.ru

  9. #9

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну тут вобщем то не к exit больше вопросов, а к самому репиту, любое его использование не дает правильный результат, я например добился того что если ни чего после репита не стоит, то функция возвращает ноль, если есть некая строчка, то единицу
    Спасибо, это полезная информация.
    Бесконечный репит использую для переключения нескольких состояний автомата за один скан, попробую по-другому сделать раз репит ненадежно работает

  10. #10

    По умолчанию

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

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

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

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

Ваши права

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