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

Тема: не могу выйти из бесконечного цикла FOR

  1. #1

    По умолчанию не могу выйти из бесконечного цикла FOR

    Добрый день! не могу понять почему переменная Var1 продолжает расти до переполнения:
    PROGRAM PLC_PRG
    VAR
    Counter: INT;
    Var1: INT;
    END_VAR

    --------


    FOR Counter:=1 TO 5 DO
    Var1:= Var1+1;
    END_FOR;

  2. #2

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    И Counter что-то завис на 6. Да ?
    ну с Counter понятно- выполнилось условие, но почему тело цикла-то выполняется? в чем ошибка?

  3. #3

    Smile

    Цитата Сообщение от Kiselev Посмотреть сообщение
    ну с Counter понятно- выполнилось условие, но почему тело цикла-то выполняется? в чем ошибка?
    Извините, а что Вы ожидали получить? Программа PLC_PRG по умолчанию в CoDeSys вертится постоянно, вот из неё и надо вызывать другие программы (Например: prgOtoplenie), функциональный блоки (Например: fnbDetectAlarm) и тд.
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  4. #4
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    Или поместите FOR во внутрь IF. Также для выхода в теле цикла используют EXIT.
    А так у Вас каждый цикл программы, как верно заметил Виктор Родиков повторяется Ваш FOR/

  5. #5

    По умолчанию

    Цитата Сообщение от Kiselev Посмотреть сообщение
    ну с Counter понятно- выполнилось условие, но почему тело цикла-то выполняется? в чем ошибка?
    Потому что программа в ПЛК фактически выглядит так:

    WHILE(1) DO
    PLC_PRG();
    END_WHILE

    Подставьте вместо PLC_PRG() свою программу и поймёте, почему цикл получается «бесконечным».

  6. #6
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    А он не предлагал ничего городить вроде.

  7. #7
    Пользователь
    Регистрация
    19.06.2009
    Адрес
    Киев
    Сообщений
    120

    По умолчанию

    1 PLC_PRG постоянно циклически вызывается контролером
    2 при первом вызове PLC_PRG переменная Var1 не определена и может принять любое значение (к примеру Х)
    3 выполняется цикл FOR после выполнении его переменная Var1 принимает значение Х+5, переменная Counter значение 6
    4 заканчивается выполнение PLC_PRG
    5 следующий вызов PLC_PRG
    6 переменная Var1 имеет значение (х+5)
    7 выполняется цикл FOR после выполнения цикла переменная Var1 принимает значение (х+5+5) переменная Counter значение 6
    8 заканчивается выполнение PLC_PRG
    и так далее выполняются пункты 5-8
    Просматриваю программу видим бесконечно растущую переменную Var1 и переменную Counter имеющую значение 6
    Последний раз редактировалось ksn33; 20.01.2012 в 20:33.

  8. #8

    По умолчанию

    Цитата Сообщение от ksn33 Посмотреть сообщение
    1 PLC_PRG постоянно циклически вызывается контролером
    2 при первом вызове PLC_PRG переменная Var1 не определена и может принять любое значение (к примеру Х)
    3 выполняется цикл FOR после выполнении его переменная Var1 принимает значение Х+5, переменная Counter значение 6
    4 заканчивается выполнение PLC_PRG
    5 следующий вызов PLC_PRG
    6 переменная Var1 имеет значение (х+5)
    7 выполняется цикл FOR после выполнения цикла переменная Var1 принимает значение (х+5+5) переменная Counter значение 6
    8 заканчивается выполнение PLC_PRG
    и так далее выполняются пункты 5-8
    Просматриваю программу видим бесконечно растущую переменную Var1 и переменную Counter имеющую значение 6
    Извините за глупый вопрос, но я не понимаю почему инструкция в цикле продолжает работать (переменная Var1 инкрементируется) при достижении Counter значения 6.

    ПРоблему я победил - перед циклом поставил Var1:=0. Все работает как надо. но почему это работает я не понимаю. Тем более что по умолчанию Var1 и так равен 0.

  9. #9
    Пользователь
    Регистрация
    19.06.2009
    Адрес
    Киев
    Сообщений
    120

    По умолчанию

    Смотри, цикл у тебя, к примеру выполнился первый раз (Var1 стало к примеру 5) а далее ПЛК опять циклически вызывает PLC_PRG цикл начинает выполняться второй раз а значение Var1 осталось то предыдущим (5) поэтому оно опять увеличивается на 5(теперь оно 10)! Далее опять вызывается PLC_PRG и цикл выполняется третий раз и так далее... Когда ты поставил Var1:=0 перед выполнением цикла то каждый раз перед выполнением цикла у тебя значение Var1 обнуляется поэтому оно не превышает 5. Так яснее?
    PS За наличие вопросов извиняться не надо, хуже когда их нет
    Последний раз редактировалось ksn33; 23.01.2012 в 11:15.

  10. #10

    По умолчанию

    ksn33, большое спасибо-мне понятна логика работы ПЛК и вызова PLC_PRG, но я не понимаю следующего из справки Кодесис:
    "С помощью FOR можно программировать повторяющиеся процессы.
    Синтаксис:
    INT_Var :INT;
    FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <Step size>} DO
    <Instructions>
    END_FOR
    Часть конструкции, заключенная в фигурные скобки, не обязательна.
    <Instructions> выполняются, пока счетчик <INT_Var> не больше <END_VALUE>. Это условие проверяется перед выполнением <Instructions>, поэтому раздел <Instructions> не выполняется, если <INIT_VALUE> больше <END_VALUE>.
    Всякий раз, когда выполняются <Instructions>, значение <INIT_VALUE>, увеличивается на <Step_size>."

    В моем примере, если Значение Counter уже больше 5, то почему инструкция продолжает выполняться?

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

Похожие темы

  1. Еще раз про время цикла ПЛК
    от Партизан в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 06.04.2011, 12:38
  2. не симметричный повтор цикла.
    от Artem в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 17.12.2010, 11:18
  3. Ответов: 3
    Последнее сообщение: 27.05.2009, 11:50
  4. ПЛК100 и время цикла
    от Радик в разделе ПЛК1хх
    Ответов: 15
    Последнее сообщение: 10.03.2009, 16:01

Ваши права

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