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

Тема: Цикл WHILE

  1. #1

    Unhappy Цикл WHILE

    Добрый день.

    Столкнулся с проблемой.

    Не работает цикл While в коде (но работал в режиме эмуляции).

    Используется ПЛК 200-01-CS.

    Речь идет про подобные куски кода:


    Суть следующая: приходит оператор, устанавливает несколько точек нагрева с удержанием в определенный промежуток времени при достижении уставки.

    Значения, заданные оператором, с помощью оператора case и переменной изменения индекса этого самого case, все время хранятся в одной переменной, что позволяет корректно выполняться программе.

    Если углубляться в работу, то установил оператор 2 уставки и задал время поддержания для каждой:
    200 градусов 30 секунд
    100 градусов 20 секунд
    300 градусов 10 секунд

    ПИД регулятор доводит температуру до 200, в течении 30 секунд поддерживает ее, после чего отключается.
    Температура падает до 100. Как только значение текущей температуры <= 100, то запускается очередной таймер, но уже на 20 секунд.
    После чего, температура вновь начинает расти до 300 градусов и держится 10 секунд.

    И как раз таки, когда оператор указал температуру на понижение, то этот while позволяет мне удерживать цикл и не идти дальше...

    Не могу решить проблему, потратил уже невероятно много времени.

    Программированием недавно начала заниматься, поэтому за код не осуждайте(

    Была задача, нужно было сделать, начал разбираться в программирование - дошел до этого.

    Прикладываю частичную демонстрацию работу:
    https://vk.com/video/@eugenemoor99?z...l_463512182_-2
    https://vk.com/video/@eugenemoor99?z...l_463512182_-2

    Буду рад любой помощи. Возможно кто-то сможет помочь за оплату. Прикладываю проект в том числе...
    Вложения Вложения
    Последний раз редактировалось EugeneMoor; 14.08.2024 в 20:11. Причина: Добавлениеи архива с программой

  2. #2

    По умолчанию

    Не нравится мне вайл... Может переделать на то что внутри на иф зэн, а то что снаружи на элсэ...?

  3. #3

    По умолчанию

    Думаю удерживать автомат CASE на данном шаге, с помощью WHILE, это плохая идея. Автомат и так будет стоять на данном шаге, пока вы не сделаете управление шагом +1. Точнее программа будет работать, а шаг стоять.
    Вот тут вам и надо думать. Предусмотреть все условия перехода. А WHILE вообще все выкинуть.
    Последний раз редактировалось kondor3000; 14.08.2024 в 22:33.

  4. #4

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Думаю удерживать автомат CASE на данном шаге, с помощью WHILE, это плохая идея. Автомат и так будет стоять на данном шаге, пока вы не сделаете управление шагом +1. Точнее программа будет работать, а шаг стоять.
    Вот тут вам и надо думать. Предусмотреть все условия перехода. А WHILE вообще все выкинуть.
    У ТС шаг прибавляется перед case... Это условие надо тоже внутрь IF ... THEN ... ELSE перемещать. А во-вторых, программа сильно громадная, ее надо сворачивать в условие FOR, реально ее в 5 раз уменьшить. Очень много лишних операций, вернее даже однотипных.

    PS Например так (писалось в блокноте, надо проверять):
    Код:
        IF tempReached = TRUE and not bit_x THEN
    		bit_x:= TRUE; //бит, чтобы обрабатывать только один раз, после надо его снова сделать ложью
            flagOne:=false;
            holdingTimer(IN := FALSE, PT := T#0S);
            //currentTempIndex := currentTempIndex + 1; - это тут не надо
    		currentTempIndex := 1; //как раз для первого опроса сойдет
    	end_if
    	t_ix:= t[currentTempIndex];//Массив температур
        IF t_ix > 0 and currentTempIndex <= 10 THEN
    		    IF t_ix < xAi6 THEN 
                    integral := 0.0;
                    previousError := 0.0;
                    xAo1 := 0;
                    timerPID(IN := FALSE);
                    mainflag:=true;            
    			else
    				mainflag:=false;
                    tempReached:=false;
                    targetTemp := t_ix; 
                    holdingTime := TimeForCalibration; 
                    tempReached:=FALSE;
    				currentTempIndex := currentTempIndex + 1;				
                END_IF
    	elsif currentTempIndex > 10 
                timerPID(IN := FALSE, PT := T#0s);
                TimeHeat(IN := FALSE, PT := T#0s);
                //holdingTimer(IN := FALSE, PT := T#0s);
                Calibration:=false;
                xAo1:=0;
                integral := 0.0;
                previousError := 0.0;
                //currentTempIndex:=1;
                MassiveForCalibration:=1;
                mainflag:=false;
    			bit_x:= FALSE;////////////////////////////
    	end_if
    Последний раз редактировалось МихаилГл; 15.08.2024 в 05:05.

  5. #5

    По умолчанию

    Спасибо! Сегодня попробую

  6. #6

    По умолчанию

    1. Я позволю себе напомнить то, что в ПЛК программа выполняется так:
    * Получает все входы
    * Выполняет код программы
    * Выдаёт то, что получилось, на выходы
    То есть, WHILE в ПЛК прокрутится СРАЗУ и ЦЕЛИКОМ за один цикл работы ПЛК. Без промежуточных итераций.
    Он не будет, как в СИ, крутиться постоянно.

    2. Я тут вижу таймер timerPID. Он вызывается с IN = FALSE, но тогда, когда его надо остановить.
    А где он вызывается для того, чтобы он РАБОТАЛ?
    Может быть поможет подзаголовок 7 моей статьи: https://cs-cs.net/funkciya-fun-i-fun...n_tof_tp_blink
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  7. #7
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,799

    По умолчанию

    Цитата Сообщение от EugeneMoor Посмотреть сообщение
    Добрый день.

    Столкнулся с проблемой.

    Не работает цикл While в коде
    Программированием недавно начала заниматься, поэтому за код не осуждайте(
    Забудьте вообще про циклы, это для опытных, тем более путь решения задачи через CASE выбран правильно, но с организацией цикла получилась полная каша.
    При организации конечного автомата управление указателем производится из Стэйта, а на сначала, как у вас, повторяю у вас полный не рабочий говнокод. Учится и осваивать надо поступательно, а не все сразу.

  8. #8

    По умолчанию

    Всем спасибо. Я справился. Сделал
    if flagOne = true then
    HoldingTimer (IN := TRUE, PT := holdingTime); // Запуск таймера поддержания
    IF HoldingTimer.ET > T#90S THEN
    CollectionTimer(IN := TRUE, PT := T#1S);
    if CollectionTimer.Q = true then
    targetMassive[Index] := xAi7;
    Index := Index + 1;
    CollectionTimer(IN := FALSE);
    end_if
    end_if
    if HoldingTimer.Q = true THEN
    tempReached := TRUE;
    massiveReacher:=true;
    currentTempIndex := currentTempIndex + 1;
    end_if
    end_if

    IF tempReached = TRUE THEN
    CASE currentTempIndex OF
    2: IF t2 > 0 THEN
    IF (T2<xAi6) THEN
    integral := 0.0;
    previousError := 0.0;
    xAo1 := 0;
    // Остановка таймера PID
    timerPID(IN := FALSE);
    mainflag:=true;
    holdingTimer(IN := FALSE);
    holdingTime := TimeForCalibration;
    elsif (xAi6 <= T2) or (xAi6 <= targetTemp) then
    targetTemp := t2;
    holdingTimer(IN := FALSE);
    holdingTime := TimeForCalibration;
    flagOne:=false;
    mainflag:=false;
    tempReached:=FALSE;
    end_if
    END_IF

  9. #9

    По умолчанию

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

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

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Во! Прям по моей статье: и циклы, которые работают не так, как в компьютерах, и вызовы таймеров в условиях. Были!
    Молодец, здорово! Поздравляю!
    С чем? 20 переменных на 40 строк одного блока? Юзать автомат а менять его где-то в бубенях (см.пост#7)?
    С IF'ом вложенным в IF вложенным в CASE вложенным в IF? Глубина вложения не ограничена, чо.

    Цитата Сообщение от EugeneMoor Посмотреть сообщение
    Я справился. Сделал
    Сделал. Как-то работает. Даихусим. Зачем только было показывать?

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

Похожие темы

  1. Цикл на языке ST
    от servo в разделе ПЛК1хх
    Ответов: 17
    Последнее сообщение: 06.06.2019, 16:00
  2. Цикл Трм-138
    от lunyov_i в разделе Эксплуатация
    Ответов: 7
    Последнее сообщение: 01.12.2018, 12:29
  3. Цикл программы в ПЛК
    от Serjay в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 01.12.2017, 08:48
  4. В ФБ ST не компилируется цикл FOR
    от M_321 в разделе Master SCADA 3
    Ответов: 8
    Последнее сообщение: 22.11.2017, 17:22
  5. Главный цикл
    от fzr125 в разделе ПЛК1хх
    Ответов: 22
    Последнее сообщение: 16.06.2014, 05:44

Ваши права

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