задержка цикла структурированного текста plc - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь создать цикл, где он будет начинаться с 100 и падать до тех пор, пока не достигнет точки, в которой условие while больше не выполняется.

Я начал с

While Solar_Power_House_W_Solar_PER <= OneHundred AND BatChargePercent < OneHundred DO
    State_Dis_Charge := false
    FOR PLC_SetLoopChargeValue:= 100 TO 0 By -1  DO
        ConvertoReal   := INT_TO_LREAL(PLC_SetLoopChargeValue);
        Divide         := ConvertoReal DIV(100);
        PLC_SetCharge  := Divide;         
        PLC_Charge     := 1500 * PLC_SetCharge; 
        RB_Charge      := PLC_Charge;
        Visual_RBPower := 1500 * PLC_SetCharge;    (*Charge *) 
    END_FOR;

Я считаю, что проблема с этим заключается в том, что он работает слишком быстро, поэтому условие никогда не выходит из цикла while, поскольку системе требуется некоторое время.чтобы обновить, я подумал о добавлении части задержки:

While Solar_Power_House_W_Solar_PER <= OneHundred AND BatChargePercent < OneHundred DO
    State_Dis_Charge := false;
    wait(IN:=not wait.Q , PT:=T#50ms);
    if Wait.Q Then 
        FOR PLC_SetLoopChargeValue:= 100 TO 0 By -1  DO
            ConvertoReal   := INT_TO_LREAL(PLC_SetLoopChargeValue);
            Divide         := ConvertoReal DIV(100);
            PLC_SetCharge  := Divide;         
            PLC_Charge     := 1500 * PLC_SetCharge; 
            RB_Charge      := PLC_Charge;
            Visual_RBPower := 1500 * PLC_SetCharge;    (*Charge *) 
        END_FOR; 
    END_IF;
END_WHILE;     

Как я думаю, это должно работать, каждые 50 мс 1 цикл должен работать.В настоящее время ничего не происходит каждые 50 мс.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

С этим ответом я только обращаюсь к вашей проблеме с циклом for, который не выполняется каждые 50 мс.Другие ответы, почему нельзя завершить цикл while, верны, если только переменные Solar_Power_House_W_Solar_PER и BatChargePercent не изменены в потоке parrellel.

Я предлагаю wait - это функциональный блок TON.Обратите внимание, что имена FB чувствительны к регистру: wait.Q возможно не равно Wait.Q.Я думаю, что это основная причина, по которой ваш цикл for не выполняется, потому что вы проверяете вывод другого FB.Может быть, проверьте ваш список объявлений для двойников с более высокими или строчными буквами.

Другая возможность состоит в том, что ваше условие для цикла while не выполняется вообще, и вы не заметили.В этом случае цикл for тоже не будет выполнен.

0 голосов
/ 05 декабря 2018

Вы должны учитывать, что WHILE и FOR выполняются синхронно.Это означает блокировку.Это означает, что интерпретатор не выполняет следующую строку, пока предыдущая строка не будет закончена.

  1. Это означает, что «бегать быстро» здесь не применимо.Неважно, насколько быстро он работает, выполнение строк будет всегда в порядке.

  2. Единственное, что я хотел бы изменить и сделать цикл не со 100 до 0, а наоборот с 0 до 100, потому что я не уверен, что этот обратный ход будет работать нормально.И затем все, что вам нужно изменить:

    ConvertoReal   := INT_TO_LREAL(100 - PLC_SetLoopChargeValue);
    
  3. Теперь вы показываете весь код, который ОЧЕНЬ ТРУДНО судить, но если FOR ткацкий станок завершен, это совершенно бессмысленно.Вы вычисляете некоторые переменные, но не используете их там.Вы знаете, что вы не можете использовать их вне вашей FOR петли, верно?Поскольку вне вашего цикла FOR эти переменные всегда будут одинаковыми со значением последнего цикла.

  4. Во втором примере ваш цикл FOR, хотя он может работать, вам не следует использоватьтаймер для запуска цикла внутри цикла.Поскольку циклы являются синхронными, а время асинхронным.

  5. Как я понимаю, ваша задача вам вообще не нужна WHILE.При таком подходе выполнение вашей программы другими частями будет заблокировано до 100%.Это может занять некоторое время, как я вижу.Поэтому вы должны использовать IF.

    IF Solar_Power_House_W_Solar_PER <= OneHundred AND BatChargePercent < OneHundred DO
        // ....
    END_IF;
    

    Разница значительна.С WHILE он будет блокировать вашу программу до конца WHILE, и другие части не будут выполняться так долго, в одном и том же цикле ПЛК FOR может выполняться много раз.

    С IFif будет запускаться FOR один раз за один цикл ПЛК, и фактически это не изменит вашу логику.

  6. Если вы поделитесь своим полным кодом или хотя бы частями, в которых используются переменные, которые у вас здесь используютсятак что вся картина видна, вы можете получить лучшую помощь.Отредактируйте свой пост, и я отредактирую свой комментарий.

...