Сообщение от
capzap
в этом коде. Если максимум цикла например две секунды, а бибка вернет DONE только после третьей, плк уйдет в перегрузку
Слушайте, ну неужто вы меня подозреваете в непонимании watchdog механизма?
Прочитайте, пожалуйста, ещё раз 1-е сообщение в этой теме. Я же написал, что "команда ПАУЗА" будет компилироваться в CASE-автомат.
Касательно вашего возражения: команда "ПАУЗА" как раз и будет приводить к выходу в основной цикл.
Как раз в моём REPEAT цикле пауза есть:
Код:
REPEAT
res:=OwenFileOpenAsync('usb:test.dat','a',ADR(handle));
IF res = ASYNC_WORKING THEN
ПАУЗА; <--- ВОТ ОНА, ПАУЗА!!!
END_IF;
UNTIL res<>ASYNC_DONE
END_REPEAT;
Как раз, если OwenFileOpenAsync вернуло ASYNC_WORKING, то это означает, что функция ещё не доработала и нам нужно вернуть управление в ПЛК и пробовать в следущий раз.
Именно это ПАУЗА и сделает. Она вернёт управление в ПЛК, а при следующем вызове мы продолжим как раз с этого момента.
К слову, если возвращаемых значений более чем 2 (ASYNC_WORKING / ASYNC_DONE), то это не меняет саму суть.
Использовать примерно так:
Код:
PROGRAM PLC_PRG
VAR
i: INT;
filesCreated: INT;
END_VAR
i := i+1;
(* Т.е. в основном цикле ПЛК пинаем программу FileWriteRead, она продвигается (или не продвигается) и тут же возвращает управление нам *)
ВЫПОЛНИТЬ_ШАГ FileWriteRead;
filesCreated := FileWriteRead.cntr;
END_PROGRAM
ASYNC PROGRAM FileWriteRead
VAR_OUTPUT
cntr: INT;
END_VAR;
WHILE TRUE
res := OwenFileOpenAsync2('usb:test.dat','a',ADR(handle));
IF res<0 OR handle=0 THEN
CONTINUE; (* ошибка, поехали сначала *)
END_IF
res := OwenFileWriteAsync2(handle,ADR(bufout),14,ADR(result));
IF result=14 THEN
res := OwenFileReadAsync2(handle,ADR(bufin),14,ADR(result));
END_IF;
res := OwenFileCloseAsync2(handle,ADR(result));
cntr := cntr+1;
END_WHILE;
END_PROGRAM;