
Сообщение от
capzap
вопрос кто это будет разворачивать, кому доверять, как КДС будет анализировать
Разумеется, разворачивать будет не КДС.

Сообщение от
capzap
кода еще не было когда я написал пост, "По-моему, я весьма подробно описал почему код не зависнет. Нет?" если ни WORKING ни DONE state становиться равной двум вероятность этого огромна, мне такая ПАУЗА не нужна, лучше по старинке, что то ручками написать
Во-первых, такую ошибку легко найти визуально:
Код:
REPEAT
res:=OwenFileOpenAsync('usb:test.dat','a',ADR(handle));
IF res = ASYNC_WORKING THEN
ПАУЗА;
END_IF;
UNTIL res<>ASYNC_DONE (* видно, что если ни DONE, ни WORKING, то будем крутиться без пауз *)
END_REPEAT;
Более правильным, наверное, был бы такой вариант:
Код:
WHILE TRUE
res:=OwenFileOpenAsync('usb:test.dat','a',ADR(handle));
IF res < 0 OR res = ASYNC_DONE THEN
EXIT; (* или RETURN -- тут не так важно *)
END_IF;
ПАУЗА;
END_WHILE;
Да, в конкретном случае одного простейшего вызова "OwenFileOpenAsync" по сути, этот код "казалось бы" ничем не отличается от простого вызова OwenFileOpenAsync.
Но в более сложных случаях (почти во всех в реальности) нужно делать цепочки вызовов, и следующий вызов нужно начинать только как предыдущий закончится.
В итоге "на паузах" код будет простой:
Код:
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));
END_WHILE;
А под капотом там CASE на кучу состояний. В примере ОВЕН'а там 7 состояний и 100 строк кода.
Найти ошибку в коде ОВЕН гораздо сложнее чем в коде на паузах.
Во-вторых, можно в генерируемый код добавлять счётчик "дануна (с) Валенок".
Тогда в самой программе можно будет понять *где именно* она зациклилась.
Что говорит тов. Филоненко сейчас? "Сработала собака? Пытайтесь как-нибудь угадать в каком месте кода".
А тут же ПЛКшная собака не сработает, и можно будет подключиться в online и посмотреть в каком состоянии оно оказалось.