тогда два момента
почему в одном кейсе не проверять и WORKING и DONE и зачем тогда CASE вобще нужно
во вторых еще раз спрошу если DONE не наступит ни когда что будет с циклом while ?
тогда два момента
почему в одном кейсе не проверять и WORKING и DONE и зачем тогда CASE вобще нужно
во вторых еще раз спрошу если DONE не наступит ни когда что будет с циклом while ?
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Этот вопрос точно относится к обсуждаемому?
Я спрошу: вы поняли *в какой код* я предлагаю компилировать "код на паузах"?
У вас исходно было возражение: код с паузами "зациклится, подвесит ПЛК, приведёт к перезагрузке". Это возражение осталось?
По-моему, я весьма подробно описал почему код не зависнет. Нет?
Наличие или отсутствие CASE это экономия на спичках. На что влияет есть тут CASE или нет?
Есть 2 варианта:
1) Если оно будет равно ASYNC_WORKING, то state застрянет в 0 и ФБ будет возвращать управление
2) Если res окажется ни WORKING ни DONE (а хренью какой-нибудь), то, разумеется, цикл зависнет (вызовет перезагрузку ПЛК).
Но это как это относится к сути предлагаемого мною подхода?
вопрос кто это будет разворачивать, кому доверять, как КДС будет анализировать
кода еще не было когда я написал пост, "По-моему, я весьма подробно описал почему код не зависнет. Нет?" если ни WORKING ни DONE state становиться равной двум вероятность этого огромна, мне такая ПАУЗА не нужна, лучше по старинке, что то ручками написатьКод:ILE true DO CASE state OF (* и этот case тоже создал компилятор *) 0: res:=OwenFileOpenAsync(stFileName, stMode, returnvalue); IF res = ASYNC_WORKING THEN state := 0; (* CONTINUE -- значит новое состояние это "начало цикла" -- т.е. 0 *) RETURN; (* !! вернуть управление *) END_IF; (* state=1 используется из одного места -- можно не создавать отдельную case ветку *) IF res<>ASYNC_DONE THEN (* это ошмёток UNTIL res<>ASYNC_DONE *) state := 0; ELSE state := 2; END_IF; 2: RETURN; END_CASE;
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Разумеется, разворачивать будет не КДС.
Во-первых, такую ошибку легко найти визуально:
Более правильным, наверное, был бы такой вариант:Код:REPEAT res:=OwenFileOpenAsync('usb:test.dat','a',ADR(handle)); IF res = ASYNC_WORKING THEN ПАУЗА; END_IF; UNTIL res<>ASYNC_DONE (* видно, что если ни DONE, ни WORKING, то будем крутиться без пауз *) END_REPEAT;
Да, в конкретном случае одного простейшего вызова "OwenFileOpenAsync" по сути, этот код "казалось бы" ничем не отличается от простого вызова OwenFileOpenAsync.Код:WHILE TRUE res:=OwenFileOpenAsync('usb:test.dat','a',ADR(handle)); IF res < 0 OR res = ASYNC_DONE THEN EXIT; (* или RETURN -- тут не так важно *) END_IF; ПАУЗА; END_WHILE;
Но в более сложных случаях (почти во всех в реальности) нужно делать цепочки вызовов, и следующий вызов нужно начинать только как предыдущий закончится.
В итоге "на паузах" код будет простой:
А под капотом там CASE на кучу состояний. В примере ОВЕН'а там 7 состояний и 100 строк кода.Код: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;
Найти ошибку в коде ОВЕН гораздо сложнее чем в коде на паузах.
Во-вторых, можно в генерируемый код добавлять счётчик "дануна (с) Валенок".
Тогда в самой программе можно будет понять *где именно* она зациклилась.
Что говорит тов. Филоненко сейчас? "Сработала собака? Пытайтесь как-нибудь угадать в каком месте кода".
А тут же ПЛКшная собака не сработает, и можно будет подключиться в online и посмотреть в каком состоянии оно оказалось.
Последний раз редактировалось Владимир Ситников; 10.10.2017 в 15:51.
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
а почему я должен его постоянно открывать? Взять те же примеры по сетевому обмену, отдельно функция по открытию сокета, отдельно по ожиданию приема
сложные случаю, как раз таки быстро дадут понять, что паузы через бесконечные циклы не дадут работать. Не стали у меня работать быки и коровы когда я стал набирать случайными и не повторяющимися цифрами коды с помощью таких вот цикловв более сложных случаях (почти во всех в реальности)
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран