Страница 4 из 6 ПерваяПервая ... 23456 ПоследняяПоследняя
Показано с 31 по 40 из 64

Тема: ST, паузы, async/await/coroutines

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Напоминаю, что в выложенном Вами коде нет намека на дочитывание файла, не хотите принять что мой код проще Ваших замудренностей, да наздоровье
    Если вы не увидили "дочитывание" в моём примере, что ж, жаль.

    Полный пример был в 6-ом сообщении
    И смысл 6-го сообщения в том, что REPEAT там как раз и используются для "дооткрывания", "дочитывания", "дозаписывания". Во 2-ом коде 6-го сообщения эти самые REPEAT фигурируют в коде явно. В последнем же коде 6-го сообщения эти "REPEAT" просто скрыты внутри вспомогательных функций OwenFileOpenAsync2.

    Ну а в сообщении 14 я показал, что эти самые "REPEAT" не будут приводить к собакам, а раскроются компилятором в нехитрые CASE, и по факту за каждый ПЛК цикл будет очередное продвижение. Либо "дооткрывание", либо "дочитывание" и так далее.

    Да, в моём примере наверняка неправильно рассматриваются коды возвратов, но именно на механизм "дочитывания" они не влияют.

  2. #2

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    не хотите принять что мой код проще Ваших замудренностей, да наздоровье
    У вас код работает *только* для случая, когда всё чтение сработает успешно и за 1 цикл ПЛК.
    Разумеется, для такого конкретного случая ваш код проще (вернее, он визуально ничем от моего не отличается, но не суть). Да и вообще сложно придумать что-то проще 3х последовательных вызовов функции.

    Но, вместе с этим, я не согласен, что случай "дочитывания" останется "таким же кристально ясным". Поэтому и прошу: покажите как реально выглядел бы код с дочитыванием -- тогда можно будет сравнить "обычный и понятный ST код" с предлагаемым мной подходом.

    Сейчас получается интересно: я показываю своё сравнение (как обычный ST так и ST-с-паузами, "обычный код" длиннее в 6 раз, а поведение при этом абсолютно идентично), вы говорите "да это всё ненужно, обычный проще", но при этом показываете код, решающий гораздо более простую задачу.
    Последний раз редактировалось Владимир Ситников; 10.10.2017 в 19:23.

  3. #3

    По умолчанию

    Владимир Ситников, есть какие-либо продвижения в этой теме?
    Получилось ли реализовать компилятор, превращающий код на паузах в автоCASE?

  4. #4

    По умолчанию

    Владимир Ситников уже давно не появляется на форуме. Он занят куда более важными делами.

  5. #5

    По умолчанию

    Какими? (стало даже интересно...)

  6. #6

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Какими? (стало даже интересно...)
    Владимир Ситников - профессиональный программист. Для него форум ОВЕН - это легкое развлечение.

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    не понимаю этого кода. Может быть не ретурн должен использоваться ( или ФБ вместо функции), он должен выкинуть из функции, следовательно state при следующем вызове функции вновь будет равна нулю и ни когда не случиться поимка ASYNC_DONE в таком случае
    Ну, да, тут подразумевается, что "state" будет принудительно сбрасываться в 0 "только перед самым первым вызовом" и что state будет сохраняться от вызова к вызову.
    Поправил на FB.
    Последний раз редактировалось Владимир Ситников; 10.10.2017 в 14:50.

  8. #8

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    и где тогда goto ?
    Не понимаю вопроса.
    Во что компилировать (в WHILE TRUE CASE или в GOTO или ещё во что) -- вопрос не такой принципиальный.

    Тут более важен сам подход: пишем код в синхронном стиле, а оно само разворачивает в автомат.

  9. #9
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Тут более важен сам подход: пишем код в синхронном стиле, а оно само разворачивает в автомат.
    вопрос кто это будет разворачивать, кому доверять, как КДС будет анализировать

    Код:
    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;
    кода еще не было когда я написал пост, "По-моему, я весьма подробно описал почему код не зависнет. Нет?" если ни WORKING ни DONE state становиться равной двум вероятность этого огромна, мне такая ПАУЗА не нужна, лучше по старинке, что то ручками написать
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  10. #10

    По умолчанию

    Цитата Сообщение от 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 и посмотреть в каком состоянии оно оказалось.
    Последний раз редактировалось Владимир Ситников; 10.10.2017 в 15:51.

Страница 4 из 6 ПерваяПервая ... 23456 ПоследняяПоследняя

Похожие темы

  1. Ответов: 4
    Последнее сообщение: 11.05.2018, 13:01
  2. Режим паузы в ТРМ251 на прошивке 2.10
    от Brewer в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 29.03.2016, 16:10
  3. Реализация паузы в SFC
    от KoT'86 в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 05.06.2013, 21:28
  4. ПЛК63 - непонятные паузы в исполнении при опросе по 485
    от Alex_yu в разделе Помощь Разработчикам
    Ответов: 9
    Последнее сообщение: 02.07.2011, 22:54

Ваши права

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