Страница 3 из 7 ПерваяПервая 12345 ... ПоследняяПоследняя
Показано с 21 по 30 из 64

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

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

    По умолчанию

    тогда два момента
    почему в одном кейсе не проверять и WORKING и DONE и зачем тогда CASE вобще нужно
    во вторых еще раз спрошу если DONE не наступит ни когда что будет с циклом while ?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  2. #22

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    тогда два момента
    почему в одном кейсе не проверять и WORKING и DONE и зачем тогда CASE вобще нужно
    Этот вопрос точно относится к обсуждаемому?

    Я спрошу: вы поняли *в какой код* я предлагаю компилировать "код на паузах"?
    У вас исходно было возражение: код с паузами "зациклится, подвесит ПЛК, приведёт к перезагрузке". Это возражение осталось?

    По-моему, я весьма подробно описал почему код не зависнет. Нет?

    Наличие или отсутствие CASE это экономия на спичках. На что влияет есть тут CASE или нет?


    Цитата Сообщение от capzap Посмотреть сообщение
    во вторых еще раз спрошу если DONE не наступит ни когда что будет с циклом while ?
    Есть 2 варианта:
    1) Если оно будет равно ASYNC_WORKING, то state застрянет в 0 и ФБ будет возвращать управление
    2) Если res окажется ни WORKING ни DONE (а хренью какой-нибудь), то, разумеется, цикл зависнет (вызовет перезагрузку ПЛК).

    Но это как это относится к сути предлагаемого мною подхода?

  3. #23

    По умолчанию

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

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

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

    По умолчанию

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

    Код:
    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

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

  5. #25

    По умолчанию

    Цитата Сообщение от 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.

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Разумеется, разворачивать будет не КДС.
    т.е. вместо привычной записи
    Код:
    res:=OwenFileOpenAsync('usb:test.dat','a',ADR(handle));
    		IF res = ASYNC_DONE THEN
    			(* выполняем дальнейшие действия по теме *)
    		END_IF;
    в КДС будет "портянка" кода, даже если она кем то протестирована
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  7. #27

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    т.е. вместо привычной записи
    Код:
    res:=OwenFileOpenAsync('usb:test.dat','a',ADR(handle));
    		IF res = ASYNC_DONE THEN
    			(* выполняем дальнейшие действия по теме *)
    		END_IF;
    Такая запись не подойдёт, ведь, вы что, на каждый цикл ПЛК будете заново открывать файл?

    После того как он откроется его до закрытия открывать не нужно.
    Иными словами, если мы начали файл писать, то открывать его ещё раз даже вредно.

  8. #28

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    хочу вернутся на пару строк вверх
    Наверняка что-то умное, но всё равно непонятное.

  9. #29

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    так в кейсе можно шагать куда угодно
    Можно, и что?

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

    По умолчанию

    а почему я должен его постоянно открывать? Взять те же примеры по сетевому обмену, отдельно функция по открытию сокета, отдельно по ожиданию приема

    в более сложных случаях (почти во всех в реальности)
    сложные случаю, как раз таки быстро дадут понять, что паузы через бесконечные циклы не дадут работать. Не стали у меня работать быки и коровы когда я стал набирать случайными и не повторяющимися цифрами коды с помощью таких вот циклов
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

Страница 3 из 7 ПерваяПервая 12345 ... ПоследняяПоследняя

Похожие темы

  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, 22:28
  4. ПЛК63 - непонятные паузы в исполнении при опросе по 485
    от Alex_yu в разделе Помощь Разработчикам
    Ответов: 9
    Последнее сообщение: 02.07.2011, 23:54

Ваши права

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