IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Занимательные задачи, №35, Использование инструкций перехода.
Sergei Troizky
сообщение 16.03.2014 - 01:20
Сообщение #1


Гигант мысли
****

Группа: Пользователи
Сообщений: 377
Регистрация: 30.12.2004
Пользователь №: 108



В заголовке опечатка. Это- Задача №36.

Задача не требует для ответа написания какого-либо кода.
Вначале- пара цитат.
Цитата(ivgtrk @ 8.03.2014 - 14:45) *
В принципе, уже давно считается, и не только в программировании ПЛК, что использование инструкций перехода, в т.ч. вызова там, где без них можно обойтись - это моветон!

Цитата(inntele @ 8.03.2014 - 13:22) *
Согласен, что использовать переход в основной программе, если без него можно обойтись, плохо.

Не будем обсуждать, что именно гласит на этот счет теория, и почему.
Задание. Назовите, применительно именно к ПЛК:
а) Практические причины, почему инструкций перехода лучше избегать.
В том числе, конкретно для серии FX, если, на ваш взгляд, такая специфика существует.
б) Случаи, когда инструкции перехода полезны.
В том числе, конкретно для серии FX, если, на ваш взгляд, такая специфика существует.
в) Случаи, когда без инструкций перехода не обойтись. Если такие случаи вообще существуют.
Уточнение: в вопросах речь именно об инструкциях перехода, а не о вызове подпрограмм.
Ясно, что ответы будут в определенной мере субъективными и, возможно, неполными.
Соображения просуммируем, закрывая задачу.

Вопрос к inntele, по цитате.
Почему только "в основной программе"?

Реплика по теме, не связанная с заданием:
Вопреки не только теории, но и практическим ограничениям,
компилятор GX IEC Developer использует переходы напропалую, при компиляции каждого IF.
Поправьте, если неправ, но именно так мне показалось, из недолгого с ним знакомства.
И это при том, что в LD каждый rung по определению- структура IF ELSE.

Сообщение отредактировал Sergei Troizky - 16.03.2014 - 02:32


--------------------
Делать надо сразу хорошо. Плохо само получится.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
inntele
сообщение 16.03.2014 - 07:35
Сообщение #2


Гуру
******

Группа: Пользователи
Сообщений: 1000
Регистрация: 19.08.2009
Пользователь №: 9149



Цитата(Sergei Troizky @ 16.03.2014 - 03:20) *
Вопрос к inntele, по цитате.
Почему только "в основной программе"?

Я неясно выразил то, что хотел донести этой фразой.
Инструкции перехода вообще следует применять крайне аккуратно во всей программе, а, по возможности, стараться и вовсе избегать их применения. По отношению же к основной (головной) программе это особенно важно: помимо проблем с превышением времени скана, к которым способны привести переходы "назад" и перекрещенные переходы, бездумное использование данных команд способно повлечь потерю читабельности программы. В тех же случаях, когда без этих команд не обойтись, просто необходимо прибегать к нехитрым правилам, быть осмотрительным и предварительно прокручивать программный код в голове.

Цитата(Sergei Troizky @ 16.03.2014 - 03:20) *
Реплика по теме, не связанная с заданием:
Вопреки не только теории, но и практическим ограничениям,
компилятор GX IEC Developer использует переходы напропалую, при компиляции каждого IF.
Поправьте, если неправ, но именно так мне показалось, из недолгого с ним знакомства.
И это при том, что в LD каждый rung по определению- структура IF ELSE.

Это не так.


--------------------
Мозг любого человека работает круглосуточно. Но мозг инженера отличается тем, что способен при этом проанализировать задачу, синтезировать несколько техничных ее решений, а затем выбрать из этих решений наилучшее.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ivgtrk
сообщение 16.03.2014 - 11:34
Сообщение #3


Гигант мысли
****

Группа: Пользователи
Сообщений: 459
Регистрация: 5.02.2014
Пользователь №: 10203



(#36)
а) ну во первых, как уже говорилось - это влияет на читабельность самой программы. Во вторых, действительно, необходимо внимательно контролировать их применение и достаточно точно представлять, как эти конструкции будут работать. Ибо в некоторых ситуациях, с использованием переходов (касательно ПЛК), могут возникнуть ошибки.
Само по себе, применение условных переходов позволяет писать некие программы, которые "могут принимать решения", на основании тех или иных входящих условий. В этом, пожалуй, и заключается основаная суть применения переходов. В ПЛК же, имеется масса, скажем так, более "наглядных" способов это осуществить, не прибегая к CJ.

б) особых таких случаев на первый взгляд не вижу. Ну разве что возможность пропуска частей программы, возможность дублирования выходов... Но опять же, все это упирается в грамотную реализацию переходов в программе.

в) если такие случаи и есть, то я покамест с такими ситуациями не сталкивался. Если провести параллель с другими яз. программирования, то да, встречались ситуации, где без перехода не обойтись, и то(!) - это скорее "псевдо"- необходимость, дабы не увеличивать код, прибегая к различным уловкам и т.п.

Цитата
И это при том, что в LD каждый rung по определению- структура IF ELSE.

Хм... Если это так, то невижу логики такого подхода.

Конструкция IF [условие] если TRUE, то
- CASE 1;
ELSE (если FALSE)
- CASE 2;
END IF

тоже является инструкцией условного перехода по событию, однако, сама форма представления ее, явно более понятна, чем "прыжки" по программе инструкциями CALL, GOTO, ну и CJ (ПЛК). Конечно это справедливо для тех случаев, когда в тело (CASE) включена некая последовательность явно описанных команд, а не ссылка (читай - переход) в некую область основной программы.

Кстати, это навело меня на еще одну, не менее интересную мысль. Касательно инструкций FOR-NEXT, именно применительно к ПЛК, т.к. сама по себе выполняемая программа в нем циклична. Вот здесь уже напрашивается некий компромисс, между возможностью применения этой комбинации, что безусловно задерживает основной цикл программы, или же возложить команды, которые находятся внутри FOR-NEXT на обработку самой "цикличной" программы ПЛК. Но все зависит от потребностей, конечно.

Сообщение отредактировал ivgtrk - 17.03.2014 - 06:19


--------------------
Никому никогда ничего не объясняйте — каждый всё равно поймёт так, как ему выгодно.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
m_by
сообщение 17.03.2014 - 09:33
Сообщение #4


Гигант мысли
****

Группа: Пользователи
Сообщений: 252
Регистрация: 15.11.2007
Пользователь №: 6407



а) "Перепрыгнутые" куски кода не отрабатывают, но показывают текущее (или последнее) состояние.
В своё время пришлось отказаться от "прыжков", коллеги не могли корректно проводить диагностику отказов, без знания архитектуры досконально.
б) Выполнение долгой (десятки секунд) цикличной регламентной процедуры (упаковки данных), с приращением на каждом скане.
Реализация обусловлена "сторожем".
в) Тело программы состоит из "тяжелых кусков" вычислений и действий для различных режимов. Для уменьшения времени скана - выполняются только "куски" для конкретного режима.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ivgtrk
сообщение 17.03.2014 - 10:38
Сообщение #5


Гигант мысли
****

Группа: Пользователи
Сообщений: 459
Регистрация: 5.02.2014
Пользователь №: 10203



Цитата(m_by @ 17.03.2014 - 13:33) *
а) "Перепрыгнутые" куски кода не отрабатывают, но показывают текущее (или последнее) состояние.
В своё время пришлось отказаться от "прыжков", коллеги не могли корректно проводить диагностику отказов, без знания архитектуры досконально.
б) Выполнение долгой (десятки секунд) цикличной регламентной процедуры (упаковки данных), с приращением на каждом скане.
Реализация обусловлена "сторожем".
в) Тело программы состоит из "тяжелых кусков" вычислений и действий для различных режимов. Для уменьшения времени скана - выполняются только "куски" для конкретного режима.

а) верно! причем имеются еще некоторые дополнительные нюансы, связанные, например, с применением таймеров в "перепрыгнутом" куске программы.
б) и в) :
Цитата
В ПЛК же, имеется масса, скажем так, более "наглядных" способов это осуществить, не прибегая к CJ.

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

(развиваю мысль smile.gif)


--------------------
Никому никогда ничего не объясняйте — каждый всё равно поймёт так, как ему выгодно.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Sergei Troizky
сообщение 21.03.2014 - 07:28
Сообщение #6


Гигант мысли
****

Группа: Пользователи
Сообщений: 377
Регистрация: 30.12.2004
Пользователь №: 108



Цитата(inntele @ 16.03.2014 - 07:35) *
Цитата(Sergei Troizky @ 16.03.2014 - 03:20) *
Реплика по теме, не связанная с заданием:
Вопреки не только теории, но и практическим ограничениям,
компилятор GX IEC Developer использует переходы напропалую, при компиляции каждого IF.
Поправьте, если неправ, но именно так мне показалось, из недолгого с ним знакомства.
И это при том, что в LD каждый rung по определению- структура IF ELSE.

Это не так.

А как же вот это? http://www.melsec.ru/forum/index.php?showt...&#entry5666
Сообщения №3 и №6.



--------------------
Делать надо сразу хорошо. Плохо само получится.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Sergei Troizky
сообщение 21.03.2014 - 07:38
Сообщение #7


Гигант мысли
****

Группа: Пользователи
Сообщений: 377
Регистрация: 30.12.2004
Пользователь №: 108



Цитата(ivgtrk @ 17.03.2014 - 10:38) *
... ничто не мешает вынести "тяжелые куски" вычислений в отдельный POU, и вызывать его при необходимости.

В откомпилированном IL, это и будет означать либо подпрограмму, либо обход фрагмента программы путем CJP. То же самое и применительно к IF-ELSE, либо IF-CASE-...
Вопрос в задаче не относился к языкам высокого уровня.

Сообщение отредактировал Sergei Troizky - 21.03.2014 - 08:18


--------------------
Делать надо сразу хорошо. Плохо само получится.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
inntele
сообщение 21.03.2014 - 08:51
Сообщение #8


Гуру
******

Группа: Пользователи
Сообщений: 1000
Регистрация: 19.08.2009
Пользователь №: 9149



Цитата(Sergei Troizky @ 21.03.2014 - 09:28) *
Цитата(inntele @ 16.03.2014 - 07:35) *
Цитата(Sergei Troizky @ 16.03.2014 - 03:20) *
Реплика по теме, не связанная с заданием:
Вопреки не только теории, но и практическим ограничениям,
компилятор GX IEC Developer использует переходы напропалую, при компиляции каждого IF.
Поправьте, если неправ, но именно так мне показалось, из недолгого с ним знакомства.
И это при том, что в LD каждый rung по определению- структура IF ELSE.

Это не так.

А как же вот это? http://www.melsec.ru/forum/index.php?showt...&#entry5666
Сообщения №3 и №6.

Не сразу понял, что речь шла об ST, которым принципиально не пользуюсь.
В этом плане могу заметить следующее:
1) Точно так же, как лингвальный перевод с одного языка, которым пользуются люди для общения между собой, на другой сильно зависит от ментальности и квалификации переводчика, так и результат компиляции с языка, далекого от языка ПЛК, на язык, понятный контроллеру, целиком и полностью зависит от программиста, который этот компилятор прописал. Тот кто писал, очевидно полагал, что способ компиляции, реализованный им, суперский, не обращая при этом внимание на издержки, связанные с реализованным им способом.
2) В ветке шло обсуждение проблем с компиляцией структур языка ST в очень старой версии GX IEC Developer v7.01. За истекшее время вышло несколько новых версий, последняя из выпущенных v7.04. Техника компиляции во вновь вышедших версиях, как правило, отличается от предшествующих, в чем можно убедиться , если зайти в меню Extras-Options-Project Options-Code Generation. Так что, возможно, "косяк" компилятора, который обсуждался вами в топике, уже не актуален.

Самое лучшее - владеть языком оригинала/писать в синтаксисе контроллера. Тогда промежуточное звено со своими "тараканами" в голове не будет мешать правильно доносить мысли.

Сообщение отредактировал inntele - 21.03.2014 - 08:52


--------------------
Мозг любого человека работает круглосуточно. Но мозг инженера отличается тем, что способен при этом проанализировать задачу, синтезировать несколько техничных ее решений, а затем выбрать из этих решений наилучшее.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ivgtrk
сообщение 22.03.2014 - 07:18
Сообщение #9


Гигант мысли
****

Группа: Пользователи
Сообщений: 459
Регистрация: 5.02.2014
Пользователь №: 10203



Цитата(Sergei Troizky @ 21.03.2014 - 11:38) *
Цитата(ivgtrk @ 17.03.2014 - 10:38) *
... ничто не мешает вынести "тяжелые куски" вычислений в отдельный POU, и вызывать его при необходимости.

В откомпилированном IL, это и будет означать либо подпрограмму, либо обход фрагмента программы путем CJP.

И тем не менее, это является один из подходов к разбиению основной программы на выполняемые по условию части.
В вопросе (видимо) не рассматривается, как именно компилятор реализует обход, а имелось в виду явное применение CJ программистом.

Сообщение отредактировал ivgtrk - 22.03.2014 - 07:19


--------------------
Никому никогда ничего не объясняйте — каждый всё равно поймёт так, как ему выгодно.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Sergei Troizky
сообщение 26.03.2014 - 06:28
Сообщение #10


Гигант мысли
****

Группа: Пользователи
Сообщений: 377
Регистрация: 30.12.2004
Пользователь №: 108



Выскажу свои соображения.
Инструкции перехода демонизировать не стоит.
Будь они слишком вредны, нашли бы способ вообще обойтись без них.
Разумеется, злоупотреблять ими не стоит, но так можно сказать о чем угодно.

Соображения об ухудшении читабельности программы мне кажутся несостоятельными. Не отказываемся же мы из этих соображений от подпрограмм, хотя вызов подпрограммы и возврат из нее- те же самые переходы, к тому же последний не содержит явно указанного адреса.
Для читабельности гораздо важнее общая структура программы и тщательное комментирование, особенно нестандартных приемов и неочевидной логики в работе оборудования.

Суммируя плюсы и минусы переходов:

Переходы назад- единственный, кроме FOR-NEXT, способ реализовать програмно любые виды циклов внутри скана.
Однако, слишком массивные либо слишком многопроходные циклы удлиняют скан, вплоть до срабатывания сторожевого таймера и остановки ПЛК.

Переходы вперед- способ обхода ненужного в данный момент фрагмента программы, для сокращения времени скана, либо для полного его исключения из выполняемой логики (напр. в силу конфигурации конкретного оборудования с универсальной программой).
Это- альтернативный способ организовать POU, наряду с подпрограммами.

При обходе фрагмента программы, последний не выполняется, что может вызвать затруднения с диагностикой при мониторинге.
Однако, эта проблема существует при любой технике программирования, где фрагмент кода может не выполняться непрерывно. А именно- подпрограммы, включая прерывания, и состояния STL.

Напоследок, небольшой экскурс на тему переходов, но отойдя от ПЛК
(не претендуя на полноту и академическую строгость).
Согласно теории, для алгоритмической полноты языка программирования, наличие в нем инструкций перехода необязательно.
На уровне кода микропроцессора, команды перехода сбивают работу кэша (конвеерной памяти), снижая тем самым производительность.
В хорошо структурированных языках высокого уровня, использование переходов считается излишним. Спешу добавить, что IL/LD к таковым никак не относится.

Сообщение отредактировал Sergei Troizky - 26.03.2014 - 06:30


--------------------
Делать надо сразу хорошо. Плохо само получится.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ivgtrk
сообщение 29.03.2014 - 15:43
Сообщение #11


Гигант мысли
****

Группа: Пользователи
Сообщений: 459
Регистрация: 5.02.2014
Пользователь №: 10203



Цитата(Sergei Troizky @ 26.03.2014 - 10:28) *
Соображения об ухудшении читабельности программы мне кажутся несостоятельными. ...

Полностью солидарен. Тем более, если учесть, что наши программы, написанные для управления теми или иными процессами, скажем так - не для посторонних глаз, ибо являются предметом личного труда, опыта, ну а так же элементом коммерческой ценности.

Цитата(Sergei Troizky @ 26.03.2014 - 10:28) *
Переходы вперед- способ обхода ненужного в данный момент фрагмента программы, для сокращения времени скана, либо для полного его исключения из выполняемой логики (напр. в силу конфигурации конкретного оборудования с универсальной программой).
Это- альтернативный способ организовать POU, наряду с подпрограммами.

Пожалуй, это единственный пример целесообразного применения переходов (в данном случае, с ПЛК).

Цитата(Sergei Troizky @ 26.03.2014 - 10:28) *
На уровне кода микропроцессора, команды перехода сбивают работу кэша (конвеерной памяти), снижая тем самым производительность.

Отнюдь, не всегда.

Цитата(Sergei Troizky @ 26.03.2014 - 10:28) *
В хорошо структурированных языках высокого уровня, использование переходов считается излишним. Спешу добавить, что IL/LD к таковым никак не относится.

Совершенно верно.


--------------------
Никому никогда ничего не объясняйте — каждый всё равно поймёт так, как ему выгодно.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 25.04.2024 - 15:28