Как из программы SFC получить компактный код LD?

Автоматизация технологических процессов, системы управления, АСУ ТП, АСКУЭ, программирование ПЛК, человеко-машинный интерфейс, сетевое оборудование, протоколы
Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Как из программы SFC получить компактный код LD?

Сообщение Михайло »

Вопрос ко всем форумчанам. Вот у нас есть SFC:
Изображение

Меня давным давно интересует вопрос, можно ли разработать методику, которая позволит из этого рисунка получить минимальное число LD-цепочек? Вопрос, конечно, спортивно-академический, но все же...

Я знаю методику получения некомпактного LD. В мозгу крутятся несколько правил, которые позволят избавиться от нескольких цепочек...

Кто-нибудь думал об этом?

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Как из программы SFC получить компактный код LD?

Сообщение Автоматизатор »

Спортивно-академический - это вопрос не ко мне. Я считаю, что реализация должна быть:
- понятной (легко объяснить как все работает),
- информативной, наглядной (просто отследить работу)
- легко отлаживаться (быстрое нахождение сбоев, ошибок),
- легко модернизироваться (типовй случай при ПНР)
- экономной (занимать меньше объема, ресурсов ЦПУ и т.п.)

Т.е. это последний пункт по важности.

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

Михайло писал(а):Меня давным давно интересует вопрос, можно ли разработать методику, которая позволит из этого рисунка получить минимальное число LD-цепочек?
Методика точно есть, видел не так давно... Даже пытался применить на один объект. Получилось вообще здоровски. Пока не попытался исправить обнаруженную ошибочку...
В общем, полученная абсолютно нечитабельная каша, которая почему-то дает вроде бы верные ответы, не возбуждает на поиск места ошибки и её исправление. Поэтому я думаю, что с практической точки зрения, если нет проблем по доступной памяти, по скорости исполнения, подобные извращения смысла не имеют, а вот времени отжирают неслабо /имел таких проблем, когда начинал самостоятельно программы писать; неделями шлифовался набор команд, вычитывался и полировался код, применялось немало трюков вплоть до того, что был задействован переход в середину двухбайтной команды - так адрес перехода становился кодом команды/. Т.е. разве что ради развлечения /если времени свободного много/ или головоломки /опять же, если времени много/.

Аватара пользователя
san
Специалист
Сообщения: 117
Зарегистрирован: 13 окт 2012, 17:17
Откуда: Киев
Контактная информация:

Re: Как из программы SFC получить компактный код LD?

Сообщение san »

а в чём проблема-то? Переменная STEP в 5-ти значениях 0-4. Далее:
-|STEP=0|-----|SB1|----|NOT SQ1|-------(S **)--------
|---(STEP=1)---------
Что-то в этом роде. Реализация зависит от ПЛК. Вместо STEP=1 будет какой-то MOVE, вместо контактов может быть какой-то EQ, и т.д. Но идея то от этого не меняется. Автоматный подход - он и в африке автоматный подход.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как из программы SFC получить компактный код LD?

Сообщение Михайло »

Ну я могу назвать такой достаточный признак того, что данный алгоритм, написанный на SFC, будет иметь достаточно компактный аналог на LD. Признаком является малое количество состояний и большое число переходов. Ну и еще один признак: большое количество дивергенций (разветвлений) в расчете на одно состояние.

Практическая значимость этой методики могла бы состоять в совершенствовании процесса разработки программы на языке LD - процесс можно было бы построить по схеме:
1. Разработка SFC
2. Трансляция алгоритма в LD
3. Оптимизация
Предложение касается только сложных алгоритмов, для простых алгоритмов подход "хрясь и готово" будет более практичным.

При всем этом я считаю, что пункт №3 нужно осуществлять либо очень тщательно и до конца (пока цепочки LD не покажутся до смешного простыми), либо не проводить совсем, чтобы не нарушить ряд требований:
Автоматизатор писал(а):реализация должна быть:
- понятной (легко объяснить как все работает),
- информативной, наглядной (просто отследить работу)
- легко отлаживаться (быстрое нахождение сбоев, ошибок),
- легко модернизироваться (типовй случай при ПНР)
- экономной (занимать меньше объема, ресурсов ЦПУ и т.п.)

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

В общем, немного теории что ли...

Правильная оптимизация осуществляется примерно по следующей схеме:
1. Разрабатывается правильно работающий алгоритм, готовится работающая функция. Плевать на все: на размеры, на скорость, на красоту кода, на читабельность... На все. Главное требование - правильно работающая. Не иногда правильно работающая, а на всем возможном диапазоне входных состояний. Это будет эталон, базовая точка отсчета. Для него прорабатывается тестовое окружение: при оптимизации лучше всего тестировать автоматическими методами, скармливая функции некий наборчик данных и проверяя ответ по другим наборчикам. Прогонять или весь возможный набор входных состояний или такой набор, чтобы алгоритм прошелся по всем веткам и особо обратить внимание на пограничные значения /например, входной параметр может быть целым, от 0 до 90, значит в наборе обязательно должны быть -1, 0, 1, 89, 90, 91/. Можно даже сделать финт ушами /если данных немного/: эталонную функцию целиком проверить вручную, а оптимизированные - скармливать данные базовой и оптимизированной и сличать результат.

2. Определяется, что важнее - скорость или размер. Дело в том, что многие действия можно раскидать по таблицам и избавиться от кучи проверок, вычислений, развернуть в последовательности команд циклы, но работающая функция станет огромных размеров. Можно отполировать алгоритм, воспользоваться самым компактным языком программирования /для обычных ПК это будет ассемблер/ и работающая функция станет весьма и весьма компактной, но долго исполняемой. Определить критерии окончания оптимизации. Скажем, определить, что функция должна исполняться не более чем за 100 мс. Как прошли сей рубеж - стоп, оптимизация выполнена. Критерии должны иметь веское обоснование: например, предел в 100 мс охота не просто потому, что вот так хочется, а потому что функция должна исполняться не реже десяти раз в секунду, а кроме нее больше работать некому.
Гнаться за двумя зайцами не стоит: гарантированно уйдут все.

3. Внимательнейшим образом изучить алгоритм. Может быть дикое количество резервов кроется в нем самом.
Случай из собственной практики: нужна была тригонометрия на машинке с небольшим количеством доступной памяти /т.е. таблицы отпадали/, на которой вообще не было понятий "арифметический сопроцессор", "математика с плавающей запятой". Были найдены специальные формулы расчета синусов и прочего. В одной из формул использовался факториал. Причем, в первом члене он был 1!, во втором - 2!, в третьем - 3! и так далее. После огромной работы по оптимизации функции вдруг снизошло озарение: ведь 3!=2!*3, 4!=3!*4 и т.п. Т.е. для каждого члена факториал целиком считать не надо, достаточно умножить предыдущий факториал. Самая первая, базовая функция, доработанная с учетом данной мелочи сразу обошла по быстродействию тщательно отоптимизированную. Соответственно, оптимизированная вообще полетела... А был бы выполнен анализ алгоритма сразу же, то и потраченных недель на оптимизацию не понадобилось бы - мне по скорости уже базовой хватало.

4. Начинается оптимизация по выбранному пути: уменьшение времени или объема. Каждая итерация проверяется прогоном тестов, разработанных на первом этапе с замером оптимизируемой величины. Скажем, если всех возможных входных значений немного, то прогонять их все. И тест должен быть един: как для базового алгоритма, так и для оптимизированного.

5. По окончании процесса оптимизации базовую функцию лучше оставить в запас. Если вдруг понадобится новый цикл оптимизации или с другими критериями, она может пригодиться. Как базовая или опять как точка начала пути.

Оптимизации может быть подвергнут алгоритм любой сложности. Причем, особое внимание необходимо обращать как раз на те, которые чаще исполняются: экономия 5 секунд времени на функции, работающей раз в минуту даст сэкономленного времени меньше, нежели экономия 1 мс на функции, работающей 100 раз в секунду.
Для определения действительно "узких мест" в программе лучше применять специальные профилировщики. Ну или самому придумать нечто специализированное, для себя.

Все остальное - не оптимизация, а имитация бурной деятельности.

Вот, как-то так...

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как из программы SFC получить компактный код LD?

Сообщение Михайло »

А конкретные предложения будут? Вот есть SFC-алгоритм, я могу написать логические уравнения на LD. Это получится полный смрад, в котором еще можно разобраться благодаря двум-трем правилам обратной трансляции.
Если же за оптимизацию LD взяться, то обратного пути не будет. Советы, связанные с тестированием кода, в общем-то полезны, но не позволяют решить основную задачу - оптимизацию...

Аватара пользователя
san
Специалист
Сообщения: 117
Зарегистрирован: 13 окт 2012, 17:17
Откуда: Киев
Контактная информация:

Re: Как из программы SFC получить компактный код LD?

Сообщение san »

Я никак не могу понять задачу. Нужно программу написать, чтоб транслировала? А то подход вроде понятен.

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

Михайло
В свое время в журнале "Колобок" был такой комикс, как Колобок экономил время. Один из эпизодов экономии: Колобок взял книгу "Дети капитана Гранта" и сэкономил на чтении два дня - прочитал сразу последнюю строчку... Знаешь, как такая "экономия" называется?
Поэтому не будем "экономить" время, пойдем по порядочку.
Итак, п.1 - работающий алгоритм. Пункт выполнен, алгоритм представлен.
П.2 - цели и задачи, критерии достижения и обоснование критериев. Что хочется - уменьшить размер или время исполнения одного цикла? Что есть сейчас и до какого уровня хочется? Зачем?

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как из программы SFC получить компактный код LD?

Сообщение Михайло »

san писал(а):Я никак не могу понять задачу. Нужно программу написать, чтоб транслировала?
Степа писал(а):Что хочется - уменьшить размер или время исполнения одного цикла? Что есть сейчас и до какого уровня хочется? Зачем?
Ответ:
Михайло писал(а):Практическая значимость этой методики могла бы состоять в совершенствовании процесса разработки программы на языке LD - процесс можно было бы построить по схеме:
1. Разработка SFC
2. Трансляция алгоритма в LD
3. Оптимизация
Предложение касается только сложных алгоритмов, для простых алгоритмов подход "хрясь и готово" будет более практичным.
Процесс трансляции по обычной методике вручную, затем самое главное - оптимизация кода - также вручную. Ну если удастся автоматизировать процесс, то хорошо получится: ввел SFC, на выходе получил компактный LD. Под "компактным LD" я понимаю программу с минимальным числом цепочек и минимальным числом промежуточных тэгов.

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

Михайло писал(а):Процесс трансляции по обычной методике вручную, затем самое главное - оптимизация кода - также вручную. Ну если удастся автоматизировать процесс, то хорошо получится: ввел SFC, на выходе получил компактный LD. Под "компактным LD" я понимаю программу с минимальным числом цепочек и минимальным числом промежуточных тэгов.
Короткая программа - не всегда быстрая. Быстрая - она чаще всего огромная. Это достаточно простое правило.
Любая оптимизация - длительный и кропотливый ручной труд. В результате обычно получается совершенно нечитаемый код, который сложно отлаживать и править. Т.е. в результате согласно этого списка:
- понятной (легко объяснить как все работает),
- информативной, наглядной (просто отследить работу)
- легко отлаживаться (быстрое нахождение сбоев, ошибок),
- легко модернизироваться (типовй случай при ПНР)
- экономной (занимать меньше объема, ресурсов ЦПУ и т.п.)
выполняется только последний пункт, остальные полностью нарушены. Но как ты сам понимаешь, последний пункт - не самый важный в данном списке. Поэтому должна быть весьма веская причина поставить его во главу угла.
Поэтому я и задаю вопрос: цели и задачи оптимизации? Причины? Критерии достижения?
Места не хватает? Скорости работы? Что есть, сколько надо достичь? - вот ответишь на эти вопросы и получишь ответы на пункт 2. А пока ответов нет, это:
имитация бурной деятельности
Потому как тратить время на программу, занимающую вместо тысячи байт девятьсот девяносто конечно интересно, но при наличии свободного мегабайта - бесполезно.

Обрати внимание на программную индустрию. Как ты думаешь, почему раньше операционная система влазила на дискету 360 Кб, а теперь ей диск надо на десяток гигов. Не все эти гиги - на картинки и обои потрачены. Они почти все потрачены на оптимизацию времени: смысл тратить месяц и вылизывать код, если по-быстрому написанный исполняется практически так же? Было где-то в середине 90-х исследование, в котором было установлено, что во времена MS-DOS на одни и те же операции тратилось в четыре тысячи раз машинных команд меньше, чем в Win 3.xx/Win95. Но пользователи этого не замечали: машины стали быстрее и жевали в тысячи раз потолстевшие программы так же быстро. НО! Написание кода ускорилось сказочно. Скажем, у меня на некую операцию во времена MS-DOS уходило два дня, теперь - десять минут: несколько ленивых движений мышкой и постучать по клаве... Но проги: раньше чтобы получить мегабайт работающей программы, это мне нужно было долго и упорно работать. Теперь - это почти стандартный размер.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как из программы SFC получить компактный код LD?

Сообщение Михайло »

Ты немножко не так понял. Не нужна мне быстрая и экономная программа. Я хочу собрать схему на реле и для разработки этой схемы хочу применить SFC-проектирование... Из спортивно-академического интереса...

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

Михайло
Тогда все стало существенно проще.
Смотри на свою схему и собери цепочки для каждого реле /реле К1, К2, К3, S1, S2, S3, S4/, а потом набирай эти цепочки на физических реле /или программу на LD/. В чем проблема-то?
Кстати, помнится мне, что нечто подобное на asutpforum я выкладывал: граф и программу на LD.

И самое главное: при чем тут оптимизация?

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как из программы SFC получить компактный код LD?

Сообщение Михайло »

Слишком много реле получается, эта задача решается с помощью 4 реле, как мы видели...

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

Минимум 3 реле. Меньше даже теоретически нельзя - по условиям задачи три реле на управление.
Более того. Можно свободно обойтись без RS-триггеров и пользоваться только включением по условию.
В чем все-таки задача заключается?

Правильно заданный вопрос содержит половину правильного ответа. (с)

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как из программы SFC получить компактный код LD?

Сообщение Михайло »

Разработать оптимальную релейную схему (вариант: оптимальную программу на языке LD). Удобочитаемую, хорошо проверенную на SFC.

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

Что есть оптимальная схема? Схема на три реле? На четыре? Или вообще нормально работающая?

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как из программы SFC получить компактный код LD?

Сообщение Михайло »

На минимуме реле и нормально работающая.

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

/K1*/K2*/K3*((SB1*/SQ1)+(SB1*SQ1)+(SB2*/SQ4)+(SB2*/SQ4))=(s)K1
/SB3+(/K3*/SQ4)+(K3*/SQ1)=(r)K1
(/K1*/K2*/K3*((SB1*/SQ1)+(SB2*/SQ4)))+(K1*/K2*/K3*/SQ2)+(K1*/K2*K3*/SQ3)=(s)K2
/SB3+(/K3*/SQ3)+(K3*/SQ2)=(r)K2
/K1*/K2*/K3*((SB2*/SQ4)+(SB2*SQ4))=(s)K3
/SB3+(K3*/SQ1)=(r)K3

Если нигде не ошибся, то примерно так... Три реле.

Степа
Любитель
Сообщения: 98
Зарегистрирован: 21 окт 2012, 10:09

Re: Как из программы SFC получить компактный код LD?

Сообщение Степа »

Данный набор получен так:
По схеме выписаны все условия включения и выключения каждого реле.
Вычеркнуты все условия, при которых нужное реле уже включено (например, при переходе из S1 в S2 включать K1 незачем - оно там уже включено).
Кое-какие условия вынесены за скобки. Например, SB3 во всех цепочках выключения.
Все...

В общем, если подумать, то можно еще объединить все цепочки попарно и отказаться от RS-триггера, но сейчас уже башка не соображает...

Ответить