Язык ДРАКОН, вариации на тему "No OS" |
Здравствуйте, гость ( Вход | Регистрация )
Язык ДРАКОН, вариации на тему "No OS" |
Гость_MrYuran_* |
27.1.2012, 11:24
Сообщение
#41
|
|
Гости |
Ну вот, первый блин...
Исходная функция на 4 листа: CODE /** * Измерение уровня */ void MeasLevel() { unsigned long Time; static stLevelData *LdataPtr; static eADCchannels NextChannel; static float Temp; if(ADC12IFG & 0x4000) // готовы данные АЦП { LevelDataReady = 1; } if(LevelDataReady == 1) // Обработка данных АЦП { LevelDataReady = 0; ProcessAdcResult(); StartAdcCycle(); } switch(MeasParams.CurPhase) { case lmStartPhase: // старт процесса LmSensorPower(MeasParams.CurChannel, 1); // Включение подогрева нужного канала MeasParams.CurPhase = lmFirstMeas; GetRealTime(&MeasParams.Timer); // засекли время включения //break; //Pause(100); case lmFirstMeas: // первое измерение (почти холодного датчика) GetRealTime(&Time); if(Time-MeasParams.Timer < 50) { break; // не пришло время } switch(MeasParams.CurChannel) // Выбираем канал { case ADC_chan_L1: LdataPtr = &L1data; NextChannel = ADC_chan_L2; break; case ADC_chan_L2: LdataPtr = &L2data; NextChannel = ADC_chan_L3; break; case ADC_chan_L3: LdataPtr = &L3data; NextChannel = ADC_chan_L1; break; } //LdataPtr->Delta1 = Uadc(MeasParams.CurChannel); // измеряем //Temp = Uadc(MeasParams.CurChannel); Temp = LdataPtr->ADCData; LdataPtr->Delta1 = Temp; LdataPtr->Data = Temp; //Time1 = Time; if(LdataPtr->Delta1 < 500) // Датчик не подключен { LdataPtr->Delta1 = 0; LdataPtr->Status = ldsDataPresent; LdataPtr->LevelValue = L_SENSOR_NOT_CONNECTED; //MeasParams.CurPhase = lmFault; LmSensorPower(MeasParams.CurChannel, 0); // Выключение подогрева канала MeasParams.CurChannel = NextChannel; MeasParams.CurPhase = lmStartPhase; } else { MeasParams.CurPhase = lmSecondMeas; } break; case lmSecondMeas: // второе измерение GetRealTime(&Time); if(Time-MeasParams.Timer > t1) // пришло время { LdataPtr->Delta2 = Temp; // усредненный результат измерений LdataPtr->Delta1-= LdataPtr->Delta2; if(LdataPtr->Delta1 < 0) { LdataPtr->Delta1 = 0; LdataPtr->Status = ldsNoData; //MeasParams.CurPhase = lmFault; MeasParams.CurPhase = lmPause; LmSensorPower(MeasParams.CurChannel, 0); // Выключение подогрева канала MeasParams.CurChannel = NextChannel; } else { MeasParams.CurPhase = lmThirdMeas; } //GetRealTime(&MeasParams.Timer); } else { // Temp1 = (LdataPtr->Data - Temp) / K_FILTER; // Temp += Temp1 ; Temp += (LdataPtr->ADCData - Temp) / K_FILTER; LdataPtr->Data = Temp; } break; case lmThirdMeas: // последнее измерение GetRealTime(&Time); if(Time-MeasParams.Timer > t2) // пришло время { LdataPtr->Delta2-= Temp;//Uadc(MeasParams.CurChannel); // измеряем if(LdataPtr->Delta2 < 0) LdataPtr->Delta2 = 0; LdataPtr->Status = ldsDataPresent; LdataPtr->LevelValue = LdataPtr->Delta1 / (LdataPtr->Delta2 + 0.01); if(LdataPtr->LevelValue < 0.0) LdataPtr->LevelValue *= -1.0; /**/ LdataPtr->LevelValue -= LEVEL_THRESHOLD; /**/ if(LdataPtr->LevelValue < 0.0) LdataPtr->LevelValue = 0.0; if(LdataPtr->LevelValue > 0.0) LdataPtr->LevelValue = 100.0; LmSensorPower(MeasParams.CurChannel, 0); // Выключение подогрева канала MeasParams.CurChannel = NextChannel; MeasParams.CurPhase = lmPause; //GetRealTime(&MeasParams.Timer); } else { // Temp1 = (LdataPtr->Data - Temp) / K_FILTER; // Temp += Temp1 ; Temp += (LdataPtr->ADCData - Temp) / K_FILTER; LdataPtr->Data = (unsigned int)Temp; } break; case lmPause: GetRealTime(&Time); if( (L1data.Status == ldsNoData) ||(L2data.Status == ldsNoData) ||(L3data.Status == ldsNoData) ||(Time-MeasParams.Timer > t3)) MeasParams.CurPhase = lmStartPhase; break; case lmFault: GetRealTime(&Time); if( Time-MeasParams.Timer > (t3*2 + t2)) MeasParams.CurPhase = lmStartPhase; break; //default: MeasParams.CurPhase = lmStartPhase; } } Функция крутится непрерывно в карусельке (как Прохожий завещал ) И я уже, глядя на полученную картинку, вижу некоторые нюансы, которые раньше ускользали из поля зрения. Схема рисуется легко и непринужденно, перекомпоновка - тоже. В отличие от текста, где нужно выделить от одной скобочки до другой, да не промахнуться, да вставить в нужное место... Вот чего нагенерило... CODE /* D:\work\EXPERIMENTS\ДРАКОН\Новый_03.drt */ /* 1. ИС Дракон. Трансляция маршрутной части. Изменение 27.01.2012 13:56:08 */ /* Схема - Процедура */ ...... /* ==================== Шампур */ /* 2. Заголовок // Измерение уровня жидкости */ /* 4. ИмяВетки // Обработка данных АЦП */ /* 12. Вопрос // Данные АЦП готовы? */ if (!(......)) goto L33; /* 16. Вставка // Обработать данные */ ...... /* 17. Вставка // Запустить АЦП */ ...... /* 5. Адрес // Измерение уровня */ goto L33; /* ==================== Шампур */ /* 28. ИмяВетки // Измерение уровня */ L33: /* 33. Выбор // Фаза процесса измерения */ else goto L54; /* Старт цикла измерения */ else goto L20; /* Первый отсчет */ else goto L24; /* Второй отсчет */ else goto L55; /* Третий отсчет */ Ошибка: количество "Вариантов" без условия должно быть = 0, 1. /* 46. Вариант // Старт цикла измерения */ L54: /* 54. Действие // Включить подогрев текущего датчика */ ...... /* 60. ПускТаймера // Т1 = 0 */ ...... /* 61. Действие // Фаза = Первый отсчет */ ...... /* 29. Адрес // Конец */ goto L11; /* ==================== Шампур */ /* 10. ИмяВетки // Конец */ L11: /* 11. Конец // Конец */ ...... /* ==================== Шампур */ /* 47. Вариант // Первый отсчет */ L20: /* 20. Вопрос // T1 > 50 мс? */ if (!(......)) goto L45; /* 58. Действие // Зафиксировать первый отсчет */ ...... /* 62. Вопрос // Отсчет корректный? */ if (!(......)) goto L69; /* 59. Действие // Фаза = Второй отсчет */ ...... /* 91. Адрес // Конец */ goto L11; /* ==================== Шампур */ L69: /* 69. Действие // Ошибка: датчик не подключен */ ...... /* 63. Действие // Выключить подогрев датчика */ ...... /* 64. Действие // Переключить на следующий канал */ ...... /* 71. Действие // Фаза = Старт */ ...... goto L11; /* ==================== Шампур */ L45: /* 45. Действие // Фильтрация буфера измерений */ ...... goto L11; /* ==================== Шампур */ /* 52. Вариант // Второй отсчет */ L24: /* 24. Вопрос // Т1 > dT1? */ if (!(......)) goto L53; /* 34. Действие // Зафиксировать первый отсчет */ ...... /* 35. Вопрос // Отсчет корректный? */ if (!(......)) goto L18; /* 38. Действие // Фаза = Третий отсчет */ ...... /* 107. Адрес // Конец */ goto L11; /* ==================== Шампур */ L18: /* 18. Действие // Ошибка: датчик неисправен */ ...... /* 19. Действие // Выключить подогрев датчика */ ...... /* 21. Действие // Переключить на следующий канал */ ...... /* 22. Действие // Фаза = Старт */ ...... goto L11; /* ==================== Шампур */ L53: /* 53. Действие // Фильтрация буфера измерений */ ...... goto L11; /* ==================== Шампур */ /* 56. Вариант // Третий отсчет */ L55: /* 55. Вопрос // Т1 > dT2? */ if (!(......)) goto L75; /* 68. Действие // Зафиксировать третий отсчет */ ...... /* 57. Действие // Вычислить уровень по полученным данным */ ...... /* 65. Действие // Выключить подогрев датчика */ ...... /* 76. Действие // Переключить на следующий канал */ ...... /* 78. Действие // Фаза = Старт */ ...... /* 111. Адрес // Конец */ goto L11; /* ==================== Шампур */ L75: /* 75. Действие // Фильтрация буфера измерений */ ...... goto L11; ...... Вместо многоточий вставится текст, который я внутри иконок напишу. Ещё вот интересно... Современные ИДЕ поддерживают ражим открытия нужного файла с нужной строки? Чтобы на первое время хоть такой интерактив сделать. Типа, щелкаем по иконке, выпрыгивает какой-нибудь легковесный SciTE, открытый на нужном месте. Сообщение отредактировал MrYuran - 27.1.2012, 12:39
Причина редактирования: Исправил картинку
|
|
|
||
27.1.2012, 12:31
Сообщение
#42
|
||||||
Активный участник Группа: Пользователи Сообщений: 3085 Регистрация: 1.5.2010 Пользователь №: 152 |
Вопрос, что есть приоритетом в разработке подобных систем. Пока и в драконе - приоритет есть необразованность постановщика задачи в программировании. Что есть плохо. («Я мог бы ехать по навигатору с коробкой-автоматом, но я все равно не еду, так как водить не умею») Но здравое зерно в как бы отделении «чисто железных» элементов от программирования как бы, что ведет возможно к унификации где-то там, за счет неформального запрета изящной чисто программистской оптимизации... Что в конечном итоге ведет к приближению к исходной задаче, но лишает иногда таких вкусных вариантов из-за абстрагирования от нее... Ну ладно, надежность зато... Не знаю что бы когда есть приоритетом в разработке подобных систем, но думаю так, что есть некая система и её модель. Модель где-то, в голове человека получается. А какая она некая модель в голове конкретного человека уже зависит индивидуально - "каждый сходит с ума по-своему":) . Однако, типичные модели мира в головах всяких, думаю, нетрудно вычислить, потому что они наработаны окружающим миром. Вода течёт сверху вниз, солнце (для человека северного полушария) движется слева направо, тяни - себе - от кушать - хватать "манипулятором" и в рот, кака - наоборот и т.д. . Тогда просто напрашивается к использованию естественно наработанный "интерфейс" между миром и его отражением в головах. Из опыта общения в среде разных языков могу сказать, что есть универсальный международный язык общения, для восполнения пробелов в знании конкретных звуковых секвенций, принятых в конкретных языках - это язык моделирования звуками и жестами поведения обсуждаемой штуковины . Ещё универсальный международный язык - картинки. Вот, имел я ящики со всякой-всячиной на полочках на стеллаже. Подписывал их по пару букв, всё вроде бы понятно, но потом начал малевать шуруп, если там шурупы, винт, если там винты, резистор, если там резисторы и т.п. - просто и наглядно, самому себе значительно удобнее. Язык, принятый за основу - непременно будет написан парой студентов за бутылью пива, и все негаразды будут свято блюстись веками. Это — закон. Думать об удобстве? не дай Господь. Это дело Божье, а Господь - не Бог, такого не допустит. "Вечная история", или дилемма, или как ещё. Между для себя и для всех, между растягивать и сжимать, между разделять и соединять, между для своих и для чужих, против чужих, то есть. Объединяться в узком кругу ограниченных эээ.. чтобы дружить против . , Дилемма между унифицированным и специальным ... Что и где нужно смешивать, а что сепарировать ... А как оно таки будет, рано или поздно или когда или где, - в зависимости от - время разбрасывать или собирать . Думаю, что люди , придающие значение даже тому, перекрещиваются ли линии в диаграмме — вполне заслуживают доверия. Шутка, главное - как для меня, (пока не понял, что все особенности заточены под мозг) — единообразие и внимание, ему уделяемое. Опять же, четкая проработка, ничего лишнего — даже лищние стрелочки на самом деле, мешают, ага. Стандарт, однако. Что сказать — космос ... Просто соответствие и без всякого лишнего отвлекающего ресурс читающего "схему" на постороннюю обработку. Бо оно не надо. А есть когда надо, например - как девушке краситься и облекаться, чтобы обратить внимание на то что, а что как-бы маскировать. Но то уже применение "технологий" об том-же, но под цели несколько другие, например, обдуривание покупающего хреновину в магазине с использованием дизайна, что есть маскировка содержания формой. Вот в ремонте сварочник Linkor Semali посмотрите что за конструктив под красивой крышкой: Неразбираемый клубок, похож на поделку гаражного самоделкина. А вот профессиональный конструктив KITin 1900HF: Достпуно всё довольно хорошо. А Линкор даже не знаю с какой стороны подходить, как бы распаивать чтобы к чему-либо добраться. Против ремонтников сделано Просто не напрягались сделать нормально. Сообщение отредактировал perfect - 27.1.2012, 12:40 |
|||||
|
||||||
27.1.2012, 12:57
Сообщение
#43
|
|
тот самый Группа: Мод Сообщений: 13629 Регистрация: 24.11.2009 Из: Харьковская обл., UA Пользователь №: 25 |
|
|
|
Гость_MrYuran_* |
27.1.2012, 16:03
Сообщение
#44
|
|
Гости |
Попробовал другого дракона
Рисовать в нем, конечно, тяжелее, с одной стороны. С другой - больше свободы. Кодогенератор лучше приспособлен для жизни. Однако, чего же они все switch()-case на if()/else-ы разбивают... Код /* item 18 */
_sw_18 = Фаза процесса измерения; if (_sw_18 == Старт) { // item 24 Вкл. подогрев текущего датчика /* item 25 */ Таймер Т1 = 0 /* item 31 */ Фаза = 1 отсчет return; } else if (_sw_18 == 1 отсчет) { goto item_26; } else if (_sw_18 == 2 отсчет) { goto item_44; } else if (_sw_18 == 3 отсчет) { } else { UnexpectedBranch(_sw_18); } |
|
|
||
27.1.2012, 16:16
Сообщение
#45
|
|
тот самый Группа: Мод Сообщений: 13629 Регистрация: 24.11.2009 Из: Харьковская обл., UA Пользователь №: 25 |
Примитива такого нету: State Node
Есть "Переключатель"(драконодока, стр.3) - имхо, нечитабельный сфероконь. Вернее, он не для стейт-машин. |
|
|
27.1.2012, 17:57
Сообщение
#46
|
|
сундук Группа: Пользователи Сообщений: 4043 Регистрация: 21.11.2009 Из: Ростов-на Дону Пользователь №: 15 |
Однако, чего же они все switch()-case на if()/else-ы разбивают... ПМСМ конструкция if ... else if... else имеет тот же смысл, что и switch, но более универсальна в плане условий. А компилятор с С должен это дело транслировать одинаково в случае, когда условия совпадают по логике с case. |
|
|
27.1.2012, 18:32
Сообщение
#47
|
|
тот самый Группа: Мод Сообщений: 13629 Регистрация: 24.11.2009 Из: Харьковская обл., UA Пользователь №: 25 |
|
|
|
27.1.2012, 18:52
Сообщение
#48
|
|
сундук Группа: Пользователи Сообщений: 4043 Регистрация: 21.11.2009 Из: Ростов-на Дону Пользователь №: 15 |
|
|
|
Гость_MrYuran_* |
27.1.2012, 19:47
Сообщение
#49
|
Гости |
ПМСМ конструкция if ... else if... else имеет тот же смысл, что и switch, но более универсальна в плане условий. А компилятор с С должен это дело транслировать одинаково в случае, когда условия совпадают по логике с case. Тут дело вот в чём. Каждый кейс - это не что иное, как обычная метка. Даже ввиду синтаксиса. Только локальная внутри скобок. То есть свич-кейс - это изначально таблица переходов. Особенно если кейсы по порядку идут. Компилятор может их заменить ифами, а может оставить. В любом случае это проще, чем в обратную сторону - из кучи условий выудить переключатель. Компилятор шибко мозговитее для такого случая нужен. Ну и чисто теоретически здесь ошибочка закралась. У Паронджанова четко описано и обосновано однозначное соответствие графической программы и её текстового эквивалента. То есть, тождественное равенство. Если есть такой элемент - переключатель, то его нужно однозначно связывать с соответствующим текстовым эквивалентом, то есть с оператором switch(). Так как в противном случае при обратном преобразований получаем лесенку условий, что противоречит утверждению о тождественности двух форм записи. Вообще, автор молодец. Очень точно выдержал все нюансы, и Осталось открыть формат хранения схем и интерфейсы среды, чтобы заинтересованные могли добавлять свои рюшечки. |
|
|
27.1.2012, 19:49
Сообщение
#50
|
||
ДИКТАТОР Группа: Мод Сообщений: 23809 Регистрация: 20.11.2009 Из: Житомир Пользователь №: 3 |
Попробовал другого дракона Рисовать в нем, конечно, тяжелее, с одной стороны. С другой - больше свободы. Он чего, весь английский? А по русски? Д/б аналогичная версия же... Кстати — насчет примера этого — автор бы раскритиковал. У него подобное как раз в книге преобразовывалось в нечто более простое. |
|
|
||
Гость_MrYuran_* |
27.1.2012, 20:01
Сообщение
#51
|
Гости |
Он чего, весь английский? А по русски? Д/б аналогичная версия же... It's export oriented Там даже описание языка на аглицкий в боках переведено. Конечно, от стандарта отличается. Зато полностью соответствует духу опенсорса. И что характерно, кодогенераторы написаны на самом себе, а потом транслированы в целевой Tcl/Tk. Еще одно коренное отличие - это то, что в иконах вписывается непосредственно код, а комментарии - внутри, видны при выделений иконы. В ИС Дракон Тышова - наоборот, снаружи человеческий язык, а внутри расписание код. И это, по-моему, правильнее. |
|
|
27.1.2012, 20:28
Сообщение
#52
|
|
ДИКТАТОР Группа: Мод Сообщений: 23809 Регистрация: 20.11.2009 Из: Житомир Пользователь №: 3 |
|
|
|
28.1.2012, 7:05
Сообщение
#53
|
|
Adept Группа: Пользователи Сообщений: 522 Регистрация: 20.4.2011 Из: Novosibirsk Пользователь №: 346 |
А как же будем сравнивать с традиционным текстовым подходом? Надо какой-то пример взять всем понятный. Что-нибудь более-менее законченное. Например, кольцевой буфер. Кто сделает реализацию?
|
|
|
28.1.2012, 9:33
Сообщение
#54
|
|
тот самый Группа: Мод Сообщений: 13629 Регистрация: 24.11.2009 Из: Харьковская обл., UA Пользователь №: 25 |
Вчерась ввечеру раздраконился. Не понравилось. Нет обратной связи от полузабытых блок-схем к задаче. Слишком малый "вес" значков. Я не смогу на нем что-либо делать. И попёрли вопросы: какого икса примитив "параллельные действия" позорно табуирован, "патамушо у нас программирование" ??
Не, это не для мну. Но, несмотря на, иногда потребность нарисовать алгоритм остается. Буду это делать на бумаге, никого не слушая, потому что на ней, многострадальной, я могу нарысовать всё, что угодно, а в драконе - только "сверхвысокопонимаемую" диаграмму, наглядность которой мне до одного места. |
|
|
28.1.2012, 13:10
Сообщение
#55
|
||
Активный участник Группа: Пользователи Сообщений: 3085 Регистрация: 1.5.2010 Пользователь №: 152 |
С моего взгляда про язык и немного просмотра книжки хочу заметить про ясность и упорядоченность. Это необходимо чтобы поправить окружающий великий бардак и ужасную бестолковость всего вокруг, суету, метания, вытекающую отсюда паршивость, хреновость, дерьмовость.
Прежде всего нужно для себя, потому что чем больше вещей делать суетно и неправильно, тем больше сам становишься неправильным. Сказать колоритнее - делать через жопу, бо быстрее, бо экстренная необходимость, бо писец, жонглирующий кучей висящего в воздухе, недайбог упасть, быстрее, пусть бестолково, при этом наконец убивая намного больше времени и просирая всё подряд. Самому понять, потом, что намного сложнее, суметь объяснить ближайшему окружению, хотя-бы в некоторой мере, по причине необходимости взаимодействия с ними. А потом таки добиться чтобы было воплощено в жизнь и соблюдалось. Бо просто умопомрачительно какая невероятная тысяча мелочей бестолковости. Вот, например, заглядывает человек ко мне, становится в проём дверей и чего-то хочет. Что стал в проём - это типа срочно. При этом мне по ногам идёт холодный воздух. Говорю - закрывайте дверь. Ну и, это-ж может восприняться как недружелюбность с моей стороны, несмотря на мой ровный тон, несмотря на внутреннее разражение. Или просто вошёл и бросил дверь полуоткрытой. Ну и постоянно это говорить, или через-раз, каждому. Ну, взял и сделал доводчик . Сейчас покажу. На скорую руку, естественно , благо штуковина оказалась под рукой, ещё три есть, пригодятся как-нибудь. Работает однако, плавно, прекрасно. Два устойчивых положения. Это чтобы дверь была открытой когда нужно заносить что-то не отвлекая руки на держание дверей. Мёртвая точка где-то на 75-80 градусов раскрыва дверей. Ну, та мёртвая точка и есть недостаток от на_скорую_руку, нужно было это учесть и сделать по типу триггера шмитта, чтобы небыло возможности замерзания в мёртвой точке. Или вот, токо-што, возвращает человек мне дрель. Решил смотать ей провод. Это уже хорошо. Но. Если её взять и опустить, то провод с неё рассыпется . (Правильно было-бы смотать правильно. И это ещё не всё. Просто положить на своё место на стеллаже, без жестов "типа великого услуживания что ещё и смотал провод и вот - даю. .. ) И т.д. |
|
|
||
28.1.2012, 13:15
Сообщение
#56
|
|
тот самый Группа: Мод Сообщений: 13629 Регистрация: 24.11.2009 Из: Харьковская обл., UA Пользователь №: 25 |
Сектеровкой увлеклись? Айайай, я же предупреждал.
|
|
|
28.1.2012, 13:52
Сообщение
#57
|
|
Активный участник Группа: Пользователи Сообщений: 3085 Регистрация: 1.5.2010 Пользователь №: 152 |
Нет. Непьщий я. Незнаю почему бы такое впечатление. Та, заморочиться можно и без водки. Или об чём это сектеровка?
|
|
|
28.1.2012, 13:59
Сообщение
#58
|
|
тот самый Группа: Мод Сообщений: 13629 Регистрация: 24.11.2009 Из: Харьковская обл., UA Пользователь №: 25 |
Или об чём это сектеровка? Объясню на примере Сектера. Мы его чуть не забанили не из чувства лютой классовой ненависти, а оттого, что банально заебались наблюдать превращение Шараги в филиал injapan.ru и улёты про домофоны. Но это полярный случай, к Вам он только ассоциативно, тсз. Надеюсь на понимание. |
|
|
28.1.2012, 14:47
Сообщение
#59
|
|
Активный участник Группа: Пользователи Сообщений: 349 Регистрация: 19.4.2011 Из: СПб Пользователь №: 344 |
Но, несмотря на, иногда потребность нарисовать алгоритм остается. Буду это делать на бумаге... Альтернатива бумаге: http://www.yworks.com/en/products_yed_about.html |
|
|
28.1.2012, 14:58
Сообщение
#60
|
|
Активный участник Группа: Пользователи Сообщений: 3085 Регистрация: 1.5.2010 Пользователь №: 152 |
|
|
|
Текстовая версия | Сейчас: 28.3.2024, 17:37 |