Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

ВСТУП1

Работа добавлена на сайт samzan.net:


ЗМІСТ

ВСТУП ……………………………………………………………………………………... 3

  1.  ОПИС ЗАСТОСУВАННЯ ПРОГРАМИ BLUEJ …………………….. .5
  2.  ОПИСАННЯ ТЕХНОЛОГІЧНОГО ПРОЦЕСУ  

Опис технологічного процесу випалу вапняку.…,,,,,,,,,,,,,………….... 8

  1.  НАСТАНОВА З ІНСТАЛЯЦІЇ ПРОГРАМИ ……………………...…. 10
  2.  ТЕХНОЛОГІЯ РОЗРОБКИ ПРОГРАМНОГО ДОДАТКУ………….. 11

4.1 Розробка класу для завантаження налаштувань ………………  12

4.2 Розробка класу регулятора …………………………………….…13

4.3 Розробка головного класу додатку …………………………...... 14

4.4 Проектування графічного інтерфейсу …………………………....15

4.4.1 Розмітка інтерфейсу вікон програми……………………...….16

4.5 Розробка класу для рреалізації графічного інтерфейсу ……......19

ВИСНОВОК……………………………………………………………….....20

СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ …………………………...…21

Додаток А ……………………………………………………………………22

Додаток Б …………………………………………………………………….25

Додаток В ………………………………………………………………….…27

Додаток Г ………………………………………………………………….…28

Додаток Д …………………………………………………………………….33

Додаток E……………………………………………………………………..34

Додаток Ж………………………………………………………………….…35


ВСТУП

Вапно (Ca) є продуктом випалу карбонатних порід і знаходить широке застосування в різних галузях промисловості. Вапно є одним з найпоширеніших  і різнобічно-використовуваних хімічних продуктів, вироблених і споживаних по усім світі. Гашене й негашене вапно використалося в багатьох цивілізаціях протягом  більш ніж 3000 років. Якщо раніше вапно в основному застосовувався як  будівельний матеріал, то в наш час її використання придбало істотно більше широкий характер. Найбільш великими споживачами даної продукції є чорна металургія, будівельна індустрія, целюлозно-паперова промисловість, хімічна промисловість, сільське господарство, цукровапромисловість. Також у значних обсягах вапно використається для охорони навколишнього середовища (нейтралізація стічних вод і димових газів).

У промислово-розвинутих країнах споживання вапна в цей час становить близько 80 кг на душу населення в рік. Загально світове виробництво вапна, включаючи невеликих виробників у країнах, що розвиваються, а також виробників вапна для власних потреб (таких як металургійні заводи й целюлозно-паперові комбінати), оцінюється  в 300 млн т у рік. З них на ринок надходить близько 120 млн т у рік.

  1.  ОПИС ЗАСТОСУВАННЯ ПРОГРАМИ BLUEJ

BlueJ – безкоштовна інтегрована середа розробки для мови програмування Java, що розроблена в освітніх цілях. Середа насамперед призначена для вивчення сучасного об’єктно-орієнтованого програмування, однак її можливо також використовувати для розробки повноцінних прикладних комп’ютерних програм невеликого та середнього розміру.

Основні переваги середи:

  1.  візуальне відображення структури класів та об’єктів;
  2.  зручний, не вимогливий до комп’ютерних ресурсів, інтерфейс ;
  3.  вбудовані інструменти відлагодження, що дозволяють наглядати за станом об’єктівта визивати їх індивідуальні методи в інтерактивному режимі.

Розглянемо основні елементи робочої середи BlueJ, що відображені на рисунку 1:

1. Заголовок вікна, що містить назву проекту.

2. Рядок меню.

3. Кнопка для створення нового програмного класу в проекті.

4. Один з класів, що містяться в проекті. Два клацання – відкриття програмного коду, клацання правою кнопкою – відкриття спливаючого меню.

5. Встановлення залежності одного програмного класу від іншого.

6. Встановлення наслідування одного програмного класу від іншого.

7. Відображена залежність між одним програмними класами.

8. Налаштування для відображення та приховування залежностей та

наслідування.

9. Компіляція всіх програмних класів проекту.

10. Анімація, що відображує проходження компіляції.

11. Стенд об’єктів – місце для перегляду стану об’єктів та виклику його

методів.

12. Один зі створених об’єктів (об’єкт circle_1 класу Circle).

13. Рядок статусу відображує результат останньої виконаної дії.

Рисунок 1 – Головне вікно середи розробки BlueJ

Для того, щоб розмістити об’єкт класу на стенді об’єктів необхідно клацнути правою кнопкою миші та вибрати у спливаючому меню пункт new <ім’я класу (параметри)>. В діалоговому вікні треба вказати бажане ім’я об’єкту (Name of instance) або погодитись з тим, що пропонується середою. Після цього, якщо в програмі немає помилок, об’єкт буде розміщено на стенді об’єктів, що зробить можливим перевірити його роботу у середі за допомогою вбудованих засобів: виконання методів об’єкту зі вказаними параметрами і перегляд стану об’єкту.

Стан об’єкту - це значення його полів для даного моменту часу. Перелік і типи полів об’єкту визначаються структурою класу і є незмінними для всіх об’єктів даного класу. Значення полів об’єктів одного класу можуть відрізнятись, як, наприклад, наведено на рисунку 2.   

Рисунок 2 – Приклад різниці станів об’єктів одного класу

 

Для того, щоб переглянути стан об’єкту на стенді об’єктівтреба у спливаючому меню обрати пункт Inspect Object (інспектувати об’єкт). Діалог, що відображує стан об’єкту, розділено на два переліки: статичні поля (staticfields) і об’єктні поля (objectfields). Статичні поля – це поля класу, тому їх значення завжди однакове у всіх об’єктів даного класу.

Засобом для досягнення мети служить постановка типової задачі -створення програмного забезпечення для управління технологічною установкою за допомогою платформи Java з використанням сучасних підходів до побудови графічного інтерфейсу, обробки та зберігання даних, реалізації алгоритмів керування.


2 Опис технологічного процесу випалу вапняку.

Керування процесом одержання вуглекислого газу й вапняного молока розбивається на локальні системи автоматизації печі випалу вапняка й ділянкою готування вапняного молока й підготовки сатураційного газу.

Печі випалу вапняка. Як відзначалося, темп вивантаження обпаленоговапна з печі стабілізується й коректується при налагодженні режиму роботи печі лише в невеликих межах за допомогою вигрузочного механічного або електричного (при наявності многоскоростного електродвигуна) пристрою - шляхом узгодження темпу завантаження печі шихтою з темпом вивантаження вапна з печі й здійснюється підтримкою заданого рівня шихти в печі.

Цикл завантаження печі або одного ковша включає наступні основні операції:

- завантаження в ківш попередньо підготовленої дози вугілля при  наявності  розв'язного сигналу  рівнеміра шихти в печі;

- завантаження в ківш вапнякового каменю до заданої загальної маси ковша, фіксуючої пристроєм, що зважує; підйом ковша на верх печі з наступним вивантаженням дози шихти в лійку завантажувального пристрою; послідовне відкриття й закриття двох затворів завантажувального пристрою за принципом роботи шлюзу, у результаті доза доставленої скіповим підйомником шихти спочатку скидається в горловину, закриту нижнім затвором, а потім при закритому верхньому затворі по поворотному лотку завантажується в піч;

- періодичний поворот лотка на певний кут для того, щоб кожна нова доза шихти вивантажувалася в піч на нове місце;

- повернення ковша  у вихідне положення.

Звичайно робота паливодозуючого й завантажувального пристроїв (відкриття й закриття верхнього й нижнього затворів, поворот лотка) зв'язується з однієї із чотирьох стадій робочого циклу скіпового підйомника: нижнє положення ковша, рух ковша нагору, верхнє положення ковша в перекинутому стані, рух ковша вниз, що визначає однозначно схему керування завантаженням печі. Із цієї причини блок-схеми різних систем керування процесом завантаження відрізняються в основному апаратурною реалізацією блок-схеми керування у зв'язку з конструктивними особливостями конкретної печі випалу вапняка й тракту подачі вапнякового каменю й вугілля в ківш підйомника. Важлива роль при синтезуванні схем керування приділяється вибору засобів автоматизації у зв'язку з тяжкими умовами експлуатації.

Схеми керування завантаженням печі виконуються наоснові застосування загальпромислових і широкодоступних реле, що визначають високу надійність релейних схем. Найбільш уразливим місцем деяких схем є кінцеві вимикачі, що фіксують верхнє й нижнє положення ковша скіпового підйомника, через шкідливий атмосферний вплив в умовах установки їх зовні. Використання реле контролю опору ИКС-2Н замість зазначених кінцевих вимикачів вирішило цю проблему. Реле встановлюють у щиті керування в приміщенні, а електроди мітелкового типу - відповідно у верхній і нижній частинах скіпового підйомника. Завдяки високій чутливості реле ИК.С-2Н надійно функціонує навіть при зледенінні електрода, а також як  сигналізатор ослаблення натягу троса.Дозування вугілля в ківш скіпового підйомника здійснюються живильником-дозатором палива ПДУ-1М, що являє собою важільні ваги. На одному із плечей коромисла встановлюється бункер на 80 кг вугілля, відкритий зверху й постачений керованим затвором знизу. На іншому плечі підвішується противага, за допомогою якого встановлюється маса необхідної дози вугілля.  Вугілля з бункера подається в дозатор живильником. Після набору заданої дози за допомогою кінцевого вимикача подається з, по якому подача вугілля в дозатор припиняється. Затвор дозатора відкривається для вивантаження вугілля в ківш скіпового підйомника або на проміжний конвеєр за допомогою електромагніта. У відкритому положенні затвор утримується засувкою. По сигналі закриття затвора засувка звільняється іншим електромагнітом, і затвор закривається під дією противаги. Дляконтролю крайніх положень затвора дозатора аспользуются кінцеві вимикачі.

Ківш скіпового підйомника із шихтою зважується двома методами. По першому методі ківш у нижнім положенні сідає безпосередньо на вагоприймаючий елемент  пристрою, що зважує, і трос при зважуванні послабляється. Цей метод одержав найбільше поширення й застосовується з використанням важільних ваг на печах малої продуктивності, не обладнаних "ловителем" ковша.

Печі великої продуктивності характеризуються великою масою ковша й великою висотою скіпового підйомника. Вони обов'язково обладнаються "ловителем", що при ослабленні троса спрацьовує, сприймаючи масу ковша на себе. У цьому випадку застосовується метод зважування ковша "на тросі", коли ківш у нижнім положенні не сідає на опорний елемент, а зависає на тросі. Зважування здійснюється шляхом виміру зусилля, що розтягує трос, або зусилля, сприйманого одним з роликів. Другий метод вдало використається при зважуванні ковшаскіпового підйомника в печах випалу, у яких маса ковша сприймається тензодатчиком, установленим під верхнім роликом.

У випадку утруднень, пов'язаних з реалізацією одного зі згаданих методів безпосереднього зважування ковша, допускається дозування вапнякового каменю в режимі автоматичного керування за часом роботи  механізмів, що подають, - живильника, конвеєра. При вдалому розташуванні пункту керування вапняковипальної печі, що забезпечує візуальний контроль за роботою механізмів тракту подачі вапнякового каменю й вугілля в ківш, дозування за часом дають цілком задовільні результати, що підтверджується практикою роботи деяких цукрових заводів.

Для контролю рівня шихти в печі використаються в основному радіоізотопний і штанговий рівнеміри. Застосування радіоізотопних рівнемірів переважніше, хоча й пов'язане з необхідністю дотримання певних запобіжних заходів, пов'язаних з експлуатацією й зберіганням джерел радіоактивного випромінювання. Штангові рівнеміри при ретельному виготовленні й правильному режимі експлуатації печі працюють надійно. Штангові рівнеміри використаються в системах керування заводу "Сахавтомат" і виготовляються заводами самостійно. Для контролю рівня вапняку й вугілля використовуються, як правило, реле контролю опору ИКС-2Н.Початком завантаження печі 7 шихтою є момент посадки ковша скіпового підйомника в крайнє нижнє положення, коли спрацьовує реле ИКС-2Н (2а, 26), що приводить до  одночасного  виконання наступних операцій:

- вимиканню електропривода скіпової лебідки 8 (пускач МП9);

- включенню електропривода поворотного лотка (пускач МП6), що відключається після закінчення 10-12 із за допомогою реле часу РВП;

- відкриттю затвора дозатора вугілля 4 (пускач МП01, електромагніт ЭМ-2) із включенням наповнюється вугіллям до заданої противагоюдози. Готовність дози конвеєра вугілля 5 (пускач МП2) завантаження вугілля в ківш 6 (кінцевий вимикач КДО).

Остання операція виконується при наявності розв'язних сигналів про готовність дози вугілля (кінцевий вимикач КВТ) і рівні шихти в печі, вимірюваному за допомогою комплекту гамма-реле ГР-7, нижче оцінки установки датчика (4а). При відсутності розв'язного сигналу зарівнем у печі виконання цієї операції затримується до появи сигналу. Відсутність сигналу про готовність, що виключається при нормальному функціонуванні системи, свідчить про несправності в дозаторі вугілля або сигнального ланцюга або про відсутність вугілля в бункері. За допомогою реле встановлюється тривалість відкритого положеннязатвора й роботи конвеєра вугілля, достатня- для завантаження дозивугілля в ківш, після закінчення якої затвор дозатора закривається (пускач МП31, електромагніт ЭМ-1), а конвеєр вимикається.(пускач МП2). По сигналі закриття затвора дозатора (кінцевий вимикач КДЗ) включається живильник вугілля 3 (пускач МПЗ), і дозатор сигналізується (кінцевий вимикач КВТ) з одночасним відключенням живильника вугілля. Ізцього моменту дозатор вугілля готовий до участі в наступному циклі завантаження печі.

По закінченні завантаження вугілля в ківш по сигналі кінцевого вимикача КДЗ включаються живильник вапнякового каменю 2 (пускач МП4) і конвеєр (пускач МП5). Подача каменю в ківш триває до спрацьовування кінцевоговимикача КВШ індикатора маси шихти, після чого живильник і конвеєр вимикаються й подається сигнал про готовність дози шихти. Як резервний варіант передбачається завантаження ковша вапняковим каменем за допомогою спеціальних реле часу роботи живильника й конвеєра вапнякового каменю.

Після одержання сигналу про готовність дози шихти включаються лебідка (пускач МПВ9) для підйому ковша нагору й двигун електрогідравлічного приводу нижнього затвора (пускач МП7). Після закінчення 4-8 з, необхідних для висипання шихти попереднього циклу завантаження по поворотному лотку зі шлюзу завантажувального пристрою в шахту печі, двигун відключається, а затвор під дією противаги закривається. Таким чином, завантаження дози шихти в піч відбуваються при закритому верхньому затворі.У момент досягнення ковшем крайнього верхнього положення спрацьовує реле ИКС-2Н (За, 36), відключаючи лебідку (пускач МПВ9). Шихта з перекинутого ковша вивантажується в лійку завантажувального пристрою й через 10 з лебідка включається на опускання ковша (пускач МПН9). Одночасно з початком руху ковша внизвключається двигун верхнього затвора (пускач МП8) і доставлена в прийомну лійку завантажувального пристрою шихта просипається в його нижню частину (шлюз). Схеми керування затворами ідентичні. У момент посадки ковша в крайнє нижнє положення закінчується цикл дозування й завантаження шихти в піч і починається новий. Передбачаються дистанційне керування всіма електроприводами механізмів дозування й завантаження шихти (кнопки КП1-КПП, КС1-КС8), а також місцеве керування верхнім і нижнім затворами завантажувального пристрою печі (кнопки КПМ1, КПМ2) і технологічна сигналізація (Л1-Л4, Л6-Л8, Л10-Л16) про стан механізмів дозування й завантаження шихти, рівня шихти в печі, а також аварійна сигналізація (миготливе світло й звуковий сигнал) в наступних випадках:

- при затримці завантаження ковша  шихтою   (лампа Л5);

- при відмові приводу поворотного лотка (лампа Л9);

- при ослабленні натягу троса(лампа Л17)за допомогою реле ИКС-2Н(1а, 16);

- при падінні залишкового тиску у верхній частині печі (лампа Л18), що виявляє датчиком ДНТ-12 (5а).

При включенні аварійної сигналізації натисканням кнопки (КА) оператор відключає всю схему керування дозуванням і завантаженням шихти в піч. Про відключення схеми керування сигналізує лампа Л19 і запам'ятовує проміжне реле. Після усунення аварійної ситуації подача напруги в схему керування здійснюється шляхом короткочасного відключення щита керування вступним автоматичним вимикачем.Для дистанційного керування конвеєром подачі вапнякового каменю й вугілля в бункеры перед вапняковипалюючоїпіччю перекидним шибером, що забезпечує подачу каменю й вугілля одним конвеєром у відповідний бункер, а також грохотами для каменю й вугілля передбачається окремий малогабаритний щит. На цей щит виноситься сигналізація про наявність каменю й вугілля в бункерах, керування нагнітальний вентилятор-місцеве. 

 

 3 НАСТАНОВА З ІНСТАЛЯЦІЇ ПРОГРАМИ

Для інсталяції програмого пакету BlueJ потрібно запустити файл bluej.exe, далі відкриється вікно показане на рис. 3 .

Рисунок 3.1 -  Вікно програми BlueJ

Щоб створити новий jarфайл, потрібно виконати команду Project-CreateJarFile… та у відкритому вікні показано на рис 3.2  встановити відповідні бібліотеки.

Рисунок 3.2 -  Вікно CreateJarFileпрограми BlueJ


4 ТЕХНОЛОГІЯ РОЗРОБКИ ПРОГРАМНОГО ДОДАТКУ

Діаграма класів, що відображає структуру проограми наведена на рисунку 4.1. Для розробки програми, як видно з діаграми, необхідно реалізувати наступні класи: основний клас додатку (Application), клас регулятора (Controller), клас реалізації графічного інтерфеейсу (GUI), клас для завантаження налаштувань (XMLInterface), клас побудови графіків (Graph).

Зверніть увагу, що бібліотеки, що не входять в стандартну поставку JDK необхідно підключати. У BlueJ підключення відбувається в діалозі налаштувань ToolsPreferences (вкладка Libraries).

Окремо від проекту повинні міститися такі файли: файл налаштувань програми, файли з розміткою форми, HTML файл з описом технологічного процесу (і вкладені зображення), піктограми для панелі інструментів, зображення з мнемосхемою технологічного процесу.

 

 

Рисунок 4.1 – Діаграма класів програмного додатку

4.1 Розробка класу для завантаження налаштувань

 

Використання XML для зберігання налаштувань програми є широко застосовуваним підходом у сучасному прикладному програмуванні. Зберігати налаштування вашої програми у форматі XML дуже зручно з ряду причин: простий і наочний синтаксис, можливість редагування простим текстовим редактором, наявність бібліотек програмних компонентів, які виконують синтаксичний розбір документа, які є в арсеналі практично будь–якого сучасного мови програмування.

Функціональним призначенням класу XMLInterface є завантаження  налаштувань програми з XML файлу. Структура класу і приклад файлу налаштувань наведений на рисунку 4.2. 

 

Рисунок 4.2 – Структура класу для завантаження налаштувань програми

Універсальним підходом для обробки XML файлів є використання парсеру зі стандартизованим програмним інтерфейсом (API) DOM. Даний інтерфейс дозволяє працювати з XML документом як з деревом вузлів, кожній з яких можна витягти, додати, змінити і видалитти.

РеалізаціяXML документа за допомогою DOM наведені в додатку А.

4.2 Розробка класу регулятора

 

Клас Controller предназначено для моделювання замкнутої системи керування з лінійно–квадратичним регулятором, яка виконується точно з кроком рівним dt. Для виконання в окремому потоці клас успадковується від класу TimerTask.

Рисунок 4.3 – Структура класу регулятора

На даний момент в Java відсутня стандартний клас для операції над матрицями, проте існує потужний пакет для виконання операцій над матрицями – JAMA, який претендує на те, щоб у майбутньому стати стандартним пакетом. Даний пакет розроблений Національним інститутом стандартних технологій США (NIST) і корпорацією Mathwoorks (розробник математичного пакета Matlab), забезпечує швидкість і точність обчислень.

Для цілей реалізації алгоритму досить використовувати три методи пакета для операції над матрицями: times (множення), plus (додавання), minus (віднімання). Для генерації випадкового збурення необхідно скористатися методом random класу Math, який генерує псевдовипадкове дійсне число в діапазоні від від [0.0 .. 1.0).

Код реалізації методу run ():

 public void run()

{

    if(work)

    {   

 for(int i=0;i<inputs;i++)

       f[i][0]=Math.random()*fmax[i];

           if(!manual)

          { 

              e=minus(y,z);

              u=times(cr,xr);

              xr=times (ar,xr);

xr1=times(br,e);

xr=plus(xr,xr1);

}

x=times(ad,x);

 u1=plus(u,f);

x1=times(bd,u1);

x=plus(x,x1);

y=times(c,x);

}

Реалізація класу Controller  наведено в додатку Б.

4.3 Розробка головного класу додатку

 

Головний клас додатку виконує наступні дії:

  1.  Завантажує налаштування програми шляхом ініціалізації об'єкту класу XMLInterface.
  2.  Запускає графічний інтерфейс Swing шляхом ініціалізації об'єкту класу GUI.
  3.  Ініціалізує роботу контролера за таймером.

 

Рисунок 4.4 – Структура головного класу додатку

 

Дляреалізації таймера використовується клас Timer з пакету java.util,критичним параметром для якого є час виконання. Установка розкладу виконання таймера проводиться за допомогою методу schedule. Час задається в мілісекундах.

Наступний код ініціалізує роботу об'єкта класу Contntroller. У конструктор об'єкта класу Controller передаються параметри, що завантажені в об'єкт класу XMLInterval. Інтервал роботи дорівнює кроку дискретності, який перераховується у мілісекунди.   

 intperiod = (int) (1000 * xml.getDt ());

 controller.schedule (newController (xml.getInputs (),

 xml.getOutputs (), xml.getUplimits (), xml.getDownlimits (),

 xml.getAd (), xml.getBd (), xml.getC(), xml . getD (),

 xml.getAr (), xml.getBr (), xml.getCr (), xml.getFmax (),

 xml.getUnom ()), 0, period);

ВихідзпрограмивметодіexitProgramможливореалізуватизадопомогоюметодуexitкласуSytem.

Реалізація класуApplication наведено в додатку В.

4.4 Проектування графічного інтерфейсу

 

Загальними вимогами, що пред'являються до АРМ, є: зручність і простота використання, технологічність виконуваних процедур, дружність інтерфейсу і ергономічність (зручне розташування, висока якість візуальної інформації, простота здійснення діалогу з підказками при неправильних діях користувача, можливість ведення архіву та ін.).

Графічнийінтерфейспрограмискладаєтьсяз 4 вікон:

вікновідображеннястануТП (головневікно), інформаційневікно, вікноустановкизавдання, вікновідображенняграфіківперехіднихпроцесів.

Вимоги до графічного інтерфейсу вікна відображення стану ТП:

  1.  відображати на екрані схему ділянки з показаннями технологічних змінних і керуючих впливів, що динамічно оновлюються;
  2.  сигналізувати про вихід технологічної змінної за зону допустими відхилень зміноюкольору тексту змінною і текстовий вивід аварійного повідомлення із записом повідомлення разом з часом його виникнення в журнал аварійних повідомлень;
  3.  передбачити ведення журналу аварійних повідомлень.

Вимоги до інформаційного вікна:

  1.  надати необхідні дані про розробника програми;
  2.  відобразити HTML файл з коротким описом технологічного процесу.

Вимоги до вікна установки завдання:

  1.  надати можливість установити завдання на технологічні змінні в межах технологічного регламенту;
  2.  установка нових завдань проводиться за допомогою спеціальної кнопки.

Вимоги до вікна графіків перехідних процесів:

  1.  одночасно відображаються графіки всіх змінних, прив'язані до єдиної часової шкали;
  2.  надати можливість масштабувати графік в реальному часі.

4.4.1 Розмітка інтерфейсу вікон програми

 

Для реалізації завдання пропонується використовувати 4 вікна: вікно відображення стану ТП, вікно графіків перехідних процесів, вікно установки завдання, інформаційне вікно про розробника і технологічний процес.

Розмітку інтерфейсу кожного вікна необхідно оформляти в окремому XML файлі. Зразковий вигляд вікна для технологічного процесу із 2 входами і 2  виходами представлений на рисунку 4.5.

Панель інструментів містить такі кнопки: запуск/зупинка процесу, включити/відключити контролер, показати графіки, встановити завдання на параметри, інформація о процесі і розробнику.

Перелік Swing компонентів, необхідних дляреалізації головного вікна:

1. JLabel - мітка, напис

2. JButton - кнопка

3. JProgressbar - відображення числа в деякому діапазоні

4. JToolbar + JButton - панель інструментів із кнопками

5. JSpinner - вибір значення із зазначеної послідовності

6. JScrollpane + JTable - таблиця з прокруткою

Головне вікно можливо розділити на дві панелі: основний зміст і таблиця з журналом аварійних повідомлень. Для панелі основного змісту доцільно використовувати менеджер компонування GridBagLayout. Даний менеджер дозволяє розглянути виділену область як таблицю із зазначенням розмірів рядків і стовпців. Кожен компонент розташовується в одній або більше клітинок.

 

Рисунок 4.5 – Приклад оформлення головного вікна програмного додатку

Рисунок 4.6 – Приклад оформлення вікна Завдання програмного додатку

Рисунок 4.7 – Приклад оформлення вікназ графічним інтерфейсом програмного додатку

Для того щоб використовувати компоненти Swing в програмному коді в XML файлі необхідно обов'язково вказати ідентифікатор компоненту (id). Також ідентифікатор (action) повинен мати обробник подій кожного компоненту, події якого відстежуються.

4.5 Розробка класу дляреалізації графічного інтерфейсу

Клас дляреалізації графічного інтерфейсу виконує наступні задачі:

1. Створює 4 вікна за допомогою бібліотеки Swing: вікно відображення стану ТП (головне вікно), інформаційне вікно, вікно установки завдання, вікно відображення графіків перехідних процесів.

2. Обробляє події компонентів 4 вікон.

3. Щомиті оновлює інформаційні параметри, що отримуються з контролера, сигналізує про вихід за регламентні зони, передає інформацію об'єкту класу Graph для побудови графіку.

Структура класу наведена на рисунку 4.8.

Рисунок 4.8 – Структура класу реалізації графічного інтерфейсу

Основний клас для реалізації діалогового вікна в бібліотеках Java – JFrame. У Java під фреймом (frame) розуміється діалогове вікно верхнього рівня з заголовком, стандартної рамкою і кнопками – відкрити/закрити/ згорнути.

Розглянемо метод ініціалізації головного вікна прогграми за допомогоюбібліотеки swiXML. Наступний код ініціалізує головне вікно програми і розміщує на ньому всі описані у відповідному XML файлі компоненти. Даний метод (і всі методи ініціалізації вікна) повинен бути викликаний в конструкторі класу GUI.

Конструктор класу GUI показаний в додатку Г.

Клас Graphпоказаний в додатку Д.

ВИСНОВОК

В курсовій роботі було створено програмне забезпечення для управління технологічною установкою за допомогою платформи Java з використанням сучасних підходів до побудови графічного інтерфейсу, обробки та зберігання даних, реалізації алгоритмів керування.

Программа виконує такі функції, як відображення на екрані схему ділянки з динамічно виведеними показаннями технологічних змінних і керуючих впливів, виведення журналу аварійних повідомлень, вікно завдання технологічних змінних, відображення графіка технологічних змінних, інформаційне вікно з описом технологічного процесу і даними про розробника та ін..


СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ

  1.  А.О.Стопакевич. Методичні вказівки для виконання курсової роботи «Сучасні комп’ютерні технології», 2013  – Одеса: ОНАЗ ім. О.С. Попова, 2013. – 37 с.
  2.  Середа розробки BlueJ> = 3 (http://www.bluej.org/)
  3.  SwiXML 2.01 (http://www.swixml.org/)  


Додаток А. Програмний код для обробки XML файлу з налаштуваннями програми

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.DocumentBuilder;

import org.w3c.dom.Document;

import org.w3c.dom.NodeList;

import org.w3c.dom.Node;

import org.w3c.dom.Element;

import java.io.File;

import org.math.array.util.*;

import java.lang.Math.*;

import org.math.array.DoubleArray.*;

public class XMLInterface

{

   private static double dt;

   private static int inputs, outputs, xsize;

   private static double[][] ad, bd, c, d, ar, br, cr;

   private static int[] uplimits, downlimits;

   private static double[] unom, ynom, fmax;

   private final String OBJECT_FILE="data/object.xml";

   public static double getDt() {return dt;}

   public static int getInputs() {return inputs;}

   public static int getOutputs() {return outputs;}

   public static int getXsize() {return xsize;}

   public static int[] getUplimits() {return uplimits;}

   public static int[] getDownlimits() {return downlimits;}

   public static double[] getUnom() {return unom;}

   public static double[] getYnom() {return ynom;}

   public static double[] getFmax() {return fmax;}

   public static double[][] getAd() {return ad;}

   public static double[][] getBd() {return bd;}

   public static double[][] getC() {return c;}

   public static double[][] getD() {return d;}

   public static double[][] getAr() {return ar;}

   public static double[][] getBr() {return br;}

   public static double[][] getCr() {return cr;}

   /** *Метод для завантаження матриці в текстовому поданні до двовимірний

масив Java (s–рядок, columnDelimiter – роздільник cтовпців,

rowDelimiter – роздільник рядків)

*/

   private static double[][] readStringDouble (String s, String columnDelimiter, String rowDelimiter)

       {

           double[][] array;

           String[]rows = s.split (rowDelimiter);

           array = new double [rows.length][];

           for (int i=0; i<rows.length;i++)

           {

           String[]cols = rows[i].split (columnDelimiter);

           array[i]= new double[cols.length];

           for (int j=0;j<cols.length;j++)

           {

               array[i][j]=Double.parseDouble(cols[j]);

           }

       }

       return array;

   }

   public XMLInterface()

   {

       try

       {

       File fXmlFile = new File (OBJECT_FILE);

       DocumentBuilderFactory dbFactory =DocumentBuilderFactory.newInstance();

       DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();

       Document doc=dBuilder.parse (fXmlFile);

       doc.getDocumentElement ().normalize ();

       NodeList Nlc; Element Elements; String s;

       Nlc=doc.getElementsByTagName ("dt"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.dt=Double.valueOf (s);

       Nlc=doc.getElementsByTagName ("inputs"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.inputs=Integer.valueOf (s);

       Nlc=doc.getElementsByTagName ("outputs"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.outputs=Integer.valueOf (s);

       Nlc=doc.getElementsByTagName ("xsize"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.xsize=Integer.valueOf (s);

       Nlc=doc.getElementsByTagName ("ar"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.ar=readStringDouble (s, "\t", "\n");

       Nlc=doc.getElementsByTagName ("br"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.br=readStringDouble (s, "\t", "\n");

       Nlc=doc.getElementsByTagName ("cr"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.cr=readStringDouble (s, "\t", "\n");

       Nlc=doc.getElementsByTagName ("ad"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.ad=readStringDouble (s, "\t", "\n");

       Nlc=doc.getElementsByTagName ("bd"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.bd=readStringDouble (s, "\t", "\n");

       Nlc=doc.getElementsByTagName ("c"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.c=readStringDouble (s, "\t", "\n");

       Nlc=doc.getElementsByTagName ("d"); Elements = (Element) Nlc.item(0);

       s = Elements.getChildNodes ().item (0).getNodeValue ().trim ();

       this.d=readStringDouble (s, "\t", "\n");

        this.uplimits = new int [this.outputs];

       Nlc = doc.getElementsByTagName ("uplimits");

       Elements = (Element) Nlc.item(0);

       s= Elements.getChildNodes ().item (0).getNodeValue().trim ();

       String [] ss;

       ss=s.split(",");

       for (int i=0;i<ss.length;i++)

        this.uplimits[i]=Integer.valueOf (ss[i].trim());

       this.downlimits = new int [this.outputs];

       Nlc = doc.getElementsByTagName ("downlimits");

       Elements = (Element) Nlc.item(0);

       s= Elements.getChildNodes().item (0).getNodeValue().trim ();

       ss=s.split(",");

       for (int i=0;i<ss.length;i++)

        this.downlimits[i]=Integer.valueOf (ss[i].trim());

       this.unom=new double[this.inputs];

       this.ynom=new double[this.inputs];

       this.fmax=new double[this.inputs];

       this.unom = new double [this.outputs];

       Nlc = doc.getElementsByTagName ("unom");

       Elements = (Element) Nlc.item(0);

       s= Elements.getChildNodes().item (0).getNodeValue().trim ();

       ss=s.split(",");

       for (int i=0;i<ss.length;i++)

       this.unom[i]=Double.valueOf (ss[i].trim());

       this.ynom = new double [this.outputs];

       Nlc = doc.getElementsByTagName ("ynom");

       Elements = (Element) Nlc.item(0);

       s= Elements.getChildNodes().item (0).getNodeValue().trim ();

       ss=s.split(",");

       for (int i=0;i<ss.length;i++)

       this.ynom[i]=Double.valueOf (ss[i].trim());

       this.fmax = new double [this.outputs];

       Nlc = doc.getElementsByTagName ("fmax");

       Elements = (Element) Nlc.item(0);

       s= Elements.getChildNodes().item (0).getNodeValue().trim ();

       ss=s.split(",");

       for (int i=0;i<ss.length;i++)

       this.fmax[i]=Double.valueOf (ss[i].trim());

       // initialise instance variables

   }

   catch (Exception e)

   {

       System.out.println (e.getMessage());

       e.printStackTrace();

   }

   }

}


Додаток Б. Програмний код класу Controller

import java.util.TimerTask;

import java.util.Timer;

import java.lang.Math.*;

import org.math.array.DoubleArray.*;

import static org.math.array.LinearAlgebra.*;

import java.io.*;

public class Controller extends TimerTask

{

   private static int inputs, outputs, xsize;

   private static double[][] ad, bd, c, d;

   private static double[][] ar, br, cr;

   private static double[][] z, f, u, u1, y, e, x, x1, xr, xr1;

   private static double[] unom, fmax;

   private static boolean manual=false;

   private static boolean work=true;

   private final String OBJECT_FILE="data/object.xml";

   public static boolean getManual() {return manual;}

   public static void setManual(boolean newVal) {manual=newVal;}

   public static boolean getWork() {return work;}

   public static void setWork(boolean newVal) {work=newVal;}

public static double getY(int output) {return y[output][0];}

   public static double getU(int input) {return u[input][0];}

   public static void setU(double val,int input) {u[input][0]=val;}

   public static double getZ(int output) {return z[output][0];}

   public static void setZ(double val,int output) {z[output][0]=val;}

   public Controller (int p_inputs, int p_outputs,int p_xsize, double[][] p_ad, double[][] p_bd,double[][] p_c, double[][] p_d, double[][] p_ar, double[][] p_br,double[][] p_cr,

   double[] p_fmax,double[] p_unom)

   {

   this.inputs=p_inputs;

   this.outputs=p_outputs;

   this.xsize=p_xsize;

   this.ar=p_ar;

   this.ad=p_ad;

   this.br=p_br;

   this.bd=p_bd;

   this.cr=p_cr;

   this.c=p_c;

   this.d=p_d;

   this.fmax=p_fmax;

   this.unom=p_unom;

 /**

   Код ініціалізує поля об'єктта таким чином, щоб

розмірності масивів полів збігалися з матрицями об'єкта і регулятора:

*/

   this.z=new double [p_outputs][1];

   this.f=new double [p_inputs][1];

   this.u=new double [p_inputs][1];

   this.u1=new double [p_inputs][1];

   this.y=new double [p_outputs][1];

   this.e=new double [p_outputs][1];

   this.x=new double [this.c[0].length][1];

   this.x1=new double [this.c[0].length][1];

   this.xr=new double [this.ar[0].length][1];

   this.xr1=new double [this.cr[0].length][1];

}

   public void run()

{

     if(work)

    {

       for(int i=0;i<inputs;i++)

       f[i][0]=Math.random()*fmax[i];

          if(!manual)

       {

           e=minus(y,z);

           u=times(cr,xr);

       xr=times (ar,xr);

       xr1=times(br,e);

       xr=plus(xr,xr1);

       }

x=times(ad,x);

       u1=plus(u,f);

       x1=times(bd,u1);

       x=plus(x,x1);

       y=times(c,x);       

    }

}

}


Додаток В. Програмний код класу Application

public class Application

{

public static XMLInterface xml=new XMLInterface();

public static GUI gui=new GUI();

public static java.util.Timer controller=new java.util.Timer();

public Application()

   {

try

     {

int period=(int)(1000*xml.getDt());

     controller.schedule (new Controller (xml.getInputs(),

xml.getOutputs(),xml.getXsize(),xml.getAd(),xml.getBd(),xml.getC(),

xml.getD(),xml.getAr(),xml.getBr(),xml.getCr(),xml.getFmax(),

xml.getUnom() ),  0,period);

     }

catch (Exception e)

   {

e.printStackTrace();

   }

   }

public static void main(String[]args)

   {

new Application();

   }

}


Додаток Г. Програмний код класу GUI

import javax.swing.*;

import java.awt.*;

import java.net.*;

import java.io.*;

import java.util.*;

import java.awt.image.BufferedImage;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

import javax.imageio.ImageIO;

import javax.swing.table.DefaultTableModel;

import java.text.SimpleDateFormat;

import org.swixml.SwingEngine;

import static org.math.array.DoubleArray.*;

public class GUI

{

private static XMLInterface xml;

private static Controller c;

private static int [] uplimits,downlimits;

private JFrame mainDialog,aboutDialog,graphDialog,zadDialog;

private JPanel graphPanel;

private JTextPane about_txtDescr;

private JLabel picLabel;

private JButton btn_start, btn_contol, btn_graph, btn_z1, btn_about;

private JButton cmdChangeMode, cmdShowGraph;

private JProgressBar pry1, pry2, pru1, pru2;

private JLabel lby1, lby2;

private JSpinner spu1, spu2, spz1,spz2;

private JTable logTable;

private DefaultTableModel tablemodel;

private javax.swing.Timer timer;

private static final String MAIN_DESCRIPTOR="forms/main_window.xml";

private static final String ABOUT_DESCRIPTOR="forms/about.xml";

private static final String GRAPH_DESCRIPTOR="forms/graph.xml";

private static final String ZAD_DESCRIPTOR="forms/zad_window.xml";

private static final String SCHEME_FILE="img/tech_scheme.png";

private static final String HTML_FILE="docs/description.html";

private static final String CONTENT_TYPE="text/html; charset=utf-8";

private SwingEngine swix=new SwingEngine (this);

public void logEvent (String msgtype, String msgtext)

  {       

      String TIME_FORMAT_NOW = "HH: mm: ss";

      String DATE_FORMAT_NOW = "dd. MM. yy";

      Calendar cal = Calendar.getInstance();

      SimpleDateFormat sdf1 = new SimpleDateFormat(TIME_FORMAT_NOW);

      SimpleDateFormat sdf2 = new SimpleDateFormat(TIME_FORMAT_NOW);

String[] data = {sdf1.format (cal.getTime()),

          sdf2.format (cal.getTime()), msgtype, msgtext};

          tablemodel.addRow (data);

   }

public void initMainDialog() throws Exception

  {

try

      {       

mainDialog=(JFrame)swix.render(MAIN_DESCRIPTOR);

mainDialog.setResizable(false);

final Toolkit toolkit=Toolkit.getDefaultToolkit();

final Dimension screenSize=toolkit.getScreenSize();

final int x=(screenSize.width-mainDialog.getWidth())/2;

final int y=(screenSize.height-mainDialog.getHeight())/2;

   mainDialog.setLocation(x,y);

   BufferedImage myPicture=ImageIO.read(new File(SCHEME_FILE));

picLabel.setIcon(new ImageIcon(myPicture));

   SpinnerModel sm1=new SpinnerNumberModel(70,0,100,1);

   SpinnerModel sm2=new SpinnerNumberModel(70,0,100,1);

spu1.setModel(sm1);

spu2.setModel(sm2);    

tablemodel = new DefaultTableModel ()

       {

          @Override

public boolean isCellEditable (int row, int column)

          {

return false;

          };

      };

tablemodel.addColumn("Час");

tablemodel.addColumn("Дата");

tablemodel.addColumn("Тип");

tablemodel.addColumn("Повідомлення");

logTable.setModel(tablemodel);

logTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);

logTable.getColumnModel().getColumn(0).setMaxWidth(80);

logTable.getColumnModel().getColumn(0).setMinWidth(80);

logTable.getColumnModel().getColumn(0).setWidth(80);

logTable.getColumnModel().getColumn(0).setPreferredWidth(80);

logTable.getColumnModel().getColumn(1).setMaxWidth(80);

logTable.getColumnModel().getColumn(1).setMinWidth(80);

logTable.getColumnModel().getColumn(1).setWidth(80);

logTable.getColumnModel().getColumn(1).setPreferredWidth(80);

logTable.getColumnModel().getColumn(2).setMaxWidth(120);

logTable.getColumnModel().getColumn(2).setMinWidth(120);

logTable.getColumnModel().getColumn(2).setWidth(120);

logTable.getColumnModel().getColumn(2).setPreferredWidth(120);

}

catch (Exception e)

   {

       System.out.println ("Error in main");

e.printStackTrace();

   }

  }

public void initAboutDialog() throws Exception

  {       

aboutDialog=(JFrame)swix.render(ABOUT_DESCRIPTOR);

aboutDialog.setResizable(false);

aboutDialog.setAlwaysOnTop(true);

final Toolkit toolkit=Toolkit.getDefaultToolkit();

final Dimension screenSize=toolkit.getScreenSize();

final int x=(screenSize.width-aboutDialog.getWidth())/2;

final int y=(screenSize.height-aboutDialog.getHeight())/2;

   aboutDialog.setLocation(x,y);

   Stringfilename=this.getClass().getClassLoader().getResource(HTML_FILE).toString();

   about_txtDescr.setContentType(CONTENT_TYPE);

   about_txtDescr.setPage(new URL(filename));

   }

public void initZadDialog() throws Exception

  {

zadDialog=(JFrame)swix.render(ZAD_DESCRIPTOR);

zadDialog.setResizable(false);

zadDialog.setAlwaysOnTop(true);

final Toolkit toolkit=Toolkit.getDefaultToolkit();

final Dimension screenSize=toolkit.getScreenSize();

final int x=(screenSize.width-zadDialog.getWidth())/2;

final int y=(screenSize.height-zadDialog.getHeight())/2;

   zadDialog.setLocation(x,y);

double ynom[]=XMLInterface.getYnom();

int uplimits[]=XMLInterface.getUplimits();

int downlimits[]=XMLInterface.getDownlimits();

   SpinnerModel sm1=new SpinnerNumberModel (ynom[0],downlimits[0], uplimits[0],1);

   SpinnerModel sm2=new SpinnerNumberModel (ynom[1],downlimits[1], uplimits[1],1);

spz1.setModel(sm1);

spz2.setModel(sm2);

   }

public GUI()

  {

try

       {

initAboutDialog();

initMainDialog();

initPlotDialog();

initZadDialog();

mainDialog.setVisible(true);

javax.swing.Timer t= new javax.swing.Timer(1000,new ClockListener());

t.start();

logEvent("Управління","процесзапущено");

logEvent("Управління","Контролервключено");

       }

catch(Exception e)

      {

          System.out.println ("error in gui");

e.printStackTrace();

      }

  }

public void initPlotDialog()throws Exception

   {

int uplimits[]=XMLInterface.getUplimits();

int downlimits[]=XMLInterface.getDownlimits();

graphDialog=(JFrame) swix.render(GRAPH_DESCRIPTOR);

graphDialog.setContentPane(Graph.createGraphPanel());//(downlimits[0], uplimits[0],downlimits[1], uplimits[1]));

   }

public Action AC_MANUAL=new AbstractAction()

  {

public void actionPerformed(ActionEvent e)

{

if(!c.getManual())

logEvent("Управление","Контроллеротключен");

else

logEvent("Управление","Контроллер включен");

c.setManual(!c.getManual());

if(c.getManual())

cmdChangeMode.setText("включитьконтроллер");

else

cmdChangeMode.setText("отключитьконтроллер");

}

   };

public Action AC_CLOSE_ABOUTDIALOG=new AbstractAction()

  {

public void actionPerformed(ActionEvent e)

      {

aboutDialog.setVisible(false);

      }

   };

public Action AC_ABOUT=new AbstractAction()

  {

public void actionPerformed(ActionEvent e)

      {

aboutDialog.setVisible(true);

      }

   };

public Action AC_GRAPH=new AbstractAction()

  {

public void actionPerformed(ActionEvent e)

      {

graphDialog.setVisible(true);

      }

      };   

public Action AC_ZAD=new AbstractAction()

  {

public void actionPerformed(ActionEvent e)

      {

zadDialog.setVisible(true);

      }

      };

public Action AC_WORK=new AbstractAction()

  {

public void actionPerformed(ActionEvent e)

      {

if(c.getWork()) logEvent ("Управлiння","Процесзупинений");

else logEvent("Управлiння","Процес запущено");

c.setWork(!c.getWork());

       }

   };

public Action AC_SETZ=new AbstractAction()

  {

public void actionPerformed(ActionEvent e)

      {

double ynom[]=XMLInterface.getYnom();

c.setZ(Double.valueOf(spz1.getValue().toString())-ynom[0],0);

c.setZ(Double.valueOf(spz2.getValue().toString())-ynom[1],1);

zadDialog.setVisible(false);

       }   

  };

class ClockListener implements ActionListener

 {       

public void actionPerformed(ActionEvent e)

     {

if(c.getWork())

           {

double ynom[]=XMLInterface.getYnom();

double unom[]=XMLInterface.getUnom();

int uplimits[]=XMLInterface.getUplimits();

int downlimits[]=XMLInterface.getDownlimits();

lby1.setText(String.format("%.2f",c.getY(0)+ynom[0]));

lby2.setText(String.format("%.2f",c.getY(1)+ynom[1]));

pry1.setMaximum(uplimits[0]);

pry1.setMinimum(downlimits[0]);

pry1.setValue((int)(c.getY(0)+ynom[0]));

pry2.setMaximum(uplimits[1]);

pry2.setMinimum(downlimits[1]);

pry2.setValue((int)(c.getY(1)+ynom[1]));  

Graph.addY(c.getY(0)+ynom[0],c.getY(1)+ynom[1]);

               if((c.getY(0)+ynom[0])>uplimits[0]||(c.getY(0)+ynom[0])<downlimits[0])

{

             if(pry1.isVisible())logEvent("Аварийное","Параметр у1 вышел за регламент");

pry1.setVisible(false);

lby1.setForeground(Color.red);

             }

else

         {

if(!pry1.isVisible())logEvent("Аварийное","Параметру1 вернулсяврегламент");  

pry1.setVisible(true);

lby1.setForeground(Color.black);

pry1.setMaximum(uplimits[0]);

pry1.setMinimum(downlimits[0]);

pry1.setValue((int)(c.getY(0)+ynom[0]));

         }

if(Controller.getManual())

           {

spu1.setEnabled(false);

c.setU(Double.valueOf(spu1.getValue().toString())-unom[0],0);

spu2.setEnabled(false);

c.setU(Double.valueOf(spu2.getValue().toString())-unom[1],1);

           }

else

           {

spu1.setEnabled(false);

spu2.setEnabled(false);

spu1.setValue(c.getU(0)+unom[0]);

spu2.setValue(c.getU(1)+unom[1]);

}

       }     

 }

}

}


Додаток Г. Програмний код класу Graph

import java.awt.Color;

import java.text.SimpleDateFormat;

import javax.swing.JPanel;

import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.axis.DateAxis;

import org.jfree.chart.axis.NumberAxis;

import org.jfree.chart.axis.ValueAxis;

import org.jfree.chart.plot.CombinedDomainXYPlot;

import org.jfree.chart.plot.XYPlot;

import org.jfree.chart.renderer.xy.StandardXYItemRenderer;

import org.jfree.data.time.Second;

import org.jfree.data.time.TimeSeries;

import org.jfree.data.time.TimeSeriesCollection;

public class Graph

{

private static TimeSeries s1 = new TimeSeries("Первый параметр");

private static TimeSeries s2 = new TimeSeries("Второй параметр");

public static void addY(double y1, double y2)

   {

s1.addOrUpdate(new Second(), y1);

s2.addOrUpdate(new Second(), y2);        

   }

public static JPanel createGraphPanel()

   {

       TimeSeriesCollection data1 = new TimeSeriesCollection();

data1.addSeries(s1);

      TimeSeriesCollection data2 = new TimeSeriesCollection();

data2.addSeries(s2);

       CombinedDomainXYPlot plot = new CombinedDomainXYPlot(new DateAxis("Время"));

       NumberAxisy1 = newNumberAxis("Температуравоздуха");

XYPlot subplot1 = new XYPlot(data1, null, (ValueAxis)y1, new StandardXYItemRenderer());

       ((XYPlot)subplot1).setBackgroundPaint(Color.lightGray);

       ((XYPlot)subplot1).setDomainGridlinePaint(Color.white);

       ((XYPlot)subplot1).setRangeGridlinePaint(Color.white);

     NumberAxis y2= new NumberAxis("Температура в баке");

       XYPlot subplot2 = new XYPlot(data2, null, (ValueAxis)y2, new StandardXYItemRenderer());

       ((XYPlot)subplot2).setBackgroundPaint(Color.lightGray);

       ((XYPlot)subplot2).setDomainGridlinePaint(Color.white);

       ((XYPlot)subplot2).setRangeGridlinePaint(Color.white);        

plot.setGap(10.0);

plot.add(subplot1, 1);

plot.add(subplot2, 1);

       Object localObject2 = plot.getDomainAxis();

       ((ValueAxis)localObject2).setAutoRange(true);

       ((ValueAxis)localObject2).setFixedAutoRange(20000.0D);

       ((DateAxis)localObject2).setDateFormatOverride(new SimpleDateFormat("hh:mm:ss"));

       JFreeChart chart = new JFreeChart("Переходные процессы",

                             JFreeChart.DEFAULT_TITLE_FONT, plot, false);

      ChartPanel panel = new ChartPanel(chart);

panel.setFillZoomRectangle(true);

panel.setMouseWheelEnabled(true);

return panel;

   }

}

Додаток E. Вхідні дані

A=

-0,0819672131147541 0 0 0 0 0

0,666666666666667 -0,666666666666667 0 0 0 0

0 0 -0,0588235294117647 0 0 0

0 0 0,232558139534884 -0,232558139534884 0 0

0 0 0 0 -0,0666666666666667 0

0 0 0 0 0,111111111111111 -0,111111111111111

B=

-0,0860655737704918 0

0 0

-0,0100000000000000 0

0 0

-0,0406666666666667 0

0 0

C=

0 1 0 1 0 0

0 0 0 0 1 0

D=

0 0

0 0

Додаток Ж. Файл «Object»

<object>

<ad>

0.997940159142844 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0.998051393337722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0.993460676534894 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0.996398063410476 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0.996867144463366 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0.998797910028875 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0.998557665492701 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0.0723887513260287 0 0 0 0 0 0 0.952652920002443 -0.104372034359910 0 0 0 0 0 0 0 0 0 0 0 0

0.000263413853481821 0 0 0 0 0 0 0.00704511231929394 0.999620335464402 0 0 0 0 0 0 0 0 0 0 0 0

0 0.108467245438702 0 0 0 0 0 0 0 0.988019998120709 -0.00664221428228571 0 0 0 0 0 0 0 0 0 0

0 0.000392311669443165 0 0 0 0 0 0 0 0.00717359142486857 0.999975983828824 0 0 0 0 0 0 0 0 0 0

0 0 -0.749218536022010 0 0 0 0 0 0 0 0 0.836510409420170 -1.27016060264010 0 0 0 0 0 0 0 0

0 0 -0.00278708605294306 0 0 0 0 0 0 0 0 0.00661541980541721 0.995280484750183 0 0 0 0 0 0 0 0

0 0 0 0.00164761477271889 0 0 0 0 0 0 0 0 0 0.946841204832646 -0.131698111348332 0 0 0 0 0 0

0 0 0 6.00311236042267e-06 0 0 0 0 0 0 0 0 0 0.00702389927191105 0.999520449371979 0 0 0 0 0 0

0 0 0 0 0.0196400578148558 0 0 0 0 0 0 0 0 0 0 0.929546570870761 -0.232020021256054 0 0 0 0

0 0 0 0 7.17711707621612e-05 0 0 0 0 0 0 0 0 0 0 0.00696060063768163 0.999152577247577 0 0 0 0

0 0 0 0 0 0.165878545802951 0 0 0 0 0 0 0 0 0 0 0 0.971408931074331 -0.0379380134456368 0 0

0 0 0 0 0 0.000601578130258672 0 0 0 0 0 0 0 0 0 0 0 0.00711337752105691 0.999862441158559 0 0

0 0 0 0 0 0 0.00543261492887296 0 0 0 0 0 0 0 0 0 0 0 0 0.982429829189095 -0.0143007469227067

0 0 0 0 0 0 1.96659334251561e-05 0 0 0 0 0 0 0 0 0 0 0 0 0.00715335278362894 0.999948244169411

</ad>

<bd>

0 0.00720944300004582 0 0

0 0.00720984465042990 0 0

0 0.00719325581161589 0 0

0 0 0.00720387317904707 0

0 0 0 0.00720556773425944

0.00721253982675032 0 0 0

0 0 0 0.00721167253649357

0 0.000263413853481821 0 0

0 6.36334315205760e-07 0 0

0 0.000392311669443165 0 0

0 9.44855799035736e-07 0 0

0 -0.00278708605294306 0 0

0 -6.80641586212806e-06 0 0

0 0 6.00311236042267e-06 0

0 0 1.45110215469251e-08 0

0 0 0 7.17711707621612e-05

0 0 0 1.73743969411584e-07

0.000601578130258672 0 0 0

1.45080628529544e-06 0 0 0

0 0 0 1.96659334251561e-05

0 0 0 4.73843600198855e-08

</bd>

<c>

10.2857142857143 0 0 0 0 0 0 -13.3333333333333 0 0 0 0 0 0 0 0 0 0 0 0 0

0 15.1351351351351 0 0 0 0 0 0 0 -3.33333333333333 0 0 0 0 0 0 0 0 0 0 0

0 0 -113.636363636364 0.235000000000000 2.82608695652174 0 0 0 0 0 0 -48 0 -15 0 -20 0 0 0 0 0

0 0 0 0 0 23.3333333333333 0.760000000000000 0 0 0 0 0 0 0 0 0 0 -8 0 -4.89795918367347 0

</c>

<d>

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

</d>

<ar>

-0.376791067252983 -0.0320746710074346 -0.00591418753780583 -0.000216013667176789 2.65615280055542e-06 0.00591415395484232 0.000239704311402658 2.97585825434386 -4.67875962863949 27.7000065217113 -0.596837079235925 0.000364682484123724 -0.000589390371627980 -23.6549215813282 -0.00357448839023463 -0.00258469319500443 -2.41544614724875e-16

0.363538616114759 0.980222608327703 -0.00364671560719955 -0.000133195034216696 1.63779619955809e-06 0.00364669489978769 0.000147802795889932 1.83492807280093 -2.88494499895836 17.0799531561237 -0.368012525455445 0.000224864919826279 -0.000363420850828532 -17.6162547576245 -0.00220404620532143 3.02892609967462 -2.75405629731526e-14

0.00327000796478182 7.72430752774134e-05 0.989438797429050 -2.90894518867766e-05 -1.15092689214916e-07 -1.96477134989826 -3.23500878244196 0.0971803292023966 0.0945405824751596 -0.511142681307783 0.0113664673171382 140.556336558110 -227.167511524794 0.184065022898842 -1377.70692327511 -0.0271758491020660 2.11676448774695e-14

0.00198590212795663 4.69103406522022e-05 1.20603812025196 0.999982339521297 -6.98967155082766e-08 -1.19322143760329 -1.96464684312735 0.0590183952568575 0.0574152558457777 -0.310421059957973 0.00690294698837542 85.3609932681506 -137.960656181399 3.14519884066098 -836.692491302595 -3.04991878402138 -1.20288289184002e-12

0.000803317795899378 1.89757143250511e-05 0.732422958509434 1.21244074509788 0.999999971726061 -0.482670319841812 -0.794719815001980 0.0238735467009341 0.0232250603530429 -0.125568505202605 0.00279231291504668 34.5293980013550 -55.8065015814785 -6429.06792777003 -338.450701314358 6429.10646953098 -5.11746993308096e-09

0.00326099831658847 7.70302522686876e-05 0.000110837130662651 4.47799671884448e-06 -6.79799439218363e-08 -0.975492407595181 -3.22615723955483 0.0969125743263054 0.0942801007279378 -0.509734361883248 0.0113351500014523 140.169070484947 -226.541611104415 0.156456906879853 -1373.95366688032 -1.20128375777475e-15 0.0426532255958133

0.00198225459499329 4.68241798029631e-05 6.73742793531279e-05 2.72202825960997e-06 -4.13227923243519e-08 0.0116180548034450 -0.961075839796418 0.0589099953820035 0.0573098004784925 -0.309850905450975 0.00689026825344189 85.2042095916813 -137.707262001504 0.0951050544870286 -865.137163340556 -7.10648519732164e-14 29.9814363121129

0.00491083331268726 0.000117241264271551 -5.26013754921935e-05 -1.92124716133495e-06 2.36240886738083e-08 5.26010768019571e-05 2.13195412059367e-06 0.887860947796605 -0.0470231791559411 0.246366628530234 -0.00530832867775450 3.24352248896300e-06 -5.24209691547740e-06 0.0231796531309853 -3.17918572588653e-05 -0.233591880136015 -5.32295916254207e-16

0.00556516751032503 0.000132647600838396 -2.16528842306846e-05 -7.90864154666279e-07 9.72464412428369e-09 2.16527612775290e-05 8.77599783777458e-07 1.13794161181213 0.979509178548869 0.101414611993577 -0.00218512586871231 1.33516692854469e-06 -2.15786215806670e-06 -0.0498270109043962 -1.30868327676280e-05 -0.0367872943191738 -5.75357060638614e-15

1.17351390462677e-11 2.77203676108554e-13 1.42363314283370e-08 3.51763688595168e-08 5.75565285259413e-08 -7.05101187321346e-09 -1.16095368227602e-08 3.48752874009678e-10 3.39279565312975e-10 0.952279787012197 -0.000631126484534470 5.04417166902369e-07 -8.15240318448567e-07 0.223966014221748 -4.94420272973483e-06 -0.223966013658717 -1.19579212323668e-15

2.85127291504859e-12 6.73518507555816e-14 4.32798634967372e-09 1.42741633648133e-08 3.51764730916700e-08 -1.71317605172932e-09 -2.82075549070919e-09 8.47360751149690e-11 8.24343564564760e-11 1.18336223453967 0.999614278255870 1.22557645052505e-07 -1.98077980165669e-07 0.495007627747063 -1.20128704254155e-06 -0.495007627610264 -7.28160882566533e-14

8.95603411528602e-07 2.11556554236185e-08 3.04404058844654e-08 1.22984091031566e-09 -1.86700708743736e-11 0.000269784946772679 0.000426874528782274 2.66161536315849e-05 2.58931687948667e-05 -0.000139993888115093 3.11309544682915e-06 0.922053447858048 -0.0660205749234188 4.29694608690230e-05 -0.173283544521810 6.42733011789805e-17 -0.204048570219412

2.73344112341783e-07 6.45684661127816e-09 9.29061414762941e-09 3.75355617926997e-10 -5.69822969053178e-12 0.000166058532125961 0.000541907115798665 8.12342694849789e-06 7.90276717221142e-06 -4.27270648900078e-05 9.50137416399943e-07 1.15264627681045 0.978657771620877 1.31145649953217e-05 -10.3488667169357 -1.27936386259991e-14 10.2337024482044

0.0150000000000000 0.000357142857142857 0 0 4.86381322957198e-08 0 0 -0.240000000000000 0 -0.0800000000000000 0 0 0 0.242594642997404 4.18574686719818e-17 0.757405357002596 -4.18574686719818e-17

0 0 0 0 0 0 0.00115076923076923 0 0 0 0 -0.200000000000000 0 1.14765050504959e-16 0.252086886988512 -1.14765050504959e-16 0.747913113011488

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

</ar>

<br>

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

1 0

0 1

</br>

<cr>

-1.11011010559534 -0.0276577799275837 -0.00513269184430285 -0.000187469805563115 2.30517103650908e-06 0.00513266269896348 0.000208029988280877 2.58263088450164 -4.06051232461945 24.0397513018112 -0.517971536984485 0.000316493651927106 -0.000511508830964109 -20.5314235870238 -0.00310215854516518 0 0

0.00271151544252805 6.40505447383635e-05 9.21609158362543e-05 3.72344787575340e-06 -5.65252262745991e-08 -1.62920332722837 -2.68249385468714 0.0805826671311608 0.0783937690941055 -0.423843393847428 0.00942516103610378 116.550381903401 -188.369026061759 0.130093694601691 -1142.40504548359 0 0

</cr>

<dt>1.21</dt>

<inputs>2</inputs>

<outputs>2</outputs>

<xsize>21</xsize>

<uplimits>60,75</uplimits>

<downlimits>1,0</downlimits>

<unom>1,0.2</unom>

<ynom>50, 70</ynom>

<fmax>1, 0.1</fmax>

</object>




1. Методика построения эвольвентного профиля зубьев
2. Гадание
3. Реферат- Вексель и вексельное обращение
4. 2013 г
5. жрецівбізнесменів
6. .Принципы составления дифференциальных уравнений
7. Уровень эффекта финансового рычага Расчет ежемесячных платежей
8. 2011 уч. год УЧЕБНЫЕ ПОСОБИЯ И МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ ДЛЯ САМОСТОЯТЕЛЬНОЙ ПОДГОТОВКИ СТУДЕНТОВ ЛЕЧЕБНОГО И П.html
9. вариант ответа который наиболее соответствует Вашему мнению либо впишите свой ответ там где предложен вари
10. х годов ученые все большего числа университетских и промышленных исследовательских лабораторий устрем
11. диффузия заимствованное из физики означает
12. ГОСУДАРСТВЕННОЕ И МУНИЦИПАЛЬНОЕ УПРАВЛЕНИЕ И МЕНЕДЖМЕНТ А file----F--АНАТОЛИЙ ГЛАВНАЯ-14
13. реферат дисертації на здобуття наукового ступеня кандидата психологічних наук2
14. Эволюция вычислительных сете
15. Институт управления
16. 05 Гарантии и ограничения прав и свобод в зарубежных странах
17. RendezVous [4
18. Меир Голда
19. 2007 Cоставители- дмн профессор Ю
20. Типовое проектирование ИС