[ Прилад прийому та обробки метеорологічних даних ] | В |
|
| ||
Вартість | 5 | 5 | 5 | 15 | 26,78 |
Простота використання | 4 | 5 | 5 | 14 | 25 |
Надійність | 5 | 5 | 4 | 14 | 25 |
Швидкість обробки даних | 5 | 4 | 4 | 13 | 23.21 |
РАЗОМ | 23 | 24 | 23 | 56 | 100 |
Виходячи з даних таблиці 2.2.1, можна зробити висновок про те, що такі фактори як вартість і простота використання є найбільш важливими, а сегмент A та Б (спеціалізовані метеорологічні установи, сільське господарство) ринку висувають найбільш високі вимоги до сукупності якісних параметрів виробу, що розроблюється.
8.2.3 Аналіз конкурентоздатності
За наявними в розроблювачів відомостями розроблений прилад має аналоги, але існуючі розробки поступаються йому за деякими показниками.
Для аналізу конкурентоздатності виробу розрахуємо узагальнений показник технічного рівня (якості) віробу, що проектується. Для цього порівняємо абсолютні значення його параметрів з параметрами системи збору та обробки метеорологічних даних „Іон”.
Відносні одиничні показники Qi визначаємо за формулами:
Qi = Pi / Pia або Qi = Pia / Pi,
де Pia і Pi – абсолютні значення i-го показника пристрою-аналога і пристрою, що проектується.
Перша формула вибирається якщо збільшення показника означає поліпшення якості виробу, а друга формула якщо навпаки.
Узагальнений показник технічного рівня (якості) виробу, що проектується, розраховуємо за формулою:
Qt = S (Qi × Mi ),
де Mi – коефіцієнт вагомості i-го показника
Результати розрахунків зводимо у таблицю 8.4.
Таблиця 8.4 – Розрахунок узагальненого показника технічного рівня віробу
Технічні параметри | Одиниця вимірювання | Абсолютне значення параметрів | Qi | Mi | Qi × Mi | |
|
| Виріб | Аналог |
|
|
|
Імовірність безвідмовної роботи | % | 90 | 85 | 1,06 | 0,1 | 0,106 |
Тактова частота мікроконтролера | МГц | 4 | 1 | 4,0 | 0,1 | 0,4 |
Максимальний радіус дії між модулем та приладом | км | 5 | 3 | 1,66 | 0,5 | 0,83 |
Маса | г | 200 | 220 | 1,1 | 0,15 | 0,165 |
Споживана потужність | Вт | 4 | 5 | 1,25 | 0,15 | 0,187 |
РАЗОМ | 1 | 1,688 |
Qt = 1,688
Оскільки 1,688 > 1, то технічний рівень виробу, що проектується, вище за рівень аналога. Отже розробка і виробництво даного пристрою є доцільною і перспективною.
8.3 Розрахунок затрат на розробку виробу (передвиробничі затрати)
Ці затрати включають витрати, пов’язані з маркетинговими дослідженнями, конструкторською, технологічною, організаційною підготовками виробництва та інші витрати по освоєнню нового виробу.
Розрахунок витрат на основну заробітну плату розробників наводиться в таблиці 8.5 (пайова участь керівника приймається у розмірі 20% від посадового окладу).
Таблиця 8.5 – Розрахунок витрат на основну заробітну плату
Посада | Оклад, грн./міс. | Число місяців | Пайова участь, % | Сума, грн. |
Керівник теми | 850 | 4 | 20 | 680 |
Інженер | 500 | 4 | 100 | 2000 |
РАЗОМ | 2680 |
Розрахунок матеріальних передвиробничих витрат наводиться у таблиці 8.6.
Таблиця 8.6 – Розрахунок вартості матеріалів для розробки
Найменування матеріалів | Норма витрати, шт. | Ціна за 1шт, грн. | Сума, грн. |
Ватман, лист A1 | 6 | 2 | 12 |
Папір, лист А4 | 500 | 0,04 | 20 |
Карандаш | 2 | 1,5 | 3 |
Ластик | 1 | 1,5 | 1,5 |
Папка для паперів | 1 | 5 | 5 |
Файл | 10 | 0,15 | 1,5 |
РАЗОМ | 43 |
За цими видами затрат складається кошторис. Розрахунки за ним для виробу, що проектується, зводимо у таблицю 8.7.
Таблиця 8.7 – Кошторис затрат на розробку виробу
№ п.п. | Статті затрат (витрат) | Сума, грн |
1. | Основна заробітна плата розробників | 2680 |
2. | Доплати та надбавки до основної заробітної плати (10% від п.1) | 268 |
3. | Відрахування на соціальні заходи у тому числі: а) відрахування на медичне страхування (2,9% від п.1+п.2) б) пенсійний фонд (32% від п.1+п.2) в) відрахування у фонд зайнятості (2,1% від п.1+п.2) г) страхування по травматизму (0,84% від п.1+п.2) |
85,5 943,36 61,91 23,58 |
4. | Інші прямі витрати: а) на пошук інформації (в т.ч. у мережі Internet) б) матеріальні витрати |
50 43 |
5. | Накладні витрати (75% від п.1) | 2010 |
УСЬОГО: умовно-постійні затрати | 6165,35 |
8.4 Розрахунок договірної ціни виробу
Для розрахунку договірної ціни виробу, що проектується, складається калькуляція його собівартості.
Розрахунок вартості сировини та матеріалів наведено у таблиці 8.8.
Таблиця 8.8 – Розрахунок вартості сировини та матеріалів
Найменування | Марка, розмір | Одиниця вимірювання | Норма витрати на виріб | Ціна за одиницю, грн | Сума, грн |
Плата | Гетінакс (150´100) | шт | 1 | 5 | 5 |
Припій | ПОС-60 | гр | 20 | 0,05 | 1 |
Захисне покриття | Лак епоксидний | мл | 80 | 0,1 | 8 |
УСЬОГО | 14 |
Розрахунок вартості покупних напівфабрикатів та комплектуючих виробів наведено у таблиці 8.9.
Таблиця 8.10 – Розрахунок вартості покупних напівфабрикатів та комплектуючих виробів
Найменування | Стандарт | Кількість, шт | Ціна за одиницю, грн | Сума, грн |
Мікросхема | XE1201A | 1 | 30 | 30 |
Мікросхема | IW4053B | 1 | 2 | 2 |
Мікросхема | TLC139 | 1 | 3 | 3 |
Мікросхема | 74ASL86 | 1 | 1 | 1 |
Мікросхема | SN7432 | 1 | 1 | 1 |
Конденсатор | 805 NPO Ni 100нФ | 8 | 0,5 | 4 |
Конденсатор | 805 NPO Ni 2,5 пФ | 6 | 0,5 | 3 |
Конденсатор | 805 NPO Ni 10 нФ | 4 | 0,5 | 2 |
Резистор | ОМЛТ | 15 | 0,2 | 3 |
Діод | BFQ67 | 1 | 0,5 | 0,5 |
Діод | BC808 | 1 | 0,5 | 0,5 |
Корпус |
| 1 | 5 | 5 |
Антена |
| 1 | 2 | 2 |
Кварц 4 Мгц |
| 1 | 5 | 5 |
Катушка індуктивності | 0805SC-xxx-X | 8 | 0,8 | 6,4 |
Кріпіжний елемент |
| 10 | 0,1 | 1 |
Рознімання | DB-25F | 1 | 4 | 4 |
УСЬОГО | 111,5 |
Розрахунок заробітної плати виробничих робітників наведено у табл. 8.11.
Таблиця 8.11 – Розрахунок заробітної плати виробничих робітників
Найменування робіт та операцій | Норма часу на операцію, нормо-год | Роздяд роботи | Погодинна тарифна ставка і-го розряда, грн. | Основна заробітна плата, грн. |
Свердлування | 0,5 | 2 | 3,3 | 1,65 |
Розведення плати | 1 | 4 | 4,5 | 4,5 |
Розташування елементів на платі | 0,5 | 2 | 3,3 | 1,65 |
Пайка | 0,5 | 3 | 4,05 | 2,03 |
Нанесення захисного шару | 0,5 | 2 | 3,3 | 1,65 |
УСЬОГО | 11,48 |
Розрахунок договірної ціни виробу наведено у таблиці 8.12.
Таблиця 8.12 – Розрахунок договірної ціни виробу
№ п.п. | Статті затрат (витрат) | Сума, грн | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. | Основні матеріали | 14 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2. | Транспортні витрати на них (20% від п.1) | 2,8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3. | Покупні та комплектуючі вироби | 111,5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4. | Транспортні витрати на них (15% від п.3) | 16,725 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5. | Основна заробітна плата (ОЗП) | 11,48 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6. | Доплати та надбавки до основної заробітної плати (30% від ОЗП) | 3,44 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7. | Відрахування на соціальні заходи (37,5% від п.5+п.6) | 5,6 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8. | Витрати на утримання та експлуатацію обладнання (75% від ОЗП) | 8,61 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9. | Загальновиробничі витрати (90% від п.5) | 10,33 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10. | 0,92 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11. | Інші виробничі витрати (10% від п.1+…+п.10) | 17,52 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12. | Виробнича собівартість (п.1+…+п.11)
8.5 Розрахунок річних витрат споживача Річні експлуатаційні витрати включають витрати на заробітну плату обслуговуючого персоналу, витрати на поточний ремонт та інші витрати. Розрахунок цих витрат проводиться по виробу-аналогу та по виробу, що проектується. Розрахунок заробітної плати персоналу, обслуговуючого виріб-аналог та виріб, що проектується, наведено у таблиці 8.13. Таблиця 8.13 – Розрахунок заробітної плати обслуговуючого персоналу
Доплати та надбавки приймаємо в розмірі 12% від основної зарплати: Аналог: ЗДоп = 0,12 × 945 = 113,4 (грн) Проект: ЗДоп = 0,12 × 945 = 113,4 (грн) Відрахування на соцзабезпечення становлять 50% від основної зарплати: Аналог: ЗСоц = 0,5 × 945 = 472,5 (грн) Проект: ЗСоц = 0,5 × 945 = 472,5 (грн) Річна сума амортизаційних відрахувань визначається за відповідними нормами амортизації (в дипломі становлять 10%) від первинної вартості виробу, що включає договірну ціну виробу та затрати на транспортування (в дипломі становлять 5% від договірної ціни). Первинна вартість виробу – це капітальні витрати для споживача (К). Аналог: К = 350 + 0,05 × 350 = 367,5 (грн) Проект: К = 339,58 + 0,05 × 339,58 = 356,55 (грн) Річна сума амортизаційних відрахувань становить: Аналог: UАморт = 0,1 × 367,5 = 36,75 (грн) Проект: UАморт = 0,1 × 356,55 = 35,65 (грн) Витрати на поточний ремонт виробів включають вартість вузлів, мікросхем, радіодеталей, які виходять з ладу на протязі року, а також вартість монтажних та демонтажних робіт, пов’язаних з їх заміною. У дипломному проекті витрати на поточний ремонт приймаються укрупнено у розмірі 5% від суми капітальних витрат. Аналог: Uрем = 0,05 × 367,5 = 18,37 (грн) Проект: Uрем = 0,05 × 356,55 = 17,82 (грн) Результати розрахунків річних витрат споживача зводимо у таблицю 8.14. Таблиця 8.14 – Річні експлуатаційні витрати споживача.
Розрахуємо ціну споживача. Ціна споживача (Цспож) – це витрати споживача за термін служби виробів, що порівнюються, які включають капітальні витрати (К) та сумарні експлуатаційні витрати (Uекс). Ціна споживача розраховується за формулою: Цспож = К + Uекс × Т, де Т – передбачуваний термін служби виробів, що порівнюються, років. Аналог: Цспож = 367,5+ 1956,69× 10 = 19934,4 (грн) Проект: Цспож = 356,55+ 1943,21× 10 = 19778,65 (грн) 8.6 Розрахунок інтегрального показника конкурентоздатності Кількісною мірою конкурентоздатності може виступати інтегральний показник конкурентоздатності (Qкон), який визначається груповими показниками конкурентоздатності виробів: Qкон = Qнп × Qт / Qе , де Qнп – груповий показник за нормативними параметрами (жорсткими); Qт – порівняльна конкурентоздатність виробу за його технічним рівнем (див. табл. 2.3.1); Qе – груповий показник конкурентоздатності за економічними показниками. Груповий показник за нормативними (жорсткими) параметрами може приймати два значення: нуль, якщо виріб не відповідає обов’язковим для даного ринку нормам та стандартам (частота та напруга живлення, рівні вхідних та вихідних сигналів та ін.); одиниця, якщо виріб відповідає вищезазначеним нормам. В нашому випадку Qнп = 1. Конкурентоздатність за економічними показниками Qе визначається відношенням ціни споживача виробу, що проектується, до ціни споживача виробу-аналога: Qе = Цспож.пр / Цспож.ан = 19778,65 / 19934,4 = 0,984 Інтегральний показник конкурентоздатності дорівнює: Qкон = 1 × 1,688 / 0,984 = 1,715 Так як 1,715> 1, то виріб, що проектується, цілком конкурентоздатний. 8.7 Аналіз стратегії маркетингу Стратегія маркетингу, є одним з основних розділів техніко-економічного обгрунтування виробу, що розробляється. Зміст цього розділу дозволяє визначити основні напрями діяльності при збуті товару. 8.7.1 Схема розповсюдження виробів Даний виріб буде постачатися безпосередньо споживачам, що припускає стимулювання продажу і організацію реклами. Стимулювання продажу виконується за допомогою таких методів: гарантійне обслуговування на протязі двох років; безкоштовні консультації з експлуатації виробу; безкоштовні пуско-налагоджувальні роботи. 8.7.2 Організація реклами Даний продукт розроблявся на замовлення окремої організації для власних потреб і первинно не призначався для масового виробництва, але після опробування його в дії була висунута пропозиція по розповсюдженню його іншим споживачам. Враховуючи специфіку продукту, що розробляється, реклама повинна здійснюватись серед потенційних споживачів продукту. Їм демонструються основні можливості та характеристики цього виробу. Реклама продукту буде розповсюджуватися через електронну пошту, власну Інтернет-сторінку підприємства та шляхом публікації у спеціальних інформаційних виданнях (каталогах). Рекламна компанія буде тривати 3 роки. Розсилка електронних листів потенційним споживачам (приблизно 30) буде здійснюватись раз на квартал. Вартість 1 Мб переданої інформації – 0,5 грн. Об’єм листа – 750 Кб. Витрати на електронну рекламу за весь період складуть – 135 грн. Вартість розміщення однієї сторінки у каталозі “ProSoft” – 500 грн. Каталог виходить два рази на рік. Витрати на рекламу в каталогах за весь період складуть – 3000 грн. Кошти, витрачені на рекламну компанію за весь період складуть – 3135 грн. 8.7.3 Прогнозування об’єму продаж Так як підприємство зацікавлено у стабільності випуску продукту, то треба спрогнозувати мінімальний (Nmin), максимальний (Nmax) та найбільш імовірний (Nнайб.ім) об’єм продаж. Припустимо, що: Nmin = 100 шт. Nmax = 140 шт. Nнайб.ім = 120 шт. Очікуване значення об’єму продаж можна розрахувати за формулою: Nоч = (Nmax + 4 × Nнайб.ім + Nmin) / 6 Nоч = (140 + 4 × 120 + 100) / 6 = 120 (шт) Дисперсія об’єму продаж розраховується за формулою: D = (Nmax – Nmin) / 6 D = (140 – 100) / 6 = 6,66 Очікуваний об’єм продаж може бути реалізований на протязі 2-3 років. 8.8 Визначення беззбитковості виробництва Для визначення беззбитковості виробництва слід використовувати формулу: Nбез = С / (Ц – А), де С – загальна сума умовно-постійних витрат, пов’язаних з маркетинговими дослідженнями, розробкою та освоєнням виробу, що проектується, та реклами, грн. (див. п. 3); Ц – відпускна (договірна) ціна виробу, грн.; А – сума умовно-змінних витрат у собівартості виробу, що проектується, грн. (сума п.1+…+п.10 в калькуляції собівартості виробу). Розрахуємо точку беззбитковості: Nбез = 6165,35 / (339,58 – 169,18) = 37,96 » 36,18 (шт.) Тобто, треба продати 36 виробів і тільки після цього підприємство перестане бути збитковим і почне отримувати прибуток. Виходячи з цього побудуємо графік беззбитковості, який наведений на рис. 8.1. Рисунок 8.1 – Графік беззбитковості. Таблиця 8.15 – Аналіз впливу різних варіантів цін на досягнення беззбитковості виробництва.
Таблиця 8.16 – Залежність прибутку від ціни та можливого збуту.
Висновки У даній роботі був розроблений прилад прийому метеорологічних даних, який є складовою частиною метеорологічного комплексу. Технічні рішення, що були запропоновані при розробці, повністю задовільняють вимогам, які висувалися до приладу прийому інформації та метеокомплексу вцілому. Були розроблені та апаратно реалізовані протоколи обміну даними між окремими модулями метеорологічного комплексу. Запропоноване конструкторське виконання приладу дозволяє твердити про його зручність та надійність у використанні. Проведений техніко-економічний аналіз розробки дозволяє зробити висновок про доцільність розробки і продажу продукту “прилад прийому та обробки метеорологічних даних” на ринку. Розрахована ємність ринку та передбачуваний обсяг продажів носять умовний характер і можуть бути розширені за рахунок модернізації і просування товару на нові сегменти ринку. Перелік посилань 1. www.gaw.ru. 2. www.xemics.com. 3. www.microhip.ru. 4. www.adn.com. 5. www.proma.narod.ru. 6. www.pic.com. 7. www.ixbt.com 8. Скороделов В.В. «Особенности проектирования МКУ и архитектура микро-контроллеров PIC» - Харків, 1999. – 234с. 9. ДСТУ 3008-95 . Документация. Отчеты в сфере науки и техники. Структура и правила оформления. К. “Госстандарт Украины”. 10. Яземський О.С. “Основи економічного аналізу” К.: 1998 МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ “ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ” Кафедра “обчислювальна техніка та програмування” Затверджую : Завідуючий кафедрою “ОТП” ______________ xxxxxxx. “___”________________ 2005р Прилад прийому та обробки метеорологічних даних Пояснювальна записка Лист затвердження XXXXXX 99092-00-81 ЛЗ Консультанти: Науково-дослудна робота: ___________доц. xxx.Ф Економічна частина: ___________доц. xxxxxxxx. Охорона праці і навколишнього середовища ___________ст.викл. xxxxxx. Розробники: Керівник проекту: проф. xxxxx. “___”_________2005р Виконавець: xxxx. “___”_________2005р Харків 2005 ЗАТВЕРДЖЕНО xxxxx 99092-00-81 ЛЗ Прилад прийому та обробки метеорологічних даних Пояснювальна записка xxxxx 99092-00-81 Листів 28 Харків 2005 Зміст Вступ 1 Призначення та галузь застосування 2 Постановка задачі 2.1 Вимоги до програмного виробу 2.2 Вибір програмних засобів для реалізації задачі 3 Об’єктно-орієнтований підхід при вирішенні задачі 3.1 Структура програми 3.2 Класи з полями та інкапсульованими методами 4 Організація обміну даними по розробленому протоколу 4.1 Структура вхідного пакету даних 4.2 Прийом даних 4.3 Структура вихідного пакету даних 4.4 Передача даних 5 Додаткові можливості програми 5.1 Збереження отриманих даних 6 Аналіз прийнятих даних 7 Охорона праці та навколишнього середовища 7.2 Аналіз небезпечних і шкідливих факторів 7.1 Характеристика виробничого середовища приміщення 7.3 Виробнича санітарія 7.4 Забезпечення виробничого освітлення 7.5 Шум 7.6 Вiпромiнювання вiд екрана 7.7 Техніка безпеки 7.8 Пожежна безпека Висновки Список літератури Вступ Сучасний розвиток комп’ютерної техніки, технологій та методів програмування передбачає появлення нових програмних комплексів, що здатні вирішувати майже будь-яку задачу. При цьому, якщо розглядати увесь обсяг програмного забезпечення, що випускається, написання спеціалізованого програмного забезпечення буде займати перше місце. При цьому перед початком написання такої програми, в умовах наявності дуже великої кількості засобів, пакетів, мов програмування буде гостро стояти проблема вибору мови програмування, що здатна вирішувати саме конкретну спеціалізовану задачу. Обрана мова програмування java 1.4 вирішує відразу декілька поставлених задач: можливість зручно зберігати дані, що отримані від приладу прийому метеорологічних данних для подальшого їх використання; надає користувачеві можливість зручного перегляду даних, що були отримані; дозволяє зручно керувати метеорологічним комплексом, та бути інформованим про помилки, що можуть бути викликані під час роботи; до токож java містить потужний графічний інтерфейс для відображення інформації у реальному відрізку часу. Усі ці переваги надають можливість подальшого розширення прикладної програми для її вдосконалення та надання нових можливостей. Також стандартна бібліотека javax.comm містить всі необхідні засоби для роботи в усіх режимах lpt-порту, через який відбувається надходження даних, тобто завантаження інших програмних засобів для вирішення задачі роботи з метеорологічним комплексом не знадобиться. Значною перевагою данної програми є те, що вона є платформо-незалежною, переносимою програмою, тобто дана програма працюватиме як з операційною системою Windows, так, скажімо й з Unix. 1. Призначення та галузь застосування Дана програма є спеціалізованим програмним виробом, що входить до складу метеорологічного комплексу. Призначення програми – надання користувачеві можливості керування метеорологічним комплексом; отримання та оперування результатами інформації, що надходить від модулів збору метеорологічної інформації. Програма призначена для встановлення на переносному персональному комп’ютері (ноутбуці). Також можлива інсталяція й на стаціонарній (непереносній) робочій станції. Оскьліки даний програмний продукт є спеціалізованим програмним виробом, його призначенням є надання зручного інтерфейсу між користувачем (оператором) та модулями збору інформації, що входять до складу метеорологічного комплексу. 2. Постановка задачі 2.1 Вимоги до програмного виробу Постановка задачі вимогала виконання кінцевим програмним продуктом наступних вимог: приймання даних, що надходять з lpt-порту ПК; аналіз даних які були щойно прийняті; обчислення метеопоказників, на основі даних, отриманих від приладу збору метеорологічних даних; надання зручної індикації оброблених даних; можливість роботи з метеокомплексом у різних режимах; можливість підключення нових модулів збору інформації під час роботи програми; зручне збереження оброблених даних; імітацію входних сигналів від модуля збору інформації; можливість підстройки різних параметрів прийому під час роботи програми можливість „поширення” програми – додання нових функціональ-них можливостей без зміни структури програми. 2.2 Вибір програмних засобів для реалізації задачі Зручність роботи з прикладною програмою користувача завжди зумовлює собою зручний графічний інтерфейс програми. Тому для рішення цієї проблеми потрібно використовувати мову високого рівня з об’єктно-орієнтованим підходом, бо це відразу вирішує іншу проблему – проблему легкого масштабування програмного виробу. До того ж обраний програмний засіб мусить мати досить потужний математичний апарат для можливості обчислення та аналізу певних вхідних даних. Також слід врахувувати й вимогу до вводу вхідних даних для програми через lpt-порт, звідси виходить задача можливості керування портами вводу/виводу. Для рішення всіх вищезгаданих задач можна запропонувати мову програмування java, яка до того ж є платформонезалежною, тобто дана програма працюватиме як з операційною системою Windows, так, скажімо й з Unix. Серед інтегрованих сред розробки (Integrated Development Environment) можна виділити програмний продукт Borland JBuilder X, який є на сьогодняшній день є одним з найпотужніших. 3. Об’єктно-орієнтований підхід при вирішенні задачі Оскільки обрана мова програмування, як і більшість сучасних мов програмування високого рівня є об’єктно-орієнтованою, для написання програми будемо використовувати об’єктно-орієнтований підхід. Де головними питаннями є не „що робити” та „як робити”, а кто має виконувати ту чи іншу функції. 3.1 Структура програми Як і будь яка інша java-програма дана програма складається з класів, кожен з яких розміщується у конкретному пакеті. За своєю функціональністю класи програми поділені на три пакети: ui – містить класи для графічного відображення (user interface); util – допоміжні та утилітарні класи для роботи програми; obj – класи-структури даних для логічного та зручного оперування даними. 3.2 Класи з полями та інкапсульованими методами Розглянемо фізичні дані, з якими ми будемо оперувати. По-перше, інформація, що надходить. Її можна інкапсулювати у єдиний клас – WeatherData з наступними полями: номер модуля (moduleNumber); температура (temperature); атмосферний тиск(preasure); сила вітру(windPower); напрямок вітру(windDirection); контрольна сума(src); Також інкапсулюємо у класі методи для оперування з цими полями. По-друге, фізична модель модуля збору інформації може бути уособлена в класі Module. З наступними молями: номер модуля (moduleNumber); опис модуля (moduleDescription); інформація про погоду, що передається (weatherData). До того ж необхідні методи, що характеризуватимуть роботу модуля: sendModuleNumber() – посилає поточному модулю запит на відповідь – інформацію від погодних датчиків. createWeatherData(byte [] recivedBytes) – утворення об’єкта класу WeatherData; параметри byte [] recivedBytes – набір байтів, який є відповіддю поточного модуля на запит від керуючої програми. Також для роботи будь-якої програми необхіден набір утилітарних класів, які будуть допомідними під час виконання програми (пакет util). Розглянемо їх: Transmitter – клас, що відповідає за передачу даних. Він характеризується наступними полями: OutputStream out – вихідний поток, куди вестиметься передача; int PACKAGE_SIZE – розмір вихідного буфера для передачі даних. sendBytes (byte [] byte01) – метод для відправки пакету байтів до вихідного потока, параметри byte [] byte01 – набір вихідних байтів для передачі. Receiver – клас, що відповідає за прийом даних. Він характеризується наступними полями: InputStream out – вхідний поток, звідки вестиметься передача; int PACKAGE_SIZE – розмір вхідного буфера для прийому даних. byte [] readData() – метод для прийому пакету байтів до вхідного потока. Слід також зазначити, що клас Receiver реалізує інтерфейс Runnable, це означає, цо від призначений для щапуску у окремому потоці. Класи Transmitter та Receiver побудовані по шаблону Singletone, це означає, що що присутній лише єдиний екземпляр класу. І дійсно: непотрібно тримати у системі два класи для передачі або прийому даних, аби уникнути помилок при роботі програми. Наприклад для реалізації цього шаблону застосовується: private Receiver() { } public static Receiver getInstanse() {if (receiver != null) return receiver; receiver = new Receiver(); return receiver;} Скільки б раз ми не викликали метод getInstanse(), ми працюватимемо з одним й тим самим екземпляром класу. Розробка інших утилітарних класів. При роботі програми, що проектується можливі виникнення двох умовних типів помилок: перша група – некритична, тобто помилка, що не заважатиме нормальному ходу виконання програми. Очевидно дії при її виникнені мають носити суто інформаційний характер для користувача; наприклад «помилка рпи передачі даних». друга група – критичні помилки, при виникненні яких подальша робота програми є неможлиивою, та необхідно робити терміновий вихід з програми; наприклад «lpt-порт не знайдено», або «помилка при спробі відкрити порт на запис». Для зручної обробки цих помилок у класі BadEvent передбачено два статичних методи: public static void throwCriticalEvent(Exception ex, Component sourse, String message) public static void throwNonCriticalEvent(Exception ex, Component sourse, String message) параметри: Exception ex – клас помилки, Component sourse – джерело помилки, String message – повідомлення про помилку. У класі Helper інкапсульовані допоміжні методи для роботи програми, а також методі, призначені для роботи програми у тестовому режимі. public static byte[] integerToBytes(int number) – перевід числа до послідовності бітів, придатних для передачі до lpt-порту при даному протоколі передачі; параметри int number – число для передачі. public static byte [] testStringIntoBytes(int moduleNumber) – перевід тестової строки, взятої з файлу для імітації сигналів, отриманої від модуля. Також він містить константи для підстройки програми під час роботи. 4. Організація обміну даними по розробленому протоколу 4.1 Структура пакету даних Розробимо структуру вхідного пакету даних, згідно з набором даних, що будуть надходити від приладу збору метеорологічних даних. Розглянемо набір даних, з яким будемо оперувати температура; атмосферний тиск; сила вітру; напрямок вітру. Формат даних про температуту (рис. 4.1.1): хххх хххх хххх хххх Рис 4.1.1. Формат даних про температуру, що надходять. Формат даних про атмосферний тиск – 16 біт, що відображують абсолютне значення атмосферного тиска у мм. рт. ст. Інформацію про силу та напрямок вітру отримуємо у вигляді послідовності трьох шістнадцятибітних чисел, за допомогою яких будуть обчислені ці показники (рис 4.1.2): хххх хххх хххх хххх - показання від датчику вітру (1) хххх хххх хххх хххх - показання від датчику вітру (2) хххх хххх хххх хххх - показання від датчику вітру (3) Рис. 4.1.2. Інформація від датчику сили та напрямку вітру. Також включимо до пакету даних номер модуля, від якого були отримані дані та передана контрольна сума, завдяки чому можемо перевірити відсутність помилок під час передачі даних, обчисливши власну контрольну суму від усіх погодних показників (рис 4.1.3). хххх хххх хххх хххх - температура хххх хххх хххх хххх - атм. тиск хххх хххх хххх хххх - показання від датчику вітру (1) хххх хххх хххх хххх - показання від датчику вітру (2) хххх хххх хххх хххх - показання від датчику вітру (3) хххх хххх хххх хххх - обчислена контрольна сума Рис 4.1.3. Обчислення контрольної суми Тобто контрольна сума обчислюється прямим сумуванням всіх показників за модулем «2», та порівняється є контрольною сумою, яка щойно була передана. Також при організації обміну даними слід передбачити наявність бітової послідовності, що слугуватиме сигналом для початку аналізу бітової послідовності, яка надходить від зовнішнього пристрою, та формування інформаційного пакету. Для цього додамо до початку вхідної бітової послідовності (пакету даних) комбінацію з восьми логічних одиниць – „стартову” послідовність біт. Тепер можемо представити структуру пакету, яка являє собою послідовність біт (4.1.4): СП код модуля температура атм. тиск дані про вітер контр. сума Рис 4.1.4. Структура пакету, що приймається. Де СП – стартова вхідна послідовність. Тобто, для вхідний пакет даних буде являти собою бітову послідовність, довжиною 112 біт. 4.2 Прийом даних Розглянемо організацію приймання данних. Інформація надходить на контакти рознімання паралельного порту ПК (SR7 – Busy, SR5 – PaperOut), які належать до 5-бітного порту уведення сигналів стану принтера. Інформація з них може бути програмно зчитана з використанням методів isBusy() isPaperOut(), які вернуть true або false при наявності на розніманнях високого або низького рівня сигналів відповідно. Для приймання даних у ініціалізуючому методі initData() запускається на виконання окремий поток, що буде „стежити” за зміною рівнів сигналів на розніманнях паралельного порту. receiver = Receiver.getInstanse(); receiver.setOwner(this); new Thread(receiver).start(); У класі Receiver метод run() циклічно опитує рівень сигналу на розніманні SR5 (наявність синхронізуючого сигналу), викликаючи метод isPaperOut(), якщо метод вертає true, починається приймання даних (опит рівня сигналу на розніманні SR7, метод isBusy()), після чого програмно встановлюється низький рівень синхронізуючого сигналу setPaperOut(false). Починаємо аналіз бітової послідовності, що надходить. Якщо в результаті приймання винаходим послідовність з восьми одиниць – накопичуємо вхідні дані у буфер: b = isBusy() ? 1 : 0; buffer[counter++] = b; коли буфер заповнюється (counter == PACKAGE_SIZE), закінчуємо приймання даних, та „руйнуємо” поток, що читає дані (receiver.interrupt()). Поток, що читає дані буде знов запущений на виконання при наступному виклику метода askModule() – тобто при необхідності приймання даних від наступного модуля збору інформації. 4.3 Структура вихідного пакету даних Необхідність передачі даних виникає, коли керуюча програма подає запит до чергового модулю збору метеорологічних даних. При цьому інформація, що має передаватися – є код модуля, який має бути зараз опитаний. Для задання коду модуля використаємо вісьми бітну послідовність даних, тобто максимальний номер модуля, який зможе обслуговувати програма буде дорівнювати 256. Також необхідно передати певну стартову послідовність біт, бо метеокомплекс може працювати в умовах сторонніх перешкод. Для задання стартової послідовності (СП) використаємо послідовність з восьми біт, тоді пакет даних, що пересилатиметься матиме наступну структуру (рис. 4.3.1): 1111 1111 хххх хххх Стартова Код модуля послідовність Рис. 4.3.1. Вихідний інформаційний пакет даних. Тобто, для вхідний пакет даних буде являти собою бітову послідовність, довжиною 16 біт. 4.4 Передача даних Для передачі даних використовуються контакти рознімання паралельного порту, що працюють на вивід інформації (DR0 для передачі логічного сигналу „0”, DR0 для передачі логічного сигналу „1”, СR2 для передачі логічного сигналу „синхронізація”). Перед початком передаі даних у ініціюючомуметоді initData() виконується утворення класу-передавача, що відповідатиме за передачу даних: transmitter = Transmitter.getInstance(); transmitter.setOut(out); transmitter.setOwner(this); Передача даних починається при виклику метода askModule(). Для передачі інформації програма виконує наступні дії: 1. Програмно встановлюється високий рівень сигналу Select Input# (CR3), тим самим переключаючи порт у режим запису даних, цей же сигнал й передається на вхід приємопередавача RX/TX, переключаючи його у режим передачі даних (метод setPrinterSelect(true)). 2. До lpt-порту програмно записується байт 00000001, що символізує передачу „0”, або 00000010, що символізує передачу „1”, тим самим з’являються відповідні сигнали на виходах DR0 або DR1 (this.getOut().write(byte01)). 3. 5. Дається програмна затримка (40 мкс) – для витримування рівня сигналу DR0 або DR1 (Thread.sleep(0, 40000)). 4. Програмно встановлюється високий рівень сигналу CR3 (Select Input#) для підтвердження посилки наступного біту інформації (setInputSelect(true)). 5. Дається програмна затримка (10 мкс) – для витримування рівня сигналу CR3 (Thread.sleep(0, 10000)). 6. Програмно встановлюється низький рівень сигналу CR3 (Select Input#) для кінця підтвердження (setInputSelect(true)). 7. Програмно встановлюється низький рівень сигналу Select Input# (CR3), тим самим переключаючи порт у режим читання даних, цей же сигнал й передається на вхід приємопередавача RX/TX, переключаючи його у режим прийому даних (метод setPrinterSelect(false)). 5. Додаткові можливості програми 5.1 Збереження отриманих даних Для збереження результатів роботи користувача з програмою запропоновано збереження результатів опитування певного модуля у текстовий файл (метод saveResultsToFile(String fileName, WeatherData dataToSave)) При цьому, інформація, що зберігається має наступний формат:
Якщо користувач вирішить зберігти інформацію, отриману від щойно опитаного модулю, він обирає опцію „зберігти у файл”. Програма додасть інформацію про щойно отриманий модуль до вказаного текстового файлу. 6. Аналіз прийнятих даних Розглянемо дані, що надійшли від модуля збору: - температура; - атмосферний тиск; - сила вітру; - напрямок вітру; При отриманні пакету даних від модуля збору, утворюється модель даних (клас WeatherData), що інкапсулює у собі поля та методи по обробці, аналізу, обчисленню та відокремленню даних із вхідного пакету даних. WeatherData data = createWeatherData(byte [] recivedBytes) data.initValues(); Температура (метод calculateTemperature(byte[] temperature)). Дані, про температуру що надійшли мають такий формат (рис 4.1). Знак температури („+” або „–”) визначається аналізом перших чотирьох біт („0000” – „+”; „1111” – „–”). Значеня температури у градусах цельсія визначається аналізом наступних восьми біт (0..255). Дробна частина знаходиться шляхом аналізу наступних чотирьох біт. Наприклад, проаналізувавши бітову послідовність 0000 0000 1100 1000, отримуємо +12,50С. Атмосферний тиск (метод calculatePreasure(byte[] preasure)). Значення атмосферного тиску у міліметрах ртутного стовпчика знаходиться шляхом аналізу шістнадцяти біт, які були виділені з вхідного інформаційного пакету. Наприклад, проаналізувавши бітову послідовність 0000 0101 1111 0000, отримуємо 760 мм. рт. ст. Напрямок та сила вітру (метод calculateWind(byte[] wind)) Напрямок та силу вітру отримуємо у вигляди частот, розкладених по вісям полярної системи координат від датчика сили й напрямку вітру наступним чином:
(1)
(2) де f1, f2, f3 – дані від датчику вітру (рис. 4.1.2). При цьому
, якщо fi > 2; (3) , якщо fi < 2. Формули, що застосовуються при роботі з комплексними числами:
(4) Застосовуючи формули 1, 4 суму v1+v2+v3 можна представити як:
(5) Тому для знаходження сили вітру застосуємо формулу: (6) Для знаходження напрямку вітру застосуємо формулу:
(7) Для виконання всих вищезгаданих операцій у середовищі java, скористаємося статичними методами класу Math. Після обчислення показників сили та напрямку вітру, вони заносяться до відповідних полей класу WeatherData. 7. Охорона праці та навколишнього середовища При виконанні роботи використовується ПЕОМ, бо результатом роботи має бути пакет конструкторської документації для виготовлення апаратури, тому питання охорони праці розглядаються щодо забезпечення здорових і безпечних умов роботи оператора і науковця при проектуванні дослідження об'єкта. 7.1 Характеристика виробничого середовища приміщення, де виконується проектна робота Приміщення міститься на третьому поверсі триповерхового будинку. Площа приміщення повинна розраховуватись у відповідності з наступними вимогами: на одне робоче місце повинно відводитися 6 м2, об’єм 20 м3. Комп’ютери повинні розміщуватися на відстані не менше 1 м від стін. Відстань між боковими поверхнями комп’ютерів не повинна бути менше 1,2 м. Відстань між тильною поверхнею одного комп’ютера та екраном іншого – 2,5 м. Категорія будинку за пожежонебезпекою – категорія В [1]. До цієї категорії належать приміщення, в яких знаходяться тверді пальні речовини та матеріали (при запаленні стороннім джерелом продовжують горіти після його зникнення). Клас приміщення за пожежонебезпекою П-IІа [2]. Ступінь вогнестійкості будівельних конструкцій триповерхового будинку з категорією пожежонебезпеки В – I та II [3]. Клас приміщення за ступінем небезпеки ураження електричним струмом – приміщення з підвищеною небезпекою, тому що в ньому є можливість одночасного дотику людини до маючих з’єднання з землею металоконструкцій будинку, технологічним апаратом, механізмом та ін. з одного боку, та до металевих конструкцій – з іншого [2]. Помешкання повинно бути свiтлим, сухим i теплим. Пiдлоги роблять рiвними, без вибоїв, щiльними, мають не слизьку i зручну для чищення поверхню, i утримуються в чистотi. Радiатори i трубопроводи опалювальної i водопровiдної систем обладнуються дiелектриками (дерев’яними i т.д.) i закриваються огородженнями. Не можна застосовувати огородження з шаруватого паперового пластика i т.п. Характеристика електричної мережі, що живить електроустаткування, приміщення: перемінний струм, частота 50 Гц, напруга 220 В, режим нейтралі – глухозаземлена нейтраль, споживча потужність комп’ютера 300 Вт. 7.2 Аналіз небезпечних і шкідливих факторів У відповідності до ГОСТ 12.0.003–74 [4] при розробці системи, що виконується на комп’ютері, на людину впливають небезпечні та шкідливі фактори, перелік яких приведений в таблиці 4.1. Таблиця 7.1. – Перелік небезпечних та шкідливих факторів
7.3 Виробнича санітарія Працівники обчислювального центра піддаються впливові шкідливих і небезпечних факторів виробничого середовища, електромагнітних полів, статичної електрики, шумів . Оператори зазнають психоемоційної напруги. Метеорологічні умови на виробництві або мікроклімат визначають наступні параметри: температура (°C), рухливість (м/с), відносна вологість повітря (%) і інтенсивність теплового випромінювання. З урахуванням параметрів мікроклімату метеоумови в приміщенні поділяються на оптимальні та допустимі. У відповіді до ГОСТ 12.1.005–88 [6] встановлюються оптимальні умови, при виборі яких враховується пора року та категорія роботи. За затратами енергії розробка продукту є легкою фізичною роботою (сидяча робота, не потребує фізичного напруження) – категорія 1а. Але дипломна робота характеризується напруженою розумовою працею. Тому обрані оптимальні параметри мікроклімату, що наведені у таблиці 7.2. Таблиця 7.2. – Оптимальні праметри мікроклімату
Приміщення обладнане системами опалення, кондиціювання повітря та припливно-витяжною вентиляцією відповідно до СНиП 2.04.05-91 [7]. 7.4 Забезпечення виробничого освітлення При освітленні виробничих приміщень використовується природне освітлення, створюване світлом неба (пряме та відбите) , штучне, здійснюване електричними лампами, та комбіноване. Природне освітлення підрозділяють на бічне, верхнє, комбіноване. В приміщенні використовується бічне природне освітлення, що здійснюється крізь бічні вікна. Воно повинне забезпечувати коефіцієнт природної освітленності (КПО) не нижче 1,5% [5]. Нормовані значення КПО для будинків, розташованих у IV поясі світлового клімату визначаються за формулою:
де – значення КПО для III поясу світлового клімату складає 1,5, m – коефіцієнт світлового клімату (для міста Харкова m=0,9%), c – коефіцієнт сонячності клімату (с=1). =1,5*0,9*1=1,35% Загальне освітлення повинно бути рівномірним. Штучне освітлення приміщення з робочими місцями, обладнаними відеотерміналами ЕОМ загального та персонального користування, має бути обладнане системою загального рівномірного освітлення. Даний вид штучного освітлення і використовується на моєму робочому місці. Дані по нормах освітлення для створення умов нормальної роботи середньої точності містяться у таблиці 7.3. Таблиця 7.3. – Характеристика виробничого освітлення
Загальне освітлення має бути виконане у вигляді суцільних або переривчатих ліній світильників, що розміщуються збоку від робочих місць (переважно зліва) паралельно лінії зору працівників. Допускається застосувати світильники таких класів світлорозподілу: - світильники прямого світла - П; - переважно прямого світла - Н; - переважно відбитого світла - В. Для загального освітлення необхідно застосовувати світильники із розсіювачами та дзеркальними екранними сітками або віддзеркалювача-ми, укомплектовані високочастотними пускорегулювальними апаратами (ВЧ ПРА). Допускається застосовувати світильники без ВЧ ПРА тільки при використанні моделі з технічною назвою "Кососвет". Застосування світильників без розсіювачів та екранних сіток забороняється. Як джерело світла при штучному освітленні повинні застосовуватися, як правило, люмінесцентні лампи типу ЛБ. При обладнанні відбивного освітлення у виробничих та адміністративно-громадських приміщеннях можуть застосовуватися метало галогенові лампи потужністю до 250 Вт. Допускається у світильниках місцевого освітлення застосовувати лампи розжарювання. Яскравість світильників загального освітлення в зоні кутів промінювання від 50 до 90 відносно вертикалі в подовжній і поперечній площинах повинна складати не більше 200кд/м , а захисний кут світильників повинен бути не бiльшим за 40. Коефіцієнт запасу (Кз) відповідно до СНиП 11-4-79 для світлювальної установки загального освітленняслід приймати рівним 1.4. Коефіцієнт пульсації повинен не перевищувати 5% і забезпечуватися застосуванням газорозрядних ламп у світильниках загального і місцевого освітлення. При відсутності світильників з ВЧ ПРА лампи багатолампових світильників або розташовані поруч світильники загального освітлення необхідно підключати до різних фаз трифазної мережі. Рівень освітленості на робочому столі в зоні розташування документів має бути в межах 300-500 лк. У разі неможливості забезпечити даний рівень освітленості забезпечити даний рівень освітленості системою загального освітлення допускається застосування світильників місцевого освітлення, але при цьому не повинно бути відблисків на поверхні та збільшення освітленості екрану більше ніж 300 лк. Світильники місцевого освітлення повинні мати напівпрозорий відбивач світла з захисним кутом не меншим за 40 . Необхідно передбачити обмеження прямої блискості від джерела природного та штучного освітлення, при цьому яскравість поверхонь, що світяться (вікна, джерела штучного світла) і перебувають у полі зору, повинна бути не більшою за 200 кд/м. Необхідно обмежувати відбиту блискість шляхом правильного вибору типів світильників та розміщенням робочих місць відносно джерел природного та штучного освітлення. При цьому яскравість відблисків на екрані відеотермінала на повинна перевищувати 40 кд/м , яскравість стелі при застосуванні системи відбивного освітлення не повинна перевищувати 200 кд/м. Необхідно передбачити нерівномірність розподілу яскравості в полі зору осіб, що працюють з відеотерміналом, при цьому відношення значень яскравості робочих поверхонь не повинно перевищувати 3:1, а робочих поверхонь і навколишніх предметів (стіни, обладнання) - 5:1. Необхідно використовувати систему вимикачів, що дозволяє регулювати інтенсивність штучного освітлення залежно від інтенсивності природного, а також дозволяє освітлювати тільки потрібні для роботи зони приміщення. Для забезпечення нормованих значень освітлення в приміщеннях з відеотерміналами ЕОМ загально та персонального користування необхідно очищати віконне скло та світильники не рідше ніж 2 рази на рік, та своєчасно проводити заміну ламп, що перегоріли. Виробничі приміщення, в яких розташовані ЕОМ, не повинні межувати з приміщеннями, де рівні шуму та вібрації перевищують норму (механічні цехи, майстерні тощо). За допомогою “Методических указаний к лабораторной работе по охране труда ”Исследование освещённости производственных помещений естественным светом” для студентов всех специальностей” [12] розрахуємо сумарну площу, що потрібна для забезпечення нормованих значень коефіцієнта природної освітленості. Сумарна площа визначається за формулою: (1) Де – світлова характеристика вікна; – коефіцієнт запасу, що враховує зниження освітленості в процесі експлуатації засклення; – площа підлоги приміщення; – коефіцієнт, враховуючий затемнення вікон будинками, що розміщені навпроти; –загальний коефіцієнт світлоперепускання.
Де – коефіцієнт, враховуючий вид світлоперепускного матеріалу; – коефіцієнт, враховуючий вид рами; – коефіцієнт, враховуючий вид несучих конструкцій покриттів; – коефіцієнт, враховуючий втрати світла в сонцезахисних пристроях; – коефіцієнт, враховуючий вплив відбитого світла при боковому освітленні; – нормоване значення КПО у відсотках з урахуванням зорової роботи, виду освітлення та світлового клімату в районі розташування будинку, було обчислено в цьому ж розділі раніше та дорівнює 1,35%. Визначимо світлову характеристику . Довжина приміщення , його глибина . Відношення . Висота приміщення від рівня умовної робочої поверхні (дорівнює 0,8м [12]) до верху вікна (верх вікна знаходиться в 0,4 м від стелі приміщення) . Відношення . Тому за додатком 8 [12]. Коефіцієнт запасу . Дипломна робота виконувалася в приміщенні житлового будинку. Світлоперепускний матеріал розташований вертикально. За таких умов (додаток 10 [12]). Площа підлоги приміщення . Визначимо загальний коефіцієнт світло перепускання . Вид світлоперепускного матеріалу – скло двійне віконне листове, а тому =0,8 (додаток 5 [12]). Вид рам – дерев‘яні двійні розділені у вікнах житлового будинку, через це =0,65 (додаток 5 [12]). Вид несучих конструкцій – залізобетонні арки. =0,8 (додаток 5 [12]). На вікнах приміщення є вертикальні стаціонарні жалюзі з захисним кутом 45° при розташуванні пластин жалюзі під кутом 90° до площі вікна. =0,75 (додаток 6 [12]). Тому загальний коефіцієнт світло перепускання:
Розрахуємо коефіцієнт , враховуючий вплив відбитого світла при боковому освітленні. Як обчислили раніше . Умовна точка знаходиться в 1м від зовнішньої стіни [12]. Тому відстань умовної точки від зовнішньої стіни . Відношення . Враховуючи світлову гаму офарблення стін, підлоги та стелі середньозважений коефіцієнт відбиття стелі, стін та підлоги . Відношення . за додатком 7 [12]. , через те що відсутні будинки, розташовані навпроти вікон (додаток 9 [12]). Обчислимо сумарну площу:
7.5 Шум У приміщеннях з ЕОМ рівні звукового тиску, рівні звуку та еквівалентні рівні звуку на робочих місцях повинні відповідати вимогам ГОСТ 12.1.003-83 "ССБТ Шум. Общие требования безопасности", СН 3223-85 "Санітарні норми допустимих рівнів шуму на робочих місцях з урахуванням напруженості та тяжкості праці", затверджених Міністерством охорони здоров'я України. Рівні шуму на робочих місцях осіб, що працюють з відеотермі- налами та ЕОМ, визначені ДСанПІН 3.3.2-007-98. Для забезпечення нормативних рівнів шуму у виробничих приміщеннях та на робочих місцях застосовуються шумопоглинальні засоби, вибір яких обґрунтовується спеціальними інженерно-акустичними розрахунками. Як засоби шумопоглинання повинні застосовуватися негорючі або важкогорючі спеціальні перфоровані плити, панелі, мінеральна вата з максимальним коефіцієнтом звукопоглинання в межах частот 31.-8000 Гц, або інші матеріали аналогічного призначення, дозволені для оздоблення приміщень органами державного санітарно-епідеміологічного нагляду. Крім того, необхідно застосовувати підвісні стелі з аналогічними властивостями. 7.6 Вiпромiнювання вiд екрана ВДТ генерує декілька типів випромінювання, у тому числі: гамма тормозне, рентгенівське, радіочастотне, мікроволнове, видиме, ультрафіолетове й інфрачервоне випромінювання. Рівні цих випромінювань не перевищують діючих норм. Вимоги щодо допустимих значень неіонізуючого електромагнітного випромінювання: напруженість електромагнітного поляна відстані 50 см. Навкруги ВДТ за електричною складовою не повинна перевищувати: у діапазоні частот 5 Гц - 2 кГц – 25 В/м, у діапазоні частот 2 кГц - 400 кГц – 2,5 В/м, – щільність магнітного потоку не повинна перевищувати: у діапазоні частот 5 Гц - 2 кГц – 250 нТл, у діапазоні частот 2 кГц - 400 кГц – 25 нТл, – поверхневий електростатичний потенціал не повинен перевищувати 500 В. Конструктивне рішення екрана дисплея таке, що рентгенівське випромінювання від екрана на відстані 10 см не перевищує 100 мкР/годину [8]. У помешканнях із дисплеями необхідно контролювати аероіонізацію. У таблиці 4 наведені рівні іонізації повітря робочої зони обчислювального центру (ОЦ). Таблиця 4.4 –Рівні іонізації повітря робочої зони ОЦ
Варто враховувати, що м'яке рентгенівське випромінювання, що виникає при напрузі на аноді 20-22 кВ, а також напруга на струмоведучих ділянках схеми викликає іонізацію повітря з утворенням позитивних іонів, що вважаються несприятливими для людини. 7.7 Техніка безпеки Тому що лабораторія, де знаходяться ЕОМ, не є помешканням із підвищеним утриманням механічних, теплових або радіаційних небезпек, але є споживачем електричної енергії (трифазна мережа перемінного струму напругою 220 В та частотою 50 Гц), то в даному помешканні є небезпека поразки людини електричним струмом. Тому при розгляді питань техніки безпеки обмежимося розглядом електробезпеки. Передбачено такі міри електробезпеки: – конструктивні заходи електробезпеки; – схемно-конструктивні заходи електробезпеки; – експлуатаційні заходи електробезпеки. Конструктивні заходи безпеки спрямовані на запобігання можливості дотику людини до струмоведучих частин. Для усунення можливості дотику оператора до струмоведучих частин, усі рубильники встановлені в закритих корпусах, усі струмоведучі частини поміщені в захисний корпус або мають захисний прошарок ізоляції, що виключає можливість дотику до них, застосовується блоковий монтаж. Живлячий електричний ланцюг має ізоляцію, виконану відповідно до ГОСТ 14254-80 [9]. Ступінь захисту устаткування відповідає IР44 (де 4 захист від твердих тіл розміром більш 1 мм; 4 – захист від бризок) відповідно до ПУЭ-87 [2]. Відповідно до ГОСТ 12.2.007.0-75* [10] приймаємо I клас захисту від поразки електричним струмом обслуговуючого персоналу тому, що комп'ютер має робочу ізоляцію й елементи занулення. Схемно-конструктивні заходи електробезпеки забезпечують безпеку дотику людини до металевих не струмоведучих частин електричних апаратів при випадковому пробої їхньої ізоляції і виникнення електричного потенціалу на них. Живлення здійснюється від трьох провідної мережі: фазовий дріт, нульовий робочий дріт, нульовий захисний дріт. Напруга менше 1000 В, але більше 42 В, то відповідно до ГОСТ 12.1.030-81* [11] із метою захисту від поразки електричним струмом застосовуємо занулення, тому що лабораторія – це помешкання із підвищеною небезпекою поразки людини електричним струмом, так як можливий одночасний дотик людини до металоконструкцій будинків і т.п., що мають з’єднання з землею з одного боку, і до металевих корпусів електронного устаткування – з іншого. Занулення – навмисне електричне з’єднання з нульовим захисним провідником металевих не струмоведучих частин, що можуть виявитися під напругою. Принцип дії занулення – перетворення пробою на корпус в однофазне коротке замикання з метою викликати великий струм, здатний забезпечити спрацьовування захисту і тим самим автоматично відключити ушкоджену установку від живлячої мережі. Таким захистом є: плавкі запобіжники, що здійснюють захист одночасно від струмів короткого замикання і перевантаження. Занулення потребує наявності в мережі нульового дроту, глухого заземлення нейтралі джерела струму і повторного заземлення нульового дроту (рис. 7.1). UФ IКЗ IКЗ IЗ Рис. 7.1. Принципова схема занулення Умовні позначення: 1 – корпус електроустановки; 2 – апарати захисту від струмів КЗ (запобіжники); Ro – опір заземлення середньої точки обмотки джерела струму; Rп – опір повторного заземлювача нульового захисного провідника; IКЗ – струм короткого замикання; Iн – частина струму короткого замикання, що протікає через нульовий захисний провідник; Iз – частина струму короткого замикання, що протікає через землю. По засобу захисту від поразки електричним струмом проектована система відноситься до I класу відповідно до ГОСТ 12.2.007.0-75* [10]. Призначення елементів занулення: – призначення нульового захисного провідника – забезпечити необхідне для відключення установки значення струму однофазного короткого замикання шляхом створення для цього струму ланцюга з малим опором; – призначення заземлення середньої точки – зниження напруги занулених корпусів (а отже, нульового захисного провідника) щодо землі до безпечного значення при замиканні фази на землю; –призначення повторного заземлення захисного провідника – зниження напруги щодо землі занулених конструкцій у період замикання фази на корпус як при справній схемі занулення, так і у випадку обриву нульового захисного дроту. Таким чином, занулення здійснює дві захисних дії – швидке автоматичне відключення ушкодженої установки від живлячої мережі і зниження напруги занулених металевих не струмоведучих частин, що виявилися під напругою, щодо землі. Первинним джерелом живлення ПЕОМ є трьохпровідна мережа: фазовий дріт, нульовий робочий дріт, нульовий захисний дріт. Електроживлення здійснюється від електроустановки (трансформатора) із регульованою напругою під навантаженням. Напруга мережі подається в розподільну шафу. У помешканні лабораторії прокладена шина повторного захисного заземлення (заземлюєчий провідник) виконана відповідно до ГОСТ 12.1.030 81* [11], що металево з’єднується з заземленою нейтраллю електроустаткування. Опір заземлюючого пристрою, до якого приєднана нейтраль, не більш 0,6 Ом. Шина повторного захисного заземлювача доступна для огляду. Для роботи з пристроями під високою напругою необхідні наступні запобіжні заходи: – не підключати і не відключати рознімання кабелів при напрузі мережі; – технічне обслуговування і ремонтні роботи допускається виробляти тільки при виключеному живленні мережі; – до роботи допускаються особи, які навчені і які мають групи допуску до роботи на машинах відповідно до ПУЭ-87 [2]. 7.8 Пожежна безпека Пожежна безпека – стан об'єкта при якому із установленою ймовірністю виключається можливість виникнення і розвитку пожежі, а також забезпечується захист матеріальних цінностей. Причинами, що можуть викликати пожежу у цьому помешканні, є: – несправність електропроводки і приладів; – коротке замикання електричних ланцюгів; – перегрів апаратури; – блискавка. Помешкання обчислювального центру по пожежній безпеці відноситься до категорії В відповідно до ОНТП-24-86 [1], тому що в обігу знаходяться тверді спалимі речовини і матеріали. Ступінь вогнестійкості будинку – II відповідно до СНиП 2.01.02-85 [3], клас помешкання по пожежній небезпеці П-IIа, відповідно до ПУЭ-87 [2]. Пожежна безпека відповідно до ГОСТ 12.1.004-91 [13] забезпечується системами запобігання пожежі, пожежного захисту, організаційно-технічними заходами. Система запобігання пожежі: – контроль і профілактика ізоляції; – наявність плавких вставок і запобіжників в електронному устаткуванні; – для захисту від статичної напруги використовується заземлення; – захист від блискавок будівель і устаткування. Для даного класу будівель і місцевості із середньою грозовою діяльністю 10 і більш грозових годин у рік, тобто для умов м. Харкова встановлена III категорія захисту від блискавок. Ступінь захисту відповідному класу помешкання П II-а IР44 для устаткування і IР2Х для світильників. Система пожежного захисту: – аварійне відключення і переключення апаратури; – наявність первинних засобів пожежегасіння, вогнегасників ОП-5, тому що вуглекислота має погану електропровідність, або порошкових вогнегасників; – система оповіщення, світлова і звукова сигналізація; – захист легкозаймистих частин устаткування, конструкцій захисними матеріалами; – використання негорючих матеріалів для акустичної обробки стін і стель; – у помешканнях, де немає робочого персоналу, встановлена автоматична система пожежного захисту. Для успішної евакуації персоналу при пожежі розміри дверей робочого помешкання повинні бути наступними: ширина дверей не менше 1,5 м., висота дверей не менше 2,0 м., ширина коридору 1,8 м.; робоче помешкання повинно мати два виходи; відстань від найбільше віддаленого робочого місця не повинне перевищувати 100 м. Організаційні заходи пожежної профілактики: – навчання персоналу правилам пожежної безпеки; – видання необхідних інструкцій і плакатів, плану евакуації персоналу у випадку пожежі. Будівля обчислювального центру відповідає вимогам пожежної безпеки. Висновки У пояснювальній записці представлена розробка спеціалізованої програми для можливості легкого „спілкування” користувача з окремими модулями збору інформації та роботи користувача з метеорологічним комплексом вцілому. Розглянуті спеціальні алгоритми для обчислення метеопоказників, що надходять від модулю збору інформації Перевагами програми насамперед є простота та зручність у користуванні, можливість змінювати деяки настройки під час проботи програми, можливість зручного збереження даних, що отримані. Також слід ви ділити те, що мова програмування, на якій написана програма є java, що дозволяє їй бути платформо-незалежною, переносимою програмою; використання стандартної бібліотеки javacomm дає можливість роботи з паралельним портом без використання додаткових програмних модулей; також можна зазначити широкі можливості вдосконалення програми для виходу нових версій та розширення її функціональності. Список літератури 1. Кей С. Хорстман, Г. Корнел “Java 2. Основи” М.: Вид. Будинок “Вільямс”, 2003. 2. Кей С. Хорстман, Г. Корнел “Java 2. Тонкості програмування” М.: Вид. Будинок “Вільямс”, 2003. 3. Стівен стелінг, Олав Маасен “Використання шаблонів Java” М.: Вид. Будинок “Вільямс”, 2002. 4. Крег Ларман “Використання UML та шаблонів проектування” М.: Вид. Будинок “Вільямс”, 2001. 5. ОНТП 24-86 "Определение категорий помещений и зданий по взрыво-пожарной и пожарной опасности", затверджене МВС СРСР 27.02.86 6. ПВЕ "Правила устройства электроустановок", затверджених Голов-держенергонаглядом СРСР 1984 р. 7. СНиП 2.01.02-85. " Строительные нормы и правила. Противопожарные нормы проектирования зданий и сооружений" -М.:Стройиздат.,1986 р. 8. 12.0.003–74* “ССБТ. Опасные и вредные производственные факторы. Классификация.” 1978 (с 01.01.76).Переиздание (сентябрь 1999 г.) с Изменением № 1, утвержденным в октябре 1978 г. (ИУС 11-78). 9. СНиП 11-4-79 " Строительные нормы и правила. Естественное и искусственное освещение"-М.:Стройиздат.,1980 р. 10. ГОСТ 12.1.005-88 "ССБТ Общие санитарно-гигиенические требования к воздуху рабочей зоны"-Введ. 01.01.89. 11. СНиП 2.04.05-91 " Строительные нормы и правила. Отопление, вен-тиляция и кондиционирование воздуха"-М.:Стройиздат.,1987 р. 12. ДСанПіН З.З.2. 007 1998. Державні санітарні правила і норми роботи з візуальними дисплейним терміналами електронно-обчислювальних машин. 13. ГОСТ 14254-80. Электрооборудование напряжением до 1000 В. Оболочки. Степени защиты. Введ. 01.01.81. 14. ГОСТ 12.2.007.0-75*. ССБТ. Изделия электротехнические. Общие требования безопасности. Введ. 01.01.78. 15. ГОСТ 12.1.030-81*. ССБТ. Электробезопасность. Защитное заземление. Зануление. Введ. 01.07.82. 16. Методические указания к лабораторной работе по охране труда “Исследование освещённости производственных омещений естественным светом” для студентов всех специальностей / Сост. Л.Г. Касаткина.- Харьков:ХПИ, 1986.-20с. 17. ГОСТ 12.1.004-91." ССБТ. Пожарная безопасность. Общие требо-вания". Введ. 01.07.92. 18. www.java.sun.com МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ “ХПІ” Кафедра “ОБЧИСЛЮВАЛЬНА ТЕХНІКА та ПРОГРАМУВАННЯ” ЗАТВЕРДЖЕНО Завідуючий кафедрою ОТП ______________ (xxxxxxx.) “____” ______________ 2004 р. ПРИЛАД ПРИЙОМУ ТА ОБРОБКИ МЕТЕОРОЛОГІЧНИХ ДАНИХ Технічне завдання КІТ19Б.099092.00 ТЗ Консультанти: Науково-дослудна робота: ___________доц. xxxxx Економічна частина: ___________доц. xxxxxxxx. Охорона праці і навколишнього середовища ___________ст.викл. xxxx. Розробники: Керівник проекту ____________ (xxxxxx.) “____” ______________ 2004 р. Виконавець ___________ (xxxxx.) “____” ______________ 2004 р. Харків 2004 1 НАЙМЕНУВАННЯ І ОБЛАСТЬ ЗАСТОСУВАННЯ 1.1 Найменування – прилад прийому та обробки метеорологічних даних (далі – прилад). 1.2 Область застосування – прийом спеціалізованих даних для подальшої обробки від приладів автономного збирання метеорологічних даних. 2 ОСНОВА ДЛЯ РОЗРОБКИ 2.1 Основа для розробки – технічне завдання на дипломний проект, видане 27.09.2004 професором кафедри ОТП Калашніковим В. І. Затверджено протоколом №_________ від “_____”____________ 2004р. Наказ по НТУ „ХПІ” №____________ від “_____”_____________ 2004р. 3 МЕТА І ПРИЗНАЧЕННЯ РОЗРОБКИ 3.1 Мета розробки – розробка спеціалізованого приладу, що забезпечує прийом метеорологічних даних для їх подальшої обробки у ПК на певній, відносно невеликій ділянці місцевості. 3.2 Призначення розробки – створення комплексу технічної документації для приладу прийому та обробки метеорологічних даних. 4 ТЕХНІЧНІ ВИМОГИ 4.1 Конструктивні і технічні характеристики виробу 4.1.1 Даний прилад повинен бути виконаний у вигляді конструктивно закінченого виробу що підключається через паралельний порт ПК. 4.1.2 Прилад має бути виконаний у вигляді двох нероз’ємних модулей – приємопередатчика та мікроконтролера, що забезпечує попередню обробку прийнятого сигналу. 4.1.3 Прилад прийому даних повинен забезпечувати одержання спеціалізованих даних від системи збору метеорологічних даних (далі – системи), шляхом почергового опиту окремих модулів збирання інформації цього комплексу. 4.1.4 Функціональність приладу не повинна накладати обмеження на кількість модулів системи. 4.1.5 Прилад повинен здійснювати попередню обробку та передачу прийнятих даних через паралельний порт ПК. 4.1.6 Прийом та передача данних повинна відбуватися за допомогою радіоканального зв’язоку. 4.1.6 Радіо прийом та передача даних повинна виконуватись на частоті близько 700 МГц. 4.1.7 Кількість робочих радіоканалів пристрою – 1. 4.1.8 Максимальний радіус дії приємопередатчика пристрою не менше 5 км. 4.2 Вимоги до функціональності 4.2.1 Прилад повинен мати можливість опиту як усіх модулів, так й окремого модулю системи збору метеорологічних даних. 4.3 Вимоги до програмного забезпечення приладу 4.3.1 Програма повинна реалізовувати наступні функції: - посилання сигналу на запит до певного модулю системи збору метеорологічних даних – посилання сигналу з конкретним цифровим унікальним кодом модулю; - прийом сигналу-відповіді від конкретного модулю системи; - внутнішня обробка сигналу, що був прийнятий від модулю для його подальшої обробки у ПК. - пересилання обробленого сигналу перез паралельний порт ПК. 4.4 Вимоги до програмного забезпечення ПК 4.4.1 Програма повинна реалізовувати наступні функції: - зручне збереження отриманих даних для подальшого використання іншими програмними пакетами; - посилання запитів до приладу для отримання інформації від датчиків певного модулю системи. 4.5 Вимоги до надійності 4.5.1 Середня наработка на відмову - не менше 8 000 годин. 4.5.2 Прилад повинен мати ударостійкість не менше, ніж 1000g. 4.5.3 Прилад повинен забезпечувати невідмовне функціонування при температурі навколишнього середовища від -20 до +300С. 4.6 Вимоги до безпеки 4.6.1 Робота з приладом та його утилізація не повинні мати вплив на здоров’я людини. 4.6.1 Робота з приладом та його утилізація не повинні мати вплив на стан навколишнього середовища. 4.7 Умови експлуатації 4.7.1 Робота з приладом під час несприйнятливих погодних умов (атмосферні осадки, пряме сонячне випромінювання) повинні проводитись при наявності захисного тенту. 4.8 Вимоги до сумісності 4.8.1 Сумісність з кожним окремим модулем комплексу збору метео-рологічних даних. 4.9 Додаткові вимоги 4.9.1 Прилад повинен мати габаритні розміри менше, ніж 10х15х10 сантиметрів. 4.9.2 Кінцева ціна промислового виробництва приладу буде уточнена у процесі розробки, яле не має перевищувати 600 гривень. 5 ВИМОГИ ДО КОНСТРУКТОРСЬКОЇ ДОКУМЕНТАЦІЇ При виконанні роботи випускається наступний комплект документів: 5.1 Технічне завдання. 5.2 Пояснювальна записка. 5.3 Текст програми. 5.4 Опис програми. 5.5 Посібник користувача. 5.6 Схеми структурна, функціональна та принципова 6 ТЕХНІКО-ЕКОНОМІЧНІ ПОКАЗНИКИ Капітальні витрати, тимчасові витрати та економічна ефективність повинні бути визначені в ході розробки і представлені в документації. 7 СТАДІЇ ТА ЕТАПИ РОЗРОБКИ Розробка повинна виконуватись на етапах ескізного і технічного проекту. Розробка повинна проходити за наступним планом: - розробка технічного завдання; - техніко-економічне обгрунтування розробки; - розробка розділу охорони праці; - розробка комплекту конструкторської документації. 8 ПОРЯДОК КОНТРОЛЮ І ПРИЙМАННЯ При прийманні перевіряється: - відповідність розробки технічному завданню; - комплектність, зміст і оформлення документації. МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ “ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ” Кафедра “обчислювальна техніка та програмування” Затверджую : Завідуючий кафедрою “ОТП” ______________ xxxxxxxx. “___”________________ 2005р Прилад прийому та обробки метеорологічних даних Керівництво оператора Лист затвердження xxxxx 99092-00-34 ЛЗ Розробники: Керівник проекту: проф. xxxxx. “___”_________2005р Виконавець: Студент групи КІТ-19б xxxxxxx. “___”_________2005р Харків 2005 ЗАТВЕРДЖЕНО xxxxxxxx 99092-00-34 ЛЗ Прилад прийому та обробки метеорологічних даних Керівництво оператора xxxx 99092-00-34 Листів 5 Харків 2005 1. Загальні відомості про програмний вироб 1.1 Вимоги до програмного забезпечення Функціонування програми на персональному комп’ютері повина бути встановлена java-машина, версії 1.4_02 або вища. 1.2 Склад програмного виробу Дана робоча програма складається з двох каталогів: - каталогу classes (містить набор відтрансльованих java-класів, файл Modules.properties – задання інформації про модулі збору, та TestValues. properties – задання тестових послідовностей для роботи програми у тестовомо режимі. - каталогу lib, який містить бібліотеку comm.jar для роботи з портами вводу/виводу. 1.3 Вхідні дані для програми Перед початком роботи з програмою необхідно внести у текстовий файл Modules.properties дані про наявні модулі збору інформації. Формат строки текстового файлу: Номер_модуля Додаткова інформація про модуль (наприклад місце розташування) Наприклад перед початком роботи з програмою необхідно відредагувати текстовий файл Modules.properties, вказавши в ньому всі наявні модулі, з якими вистиметься робота, наприклад: 1=поле (северный край) 2=поле (южный край) 3=просека 5=телевышка 8=лес 10=лес(опушка) 47=автостанция 56=ж/д станция 67=берег реки 78=пристань 79=сельсовет 80=электростанция 95=шоссе 124=лесополоса 250=турбаза 2. Робота з програмою 2.1 Запуск програми Перед запуском програми треба скопіювати каталоги classes та lib у будь-яку робочу директорію на жорсткому диску персонального комп’тера, наприклад e:\meteo. Для запуску програми необхідно вказати у командній строці наступну інформацію: шлях до java-машини; шлях до каталогу classes; шлях до бібліотеки comm..jar головний клас з методом main Наприклад: E:\jre\bin\javaw -classpath "E:\meteo\classes;E:\meteo\lib\comm.jar” dip.ui. MainFrame Якщо операційна система, з якою працює користувач є Windows, можна утворити відповідний bat-файл, задавши йому всю необхідну інформацію. 2.2 Приклад функціонування програми Після запуску програми на екрані з’являється головне вікно яке містить всі необхідні компоненти для роботи з програмою. Після натиснення кнопки „Список активних модулів”, з файлу Modules.properties завантажується список модулів, з якими програма вестиме роботу. При цьому слід зауважити, що завантажувати нові модулі для роботи можна й під час роботи програми, варто знову натиснути кнопку “Список активних модулів”, програма зробить перечитку файлу та відображення нових (якщо відбулися певні зміни) модулів. Список модулів являє собою особистий номер (код модуля), який співпадає з внутрішнім кодом самого модуля збору метеорологічних даних, та опис самого модуля (будь-яка текстова інформація); у данному випадку – місце розташування модуля, для більш зругного його використання. Далі користувач тисне „Опитати модуль”, попередньо вказавши номер модуля, у правому полі, який він бажає опитати. Далі програма робить опит вказаного модуля, при цьому можливі наступні види помилок: модуль, що опитується не існує в списку модулів; вказаний модуль не дає відповіді; не співпадає номер модуля (номер модуля що був відправлений, не співпадає з прийнятим номером модуля); помилка у контрольній сумі (виникла помилка при передачі). Якщо все гаразд – (не виникло жодної помилки) – отримуємо на екрані результат опитування модуля). Також можна опитати усі активні модулі натиснувши на кнопку “Опитати всі модулі”, при цьому отримаємо інформаціюпо всіх модулях, зазначених у списку, якщо результати опитування певного модуля не присутні на інформаційній панелі – треба дивитися список помилок. 2.3 Робота з програмою у тестовому режимі Для роботи програми у тестовому режимі необхіден файл TestValues.properties, що входить до складу програмного виробу. Для запуску програми у тестовому режим інеобхідно виконати наступні дії: запустити програму (див. пункт 2.1); обрами меню «Настройки», встановити галочку «Робота програми у тестовому режимі» (рис. 1).
Риунок 1. Встановлення тестового режиму роботи програми. При встановлені тестового режиму програма буде імітувати сигнали-відповіді від конкретних модулів, вказаних у файлі Modules.properties. Якщо запустити на виконання програму із запропонованим набором даних, загрузити набір модулей, з якими вестиметься робота, попередньо встановивши тестовий режим роботи програми, тоді у режимі опиту всіх модулей програма має надати наступну інформацію (рис.2) Також можливий й опит окремих модулів із отриманням у якості інфорамції-відповіді тестову послідовність з файлу.
Рисунок 2. Опит всіх модулей із запропонованим набором даних у тестовому режимі. МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ “ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ” Кафедра “обчислювальна техніка та програмування” Затверджую : Завідуючий кафедрою “ОТП” ______________ Xxxxxxxx. “___”________________ 2005р Прилад прийому та обробки метеорологічних даних Текст програми Лист затвердження xxxxxxxx 99092-00-12 ЛЗ Розробники: Керівник проекту: проф. xxxxxx. “___”_________2005р Виконавець: Студент групи xxxxxx xxxxxxxx. “___”_________2005р Харків 2005 ЗАТВЕРДЖЕНО КІТ19Б 99092-00-12 ЛЗ Прилад прийому та обробки метеорологічних даних Текст програми КІТ19Б 99092-00-12 Листів 17 Харків 2005 Клас ui.MainFrame package dip.ui; //Підключення необхідних класів та пакетів import javax.swing.*; import java.awt.*; import java.awt.Color; import javax.comm.CommDriver; import javax.comm.CommPortIdentifier; import java.util.Enumeration; import javax.comm.ParallelPort; import java.io.OutputStream; import java.io.*; import javax.comm.*; import dip.util.*; import java.awt.event.ActionEvent; import dip.obj.Module; import dip.obj.WeatherData; import javax.swing.table.DefaultTableModel; import java.util.ResourceBundle; import java.util.ArrayList; import java.util.Locale; import java.util.PropertyResourceBundle; public class MainFrame extends JFrame implements ParallelPortEventListener, CommPortOwnershipListener{ //ініціалізація полей класу private JMenuBar mainMenu = new JMenuBar(); private JSplitPane split = new JSplitPane(); private JPanel leftPanel = new JPanel(); private JPanel rightPanel = new JPanel(); private UserSettingsDialog settingsDialog = new UserSettingsDialog(this); private JTable table = new JTable(); private Object [] tableColumnNames = new Object[]{"№ мод", "Т-ра (\u25E6C)", "Тиск(мм.рт.ст.)", "Напр. вітру", "Сила вітру(м/с)"}; private DefaultTableModel tableModel = new DefaultTableModel(null,tableColumnNames); private JList list = new JList(); private DefaultListModel listModel = new DefaultListModel(); private JScrollPane scrollTable = new JScrollPane(); private JScrollPane scrollList = new JScrollPane(); private static JFrame mainFrame = null; private JButton activeModulesListButton = new JButton("Список активних модулів"); private JButton askAllModulesButton = new JButton("Опитати всі"); private JButton askModuleButton = new JButton("Опитати модуль"); private JButton settingsButton = new JButton("Настройки"); private JSpinner moduleNumberSpinner = new JSpinner(); private ParallelPort ourParallelPort = null; private Transmitter transmitter = null; private Receiver receiver = null; private ArrayList activeModules = new ArrayList();//список активних модулів private MainFrame() { initData(); try { jbInit(); this.setSize(600, 400); this.setTitle("Прийом та обробка метеорологічних даних"); // this.pack();} catch(Exception ex) {JOptionPane.showMessageDialog(this, "Ошибка инициализации данных"); ex.printStackTrace();}} public static JFrame getMainFrame() {if (mainFrame != null) return mainFrame; mainFrame = new MainFrame(); return mainFrame;} void jbInit() throws Exception {//ініціалізація графічного інтерфейсу this.setJMenuBar(mainMenu); mainMenu.add(new JMenu("Файл")); JMenu settingsMenu = new JMenu("Настройки"); mainMenu.add(settingsMenu); JMenuItem settingsItem = new JMenuItem("Настройки"); settingsMenu.add(settingsItem); settingsItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { settingsDialog.show();}}); leftPanel.setLayout(new BorderLayout()); rightPanel.setLayout(new GridBagLayout()); this.getContentPane().add(split); split.add(leftPanel, JSplitPane.LEFT); leftPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(Color.green,Color.blue),"Інформаційна панель")); split.add(rightPanel, JSplitPane.RIGHT); split.setDividerLocation(200); leftPanel.add(scrollTable); scrollTable.getViewport().add(table); rightPanel.add(scrollList, new GridBagConstraints(0, 0, 2, 1, 1.0, 1.0 , GridBagConstraints.NORTH, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); scrollList.getViewport().add(list); scrollList.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(Color.green,Color.blue),"Список модулів")); rightPanel.add(activeModulesListButton, new GridBagConstraints(0, 1, 2, 1, 0.0, 0.0 , GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(3, 3, 3, 3), 0, 0)); rightPanel.add(askAllModulesButton, new GridBagConstraints(0, 2, 2, 1, 0.0, 0.0 , GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(3, 3, 3, 3), 0, 0)); rightPanel.add(askModuleButton, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(3, 2, 3, 2), 0, 0)); rightPanel.add(moduleNumberSpinner, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0 ,GridBagConstraints.NORTH, GridBagConstraints.NONE, new Insets(3, 0, 3, 0), 0, 5)); moduleNumberSpinner.setModel(new SpinnerNumberModel(0,0,255,1)); table.setModel(tableModel);} void initData() {try {//ініціалізація драйверу для роботи з портом String drivername = "com.sun.comm.Win32Driver"; Class.forName(drivername); CommDriver driver = (CommDriver) Class.forName(drivername).newInstance(); driver.initialize();} catch (Exception ee) { ee.printStackTrace();} CommPortIdentifier portIdentifier; Enumeration portList = CommPortIdentifier.getPortIdentifiers();//отримання спису портів вводу/виводу while (portList.hasMoreElements()) { portIdentifier = (CommPortIdentifier) portList.nextElement(); if (portIdentifier.getPortType() == CommPortIdentifier.PORT_PARALLEL) {System.out.println("Found Parralel Port :" + portIdentifier.getName()); if (portIdentifier.getName().equals("LPT1")) {//знаходимо потрібний для роботи порт try {ourParallelPort = (ParallelPort) portIdentifier.open("APP", 2000);//”відкриваємо порт для подальшої роботи”} catch (PortInUseException ex) { BadEvent.throwCriticalEvent(ex, this, "LPT-порт занят");} OutputStream out = null; try {out = ourParallelPort.getOutputStream();//отримання потоку на запис ourParallelPort.setOutputBufferSize(Transmitter.PACKAGE_SIZE);} catch (IOException ex) {BadEvent.throwCriticalEvent(ex, this, "Ошибка при инициализации LPT-порта для записи данных"); ourParallelPort.close();} catch (NullPointerException ex) {System.out.println("ERROR: OutPutStream could not be Created."); ourParallelPort.close();} InputStream in = null; try {ourParallelPort.setInputBufferSize(Receiver.PACKAGE_SIZE);} catch (NullPointerException ex) {System.out.println("ERROR: OutPutStream could not be Created."); ourParallelPort.close();} //клас для роботи з портом на запис transmitter = Transmitter.getInstance(); transmitter.setOut(out); transmitter.setOwner(this); transmitter.setParallelPort(ourParallelPort); //клас для роботи з портом на читання receiver = Receiver.getInstanse(); receiver.setIn(in); receiver.setOwner(this); receiver.setParalellPort(ourParallelPort); new Thread(receiver).start(); //задаємо прослуховувачі на кнопки askModuleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { Integer moduleNumber = (Integer)moduleNumberSpinner.getValue(); boolean show = false; if (activeModules != null) {for (int i = 0; i < activeModules.size(); i++) { Module m = (Module)activeModules.get(i); if (m.getModuleNumber().intValue() == moduleNumber.intValue()) {show = true; break;}}} if (show) askModule(moduleNumber); else {JOptionPane.showMessageDialog(MainFrame.this, "Модуля с таким номером не существует ");}}}); askAllModulesButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { askAllModules();}}); activeModulesListButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { readModulesFromFile();}});} public void parallelEvent(ParallelPortEvent parallelPortEvent) {} public void ownershipChange(int type) {} void askModule(Integer moduleNumber) {Module module = new Module(moduleNumber); module.sendModuleNumber(); if (Helper.TEST_MODE)//якщо режим тестовий, засилаємо у порт певну послідовність {byte[] bb = Helper.testStringIntoBytes(moduleNumber.intValue()); Transmitter t = Transmitter.getInstance(); t.writeTestQuerysendBytes(Helper.integerToBytes(bb);} try { Thread.sleep(Helper.WaitForResponceInMilis); } catch (InterruptedException ex) { } //відправили повідомлення. Тепер чекаємо byte[] answer = receiver.getBuffer();//отримуємо буфер через певний проміжок часу. try {module.createWeatherData(answer);//утворюємо дані пропогоду} catch (Exception ex) {JOptionPane.showMessageDialog(this, ex.getMessage()); return;} WeatherData wethData = module.getWeatherData(); if (wethData.checkSrc() == true) {drowOneModule(module);//якщо контрольна сума збіглася – рисуємо.} else {JOptionPane.showMessageDialog(this, "Ошибка контрольной суммы");}} private void askAllModules() {ArrayList modulesToDraw = new ArrayList(); String errStr = ""; if (activeModules == null || activeModules.size() == 0)//якщо список модулів порожній {JOptionPane.showMessageDialog(this, "Список активных модулей пуст"); return;} System.err.println("Всего модулей: "+activeModules.size()); for (int i = 0; i < activeModules.size(); i++)//опитуємо всі модулі {Module currentModule = (Module)activeModules.get(i);//звернення до поточного currentModule.sendModuleNumber();//запитуємо певний модуль try { Thread.sleep(Helper.WaitForResponceInMilis); } catch (InterruptedException ex) { } if (Helper.TEST_MODE)//якщо режим тестовий, засилаємо у порт певну послідовність {byte[] bb = Helper.testStringIntoBytes(moduleNumber.intValue()); Transmitter t = Transmitter.getInstance(); t.writeTestQuery(Helper.integerToBytes(bb);} if (bb == null) {errStr += "Модуль № "+currentModule.getModuleNumber()+" не даёт ответ\n"; continue;//якщо помилка – перериваємо обробку модуля} try { Thread.sleep(Helper.WaitForResponceInMilis); } catch (InterruptedException ex) { } byte[] answer = receiver.buffer;//отримуємо буфер через певний проміжок часу try {currentModule.createWeatherData(answer);} catch (Exception ex) { System.err.println("Несовпадение"); errStr += "Модуль № "+currentModule.getModuleNumber()+" Несовпадение номера модуля\n"; continue;} WeatherData wethData = currentModule.getWeatherData(); if (wethData.checkSrc() == true) {modulesToDraw.add(currentModule);//додаємо до списку відних модулів} else {errStr += "Модуль № "+currentModule.getModuleNumber()+" Ошибка контрольной суммы\n"; continue;// якщо помилка – перериваємо обробку модуля}} drowModules(modulesToDraw); if (errStr.length() > 0) JOptionPane.showMessageDialog(this, errStr);} private void drowOneModule(Module module)// прорисовка даних про один модуль {System.err.println(""+module.getWeatherData().getRealTemperature()); System.err.println(""+module.getWeatherData().getRealPresure()); Object[][] objectData = new Object [][]{ {module.getModuleNumber(), module.getWeatherData().getRealTemperature(), module.getWeatherData().getRealPresure(), module.getWeatherData().getRealWindDirection(), module.getWeatherData().getRealWindPower()}}; tableModel = new DefaultTableModel(objectData, tableColumnNames); table.setModel(tableModel);} //рисуємо відразудекілька модулів private void drowModules(ArrayList modules) {Object [][] objectData = new Object[modules.size()][5]; for (int i = 0; i < modules.size(); i++) {Module m = (Module)modules.get(i); objectData[i][0] = m.getModuleNumber(); objectData[i][1] = m.getWeatherData().getRealTemperature(); objectData[i][2] = m.getWeatherData().getRealPresure(); objectData[i][3] = m.getWeatherData().getRealWindDirection(); objectData[i][4] = m.getWeatherData().getRealWindPower();} tableModel = new DefaultTableModel(objectData, tableColumnNames); table.setModel(tableModel);} //читаємо з файлу список активних модулів private void readModulesFromFile(){ listModel.clear(); ResourceBundle bundle = null; bundle = ResourceBundle.getBundle("m"/*, new Locale("ru", "RU")*/); Enumeration modules = bundle.getKeys(); while (modules.hasMoreElements()) { Integer moduleNumber = new Integer(modules.nextElement()+""); String moduleDescription = bundle.getString(moduleNumber + ""); Module module = new Module(moduleNumber, moduleDescription); activeModules.add(module); listModel.addElement(module);} list.setModel(listModel);} public ParallelPort getParalellPort(){return ourParallelPort;} public static void main(String[] args) {JFrame frame = getMainFrame(); frame.show();}} Клас ui.UserSettingsDialog package dip.ui; //імпорт необхідних пакетів import java.awt.*; import javax.swing.*; //поля класу private JButton okButton = new JButton(); private JButton cancelButton = new JButton(); private JTextField waitForResponseFld = new JTextField(); private JCheckBox isTestModuleCheck = new JCheckBox(); public class UserSettingsDialog extends JDialog { public UserSettingsDialog(Frame owner) { super(owner, "Настройки користувача", true); try {jbInit(); pack();} catch(Exception ex) { ex.printStackTrace();}} //відображення графічного стану діалогу private void jbInit() throws Exception { this.getContentPane().setLayout(new FlowLayuout()); this.getContentPane().add(new JLabel("Тестовый режим")); this.getContentPane().add(isTestModuleCheck); this.getContentPane().add(new JLabel("Время ожидания милисекунд")); this.getContentPane().add(waitForResponseFld); this.getContentPane().add(cancelButton); this.getContentPane().add(okButton); //додаємо необхідні прослуховувачі okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { Helper.WaitForResponceInMilis = new Integer(waitForResponseFld.getText());//затримка для чекання Helper.TEST_MODE = isTestModuleCheck.isSelected();//вибір режиму роботи з програмою}}); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { this.setVisible();}});}} Клас util.BadEvent package dip.util; import java.awt.Component; import javax.swing.JOptionPane; public class BadEvent//власні оброблювачі помилок {public static void throwCriticalEvent(Exception ex, Component sourse, String message) {ex.printStackTrace(); JOptionPane.showMessageDialog(sourse, message); System.exit(0);//у разі критичної помилки – виходимо з програми} public static void throwNonCriticalEvent(Exception ex, Component sourse, String message) {ex.printStackTrace(); JOptionPane.showMessageDialog(sourse, message);//у разі помилки видаємо повідомлення}} Клас util.Helper package dip.util; import java.util.ResourceBundle; import java.util.StringTokenizer; public class Helper { public static int WaitForResponceInMilis = 10;//очикування відповіді public static int syncroTime = 10000;//тривалість синхроімпульсу public static int dataTime = 40000;//тривалість інформаційного рівня сигналу public static boolean TEST_MODE = false;//наявність тестового режиму public static byte[] integerToBytes(int number) {byte [] bytes = new byte [16]; String str01 = Integer.toBinaryString(number); int length = 16-str01.length(); for (int i = 0; i < length; i++) { str01="0"+str01;//дописуємо (якщо необхідно) послідовність нулів} for (int i = 0; i < str01.length(); i++) {bytes[i] = Byte.parseByte(str01.substring(i, i+1)); System.err.print(""+bytes[i]);} System.err.println(""); return bytes;} public static byte [] testStringIntoBytes(int moduleNumber) {ResourceBundle bundle = ResourceBundle.getBundle("TestValues"); byte [] bytes = new byte[Receiver.PACKAGE_SIZE]; String valueDigits = ""; try {valueDigits = bundle.getString(moduleNumber + "");} catch (Exception ex) {return null;} StringTokenizer token = new StringTokenizer(valueDigits); int k = 0; int tokenCount = 0; while (token.hasMoreTokens()){ Integer value = new Integer(token.nextToken());//розбір тестової строки byte [] b = integerToBytes(value.intValue()); for (int i = 0; i < b.length ; i++) {// System.err.println("i+k="+(i+k)+" i="+i+" k="+k+" moduleNumber="+moduleNumber); bytes[i+k] = b[i+1];//для подачі відповідних сигналів на DR0, DR1} k = k+16; tokenCount++; if (tokenCount > 7) break;//перевірка, якщо проаналізували тестову строку} // for (int i = 0; i < bytes.length; i++) { // System.err.print(bytes[i]); //} return bytes;} public static void main(String[] args) { // integerToBytes(255); testStringIntoBytes((byte)2);}} Клас util.Receiver package dip.util; import java.io.*; import javax.swing.JFrame; import javax.comm.ParallelPort; public class Receiver extends Thread{//даний клас є потоком public static final int PACKAGE_SIZE = 1;//размер читаемого пакета private InputStream in = null; private ParallelPort parallelPort = null; private JFrame owner = null; private static Receiver receiver = null; public byte [] buffer = new byte [PACKAGE_SIZE];//вхідний буфер даних private int startCounter = 0; public int counter = 0; private Receiver() {} public static Receiver getInstanse()//тримаємо лише один активний екземпляр класу {if (receiver.isAlive()) return receiver; receiver = new Receiver(); return receiver;} private byte readByte()//читання байту (біту) з паралельного порту {byte b = 0; if (parallelPort.isPaperOut())//якщо є синхроімпульс {b = (parallelPort.isBusy()) ? 1 : 0;//читаємо parallelPort.setPaperOut(true);//скидуємо сигнал синхроімпульсу} return b;} public void run() {while (true) { byte currentByte = 0; currentByte = readByte(); if (currentByte == 1) startCounter++; else startCounter = 0; if (startCounter == 7) {//якщо пройшла стартова послідовність buffer[counter++] = b; if (counter == PACKAGE_SIZE) {//якщо буфер повний this.interrupt();} try {Thread.sleep(0, 100);//затримка у 0,1 мкс для звільнення процесорного часу} catch (InterruptedException e) {}}}} public void setIn(InputStream in) { this.in = in;} public JFrame getOwner() { return owner;} public void setOwner(JFrame owner) { this.owner = owner;} public void setParalellPort(ParallelPort parallelPort) { this.parallelPort = parallelPort;} public byte [] getBuffer() {return buffer;}} Клас util.Transmitter package dip.util; import javax.comm.ParallelPortEventListener; import javax.comm.CommPortOwnershipListener; import javax.comm.ParallelPortEvent; import java.io.OutputStream; import javax.comm.ParallelPort; import java.io.*; import javax.swing.JOptionPane; import javax.swing.JFrame; public class Transmitter { private static Transmitter transmitter = null; private JFrame owner = null; private OutputStream out = null; private ParallelPort parallelPort = null; public static final int PACKAGE_SIZE = 8;//довжина пакету, що посилається public static final int SYNCROCOUNT = 8;//кількість підзаряжувальних синхроімпульсів public static Transmitter getInstance()//маємо лише один екземпляр класу {if (transmitter != null) return transmitter; transmitter = new Transmitter(); return transmitter;} private Transmitter() {} public OutputStream getOut() { return out;} public void setOut(OutputStream out) { this.out = out;} public void sendBytes (byte [] byte01) {doStartQuery();//спочатку передаємо стартову послідовність for (int i = 0; i < byte01.length ; i++) sendByte(byte01[i]);} private void sendByte(byte b) {try {this.getOut().write(b);//запис до відповідного регістру try { Thread.sleep(0, Helper.dataTime); } catch (InterruptedException ex) { }//встановлюємо затримку sendSyncro();//посилаємо синхроімпульс} catch (IOException ex) {ex.printStackTrace(); System.err.println("Не могу записать в параллельный порт!");}} private void sendSyncro() {this.parallelPort.setInputSelect(true);//встановлюємо сигнал try { Thread.sleep(0, Helper.syncroTime); } catch (InterruptedException ex) { }//затримка this.parallelPort.setInputSelect(false);//скидаємо сигнал} private void doStartQuery() {for (int i = 0; i < 8; i++)//спочатку синхроімпульси sendByte((byte)0); for (int i = 0; i < 8; i++)//потім – послідовність «одиниць» sendByte((byte)1);} private void writeTestQuery(byte [] testBytes) {if (testBytes.length != Receiver.PACKAGE_SIZE + 8) { System.err.println("Неспівпадння довжини пакету"); return;} for (int i = 0; i < testBytes.length; i++) {parallelPort.setPaperOut(testBytes[i]==2);//пишемо «1» якщо 2, інакше – «0» try { Thread.sleep(0, Helper.dataTime); } catch (InterruptedException ex) { } parallelPort.setPaperOut(false); //задання синхронмульсу parallelPort.setPaperOut(true); try { Thread.sleep(0, Helper.syncroTime); } catch (InterruptedException ex) { } parallelPort.setPaperOut(false);}} public JFrame getOwner() { return owner;} public void setOwner(JFrame owner) { this.owner = owner;} public void setParallelPort(ParallelPort parallelPort) { this.parallelPort = parallelPort;}} Клас obj.WeatherData package dip.obj; import dip.util.Helper; public class WeatherData {private int temperature = 0; private int presure = 0; private int wind1 = 0; private int wind2 = 0; private int wind3 = 0; Double realTemperature ;//температура Integer realPresure ;//тиск Double realWindDirection ;//напрямок вітру Double realWindPower ;//сила вітру int src = 0; public int moduleNumber = 0; byte [] bTemperature = new byte[16]; byte [] bPresure = new byte[16]; byte [] bWind1 = new byte[16]; byte [] bWind2 = new byte[16]; byte [] bWind3 = new byte[16]; byte [] bSrc = new byte[16]; byte [] bModuleNumber = new byte[8]; byte [] receivedBytes ; public WeatherData(byte [] receivedBytes) {this.receivedBytes = receivedBytes; initValues();} private void initValues()//аналіз прийнятої послідовності {for (int i = 0; i < receivedBytes.length; i++) {receivedBytes[i]+=Receiver.PACKAGE_SIZE; if (i>=0 && i<=7) bModuleNumber[i] = receivedBytes[i]; if (i>=8 && i<=23) bTemperature[i-8] = receivedBytes[i]; if (i>=24 && i<=39) bPresure[i-24] = receivedBytes[i]; if (i>=40 && i<=55) bWind1[i-56] = receivedBytes[i]; if (i>=56 && i<=71) bWind2[i-72] = receivedBytes[i]; if (i>=72 && i<=87) bWind3[i-72] = receivedBytes[i]; if (i>=88 && i<=103) bSrc[i-104] = receivedBytes[i];} moduleNumber = Integer.parseInt(new String(bModuleNumber), 2); temperature = Integer.parseInt(new String(bTemperature), 2); presure = Integer.parseInt(new String(bPresure), 2); wind1= Integer.parseInt(new String(bWind1), 2); wind2 = Integer.parseInt(new String(bWind2), 2); wind3 = Integer.parseInt(new String(bWind3), 2); src = Integer.parseInt(new String(bSrc), 2); reliveValues();} public void reliveValues() {if (checkSrc()) {if (temperature > 61440)//1111 0000 0000 0000 якщо мінусова температура {temperature = temperature << 4; temperature = 0 - temperature;} realTemperature = new Double(temperature/16); realPresure = new Integer(presure); double w1, w2,w3, s1,s2; w1 = windFunction(wind1); w2 = windFunction(wind2); w3 = windFunction(wind3);//обчислення показників за формулою s1 = w1*Math.cos(Math.pi*0)+w2*Math.cos(Math.pi*(-2/3))+w2*Math.cos(Math.pi*(2/3));//a1+a2+a3 s2 = w1*Math.sin(Math.pi*0)+w2*Math.sin(Math.pi*(-2/3))+w2*Math.sin(Math.pi*(2/3));//b1+b2+b3 realWindPower = new Double(Math.sqrt(s1*s1+s2*s2));//знаходимо силу вітру realWindDirection = new Double(Math.arctg(s2/s1));// та напрямок}} private double windFunction(double chastota) {if (chastota > 2) /обчислення показників за формулою return (double)(1.614878*Math.sqrt(198.304-49.5759*f*f)); else return (double)(1.614878*Math.sqrt(49.5759*f*f-198.304));} public boolean checkSrc() {return (src == (temperature ^ presure ^ windPower ^ windDirection));//перевірка контрольної суми} public Integer getRealPresure() { return realPresure;} public Double getRealTemperature() { return realTemperature;} public Integer getRealWindDirection() { return realWindDirection;} public Double getRealWindPower() { return realWindPower;} public void setRealPresure(Integer realPresure) { this.realPresure = realPresure;} public void setRealTemperature(Double realTemperature) { this.realTemperature = realTemperature;} public void setRealWindDirection(Integer realWindDirection) { this.realWindDirection = realWindDirection;} public void setRealWindPower(Double realWindPower) { this.realWindPower = realWindPower;} public static void main(String[] args) { System.err.println(55^144^85^10); System.err.println(48^93^15^78); System.err.println(255^13^2^7); System.err.println(77^66^34^32); System.err.println(217^207^105^35); System.err.println(56^199^201^124); System.err.println(43^14^1^91); System.err.println(165^222^15^204); System.err.println(8^92^104^6); System.err.println(31^101^206^6); System.err.println(13^17^19^23); System.err.println(57^75^209^200); System.err.println(78^232^223^206); System.err.println(5^0^85^5); System.err.println(2^7^0^6);}} Клас obj.Module package dip.obj; import dip.util.Transmitter; import dip.util.Helper; import javax.swing.JOptionPane; public class Module {private Integer moduleNumber = null;//номер модуля private String moduleDescription = null;//його опис private WeatherData weatherData;//показники з модуля public Module(Integer moduleNumber) {setModuleNumber(moduleNumber);} public Module(Integer moduleNumber, String moduleDescription) {setModuleNumber(moduleNumber); this.moduleDescription = moduleDescription;} public Integer getModuleNumber() { return moduleNumber;} public void setModuleNumber(Integer moduleNumber) { this.moduleNumber = moduleNumber;} public void sendModuleNumber()//посилка номера модуля (запит) {Transmitter t = Transmitter.getInstance(); t.sendBytes(Helper.integerToBytes(this.moduleNumber.intValue()));} public void createWeatherData(byte [] recivedBytes)throws Exception //побудова екземпляру класу даних про погоду WeatherData – дані, отримані з модуля {this.weatherData = new WeatherData(recivedBytes); if (weatherData.moduleNumber != getModuleNumber().intValue()) throw new Exception("Несовпадение номера модуля");} public WeatherData getWeatherData() { return weatherData;} public String getModuleDescription() { return moduleDescription;} public void setModuleDescription(String moduleDescription) { this.moduleDescription = moduleDescription;} public String toString(){ return getModuleNumber() + " ("+getModuleDescription()+" )";//для відображення модуля}} Будь ласка, не зберігайте тестовий текст. |