Програмно-апаратний комплекс управління та обліку інформації

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информатика, ВТ, телекоммуникации
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    686,03 Кб
  • Опубликовано:
    2014-07-15
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Програмно-апаратний комплекс управління та обліку інформації

Зміст

Вступ

. Аналітичний огляд

.1 Огляд інформаційно-керованих комплексів

.2 Датчики переміщення

.2.1 Лінійні датчики

.2.1.1 Лінійні датчики серії BTL BALLUFF

.2.1.2 Лінійні датчики серії ДЛП

.3 Датчики кута повороту - енкодери

.4 Датчики кута нахилу - інклінометра

.5 Принцип роботи UART

. Розробка структури системи і опис поставленого завдання

.1 Опис поставленого завдання

.2 Структурна схема та принципи роботи системи

. Розробка мікроконтролерного блоку системи

.1 Структурна схема апаратного блоку системи

.1.1 Критерії вибору мікроконтролера

.1.2 Критерій вибору датчика для визначення лінійного зміщення

.2 Реалізація програмної частини мікроконтролера

.2.1 Логічна структура програми для МК ATmega8

.3 Критерій вибору мікросхеми узгодження рівнів RS232 <=> UART4

. Розробка програмного забезпечення інформаційно-керуючої оболонки системи

. Техніко-економічне обґрунтування

5.1 Визначення вартості витратних матеріалів, необхідних для розробки програмного продукту

5.2 Визначення витрат на сумарну заробітну плату розробників програмного продукту

.3 Розрахунок відрахувань на соціальні заходи

.4 Розрахунок витрат на оплату машинного часу при розробці програмного продукту

.5 Розрахунок інших накладних витрат у складі витрат на розробку програмного продукту

.6 Розрахунок собівартості апаратного забезпечення

.7 Висновки за розділом

.7.1 Результати розрахунку собівартості розробленого програмного забезпечення

.7.2 Аналіз собівартості системи

Висновок

Перелік посилань

Додатки

Вступ

У теперішній час науково-дослідна роботи немислима без автоматизації процесу вимірювання та обробки поточної і швидкоплинні в часі інформації.

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

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

1. Аналітичний огляд

.1 Огляд інформаційно-керованих комплексів

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

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

Рисунок 1 - Гідравлічний прес з системами автоматизованого управління від ПК.

1.2 Датчики переміщення

Основним чутливим елементом в усіх існуючих програмно-апаратних комплексах застосовуються різного виду датчики переміщення, які поділяються на 3 основні групи: лінійні, енкодери і инклинометра.

1.2.1 Лінійні датчики

.2.1.1 Лінійні датчики серії BTL BALLUFF

На ринку присутні спеціалізовані датчики лінійного переміщення серії BTL5-C17-M1250-XXX, виробництва компанії BTL BALLUFF. Серія являє собою закінчені готові модулі.

Рисунок 2 - Модуль для визначення лінійного переміщення фірми Balluff Micropulse.

Технічні характеристики магнітострикційні датчики лінійних переміщень Balluff Micropulse у профільному корпусі P з цифровим виходом, основні характеристики наведені нижче.

Тип магнітострикційні датчик лінійних переміщень

Діапазон вимірювань, мм 0 … 5500;

Дозвіл, мкм 1, 5, 10, 20 або 40;

Частота вимірів, Гц 500 … 3000;

Максимальна нелінійність, мкм 30;

Температура експлуатації, ° C -40 … 85;

Тип інтефейс START / STOP (цифровий імпульсний інтерфейс), SSI, CANopen, DeviceNet, PROFIBUS-DP;

Харчування DC;

Матеріал корпусу алюміній.

Вимірники шляху Balluff Micropulse володіють наступними перевагами:

безконтактне визначення положення об'єкта;

нечутливість до забруднень;

Відсутність механічного зносу;

Нечутливість до ударів і вібрації;

робота з декількома позиційними магнітами;

висока роздільна здатність.

Недоліки:

висока вартість, від 100 доларів США за 1 шт.

.2.1.2 Лінійні датчики серії ДЛП

Рисунок 3 - лінійні датчики ДЛП.

Лінійні датчики є найбільш поширеними приладами систем контролю і управління. В даний час у рамках системи розпочато серійний випуск датчиків малих лінійних переміщень (4 модифікації), що охоплюють діапазон вимірювань від 0-1мм до 0-50мм. Конструктивно прилади є циліндричний конденсатор з однією з обкладок, що переміщається уздовж осі. Механічно це один з найбільш відпрацьованих у машинобудуванні вузлів: циліндр з ходять всередині нього поршнем.

Таблиця 1. Технічні характеристики приладів

Тип приладу

ДЛП-02

ДЛП-05

ДЛП-1

ДЛП-2

Діапазон вимірювання, мм

до 0-5мм

до 0-10мм

до 0-20мм

до 0-50мм

Діапазон робочих температур, ° С

0.5-1.0; 1.5

0.5-1.0; 1.5

0.25; 0.5; 1.0

0.5-1.0; 1.5

Додаткова температурна похибка "0" і шкали, ±% / ° С

-5 ... +50

-5 ... +50

-5 ... +50

-5 ... +50

Смуга пропускання (-3dB), Гц

0.1

0.1

0.1

0.1

Габарити датчика

20

20

20

10

Мінімальна і максимальна довжина датчика в робочому положенні, мм

Ф 11х 21

Ф 11х 31

Ф 11х 45

Ф 11х 71

Повна вага датчика, м

22, 28

32, 46

46, 73

72, 124

Вага рухомої частини датчика, м

5.8

8.6

11.8

18.7


2.5

3.6

5.2

7.9


Недоліки:

механічний знос.

чутливі до пило і вологи.

1.3 Датчики кута повороту - енкодери

Рисунок 4 - круговий магнітний енкодер

Характеристики:

360 ° абсолютний кругової магнітний енкодер;

10, 9, 8, 7-біт програмоване дозвіл;

Програмування нульової позиції;

Швидкодія - до 10000 об / хв;

Інтерфейси: циф. SSI, A / B, ШІМ, UVW сигнали для безколекторного двигуна;

Детектор помилки позиціонування магніту;

Програмування "нульової" позиції;

Функція "кнопки";

Напруга живлення +3,3 В або +5 В;

Температура експлуатації -40 ° C ... +125 ° C;

Корпус TSSOP16.

Датчики кута повороту (енкодери) поділяються на інкрементальні і абсолютні, які можуть досягати дуже високого дозволу. Абсолютні енкодери в свою чергу можуть бути як оптичні, так і магнітні і можуть працювати через шинні інтерфейси. Вони безумовно відповідають таким вимогам, як точність, надійність, підвищена зносостійкість протягом тривалого періоду експлуатації.

.4 Датчики кута нахилу - інклінометра

Інкрементні енкодери призначені для визначення швидкості обертання і кута повороту об'єктів що обертаються. Вони генерують послідовний імпульсний цифровий код, який містить інформацію про кут повороту. Якщо вал зупиняється, то припиняється і передача імпульсів. Основним робочим параметром датчика є кількість імпульсів за один оберт. Миттєву величину кута повороту визначають підрахунку імпульсів від старту. Для визначення кутової швидкості об'єкта, процесор в тахометрі виконує диференціювання кількості імпульсів по часу, таким чином одразу величину швидкості, тобто число обертів на хвилину. Вихідний сигнал має два канали, в яких ідентичні послідовності імпульсів зсунуті на 90 ° відносно один одного, що дозволяє визначати напрямок обертання. Також є цифровий вихід нульової відмітки, який дає можливість визначити абсолютне положення вала.

.5 Принцип роботи UART

прецизійний управління датчик магнітострикційний

UART можна розділити на приймач (Receiver) і передавач (Transmitter). До складу UART входять: тактовий генератор зв'язку (бодрейт-генератор), керуючі регістри, статусні регістри, буфери та зсувні регістри приймача і передавача. Бодрейт-генератор задає тактову частоту прийомопередавача для даної швидкості зв'язку. Керуючі регістри задають режим роботи послідовного порту та його переривань. У статусному регістрі встановлюються прапори по різним подіям. У буфер приймача потрапляє прийнятий символ, в буфер передавача поміщають передається. Зсувний регістр передавача - це обойма, з якої в послідовний порт вистрілюються біти передаваного символу (кадру). Зсувний регістр приймача по біту накопичує прийняті з порту біти. За різним подіям встановлюються прапори і генеруються переривання (завершення прийому / відправки кадру, звільнення буфера, різні помилки).- повнодуплексний інтерфейс, тобто приймач і передавач можуть працювати одночасно, незалежно один від одного. За кожним з них закріплений порт - одна ніжка контролера. Порт приймача позначають RX, передавача - TX. Послідовною установкою рівнів на цих портах відносно загального проводу ("землі") і передається інформація. За замовчуванням передавач встановлює на лінії одиничний рівень. Передача починається посилкою біти з нульовим рівнем (старт-біта), потім йдуть біти даних молодшим бітом вперед (низький рівень - "0", високий рівень - "1"), завершується посилка передачею одного або двох бітів з одиничним рівнем (стоп-бітів).

Рисунок 5 - Електричний сигнал кадру посилки виглядає так.

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

Швидкість зв'язку або бодрейт (baudrate) вимірюється в бодах - число переданих біт в секунду (включаючи старт і стоп-біти). Задається ця швидкість в бодрейт-генераторі діленням системної частоти на задається коефіцієнт. Типовий діапазон швидкостей: 2400 ... 115200 бод.

Формат кадру визначає число стоп-бітів (1 або 2), число біт даних (8 або 9), а також призначення дев'ятий біта даних. Все це залежить від типу контролера.

Приймач і передавач тактується, як правило, з 16-кратної частотою щодо бодрейта. Це потрібно для семплювання сигналу. Приймач, піймавши падаючий фронт старт-біта, відраховує кілька тактів і наступні три такти зчитує (семплюются) порт RX. Це як раз середина старт-біта. Якщо більшість значень семплів - "0", старт-біт вважається таким, що відбувся, інакше приймач приймає його за шум і чекає наступного падаючого фронту. Після вдалого визначення старт-біта, приймач точно також семплюются серединки бітів даних і по більшості семплів вважає біт "0" або "1", записуючи їх у зсувний регістр. Стоп-біти теж семплюются, і якщо рівень стоп-біта не "1" - UART визначає помилку кадру і встановлює відповідний прапорець у регістрі.

Рисунок 6 - Момент відправки старт-біта

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

Висновок: Для реалізації завдання підходять тільки датчики, а не готові пристрої. Оскільки готові пристрої є частиною вимірювальної системи.

2. Розробка структури системи і опис поставленого завдання

.1 Опис поставленого завдання

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

Технічні дані і характеристики:

Діапазон вімірювань, мм 0 … 10;

Максимальна нелінійність, мкм 2,5;

Дозвіл, мкм 1;

Основна похибка вімірювання, мкм ± 0,5

Частота вімірів (встановлюється програмно), Гц 1 ... 3000

Тип інтефейсу RS-232;

Умови експлуатації:

Температура експлуатації, ° C +5 ... +35;

Відносна вологість Повітря, 298 ± 3К (25 ± 3 ° С),% не більше 65 + -15

Атмосферне лещата, кПа (мм.рт.ст.) 87.8 до 119,7

(Від 660 до 900)

Частота живильної Мережі, 50 ± 0,5 Гц, В, від 187 до 242

Напруг живиться Мережі змінного Струму, В, при частоті: 50 Гц 220 ± 20%

Атмосферний тиск до 60 кПа

Область застосування.

Дослідження в області руйнування зразків (гірна І будівельна промисловість)

2.2 Структурна схема та принципи роботи системи

Для створення інформаційно-керуючого комплексу з використанням стандартних пресів запропонована наступна структурна схема яка представляла на рисунку 7.

Рисунок 7 - Вимірювально-інформаційний комплекс управління пресом і збору інформації

Інформаційно-керуючий комплекс має 2 системи:

систему цифрового керування пресом (тиск, швидкість, навантаження), яка в даному дипломному проекті не розглядається;

інформаційно-вимірювальну.

Зразок вугілля або породи, правильної чи неправильної форми затискається між двома соосно-уставноленими кульовими іденторами. На нерухомій плиті встановлюються датчики лінійного переміщення, контролюючі зміни деформації зразка за трьома основними осях X, Y, Z і однією додатковою. Крім того існує канал, який контролює тиск (навантаження) при деформації зразка.

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

Рисунок 8 - часовий індикатор

Характеристики:

• 360 ° абсолютний кругової магнітний енкодер;

• 10, 9, 8, 7-біт програмоване дозвіл;

• Програмування нульової позиції;

• Швидкодія - до 10000 об / хв;

• Інтерфейси: циф. SSI, A / B, ШІМ, UVW сигнали для безколекторного двигуна;

• Детектор помилки позиціонування магніту;

• Програмування "нульової" позиції;

• Функція "кнопки";

• Напруга живлення +3,3 В або +5 В;

• Температура експлуатації -40 ° C ... +125 ° C;

• Корпус TSSOP16.

Рисунок 9 - Абсолютний кутовий енкодер переміщення AS5040, магніт якого закріплюється на стрілці спеціальної обоймі годинного індикатора.

3. Розробка мікроконтролерного блоку системи

.1 Структурна схема апаратного блоку системи

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

.1.1 Критерії вибору мікроконтролера

Основні критерії вибору мікроконтролера представлені нижче в порядку значимості:

Придатність для прикладної системи. Чи може вона бути зроблена на однокристальним мікроконтролері або її можна реалізувати на основі будь-якої спеціалізованої мікросхеми?

Чи має мікроконтроллер необхідне число контактів / портів введення / виведення, тому що у разі їх недостатності він не зможе виконати роботу, а в разі надлишку ціна буде занадто високою?

Чи має він всі необхідні периферійні пристрої, такі як послідовні порти вводу / виводу, RAM, ROM, EEPROM.

Чи має він інші периферійні пристрої, які не потрібні в системі?

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

Даним критеріям найкраще відповідає мікроконтроллер ATmega8 в корпусі DIP 28, для навісного монтажу. У порівнянні з аналогічними мікроконтролера, ATmega8 має найвищу тактову частоту в 16Мгц. Вартість менше ніж у аналогічних мікроконтролерів в керамічних корпусах і корпусах для поверхневого монтажу, дефіцитним не є. Фірма-виробник "Atmel" добре себе зарекомендувала на ринку, має хорошу репутацію, підтримку клієнтів і постійно оновлює асортимент.

3.1.2 Критерій вибору датчика для визначення лінійного зміщення

Як датчик для визначення лінійного зміщення був обраний абсолютний кутовий енкодер AS5040.

Переваги:

Найкраще співвідношення ціна / точність;

Відсутня механічний знос;

360 ° абсолютний кругової магнітний енкодер;

10, 9, 8, 7-біт програмоване дозвіл.

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

Принцип роботи з енкодера.

Кутовий енкодер складається з ІС енкодера, що вимірює зміна магнітного поля, розподіленого на торцевій поверхні стандартного діаметрально намагніченого циліндричного магніту

Рисунок 10 - Робочий принцип двохосьового абсолютного кутового енкодера на прикладі AS5040 (SSOP16).

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


де Bmax - амплітудне значення магнітного поля, Boff - ненульовий зсув поля, φ - фазовий зсув магнітного поля від нульової осі при обертанні магніту щодо нерухомого енкодера (вимірюваний кут),

x = ωt + φ0

- приведена незалежна змінна, ω - кутова швидкість, t - власне незалежна змінна (час),

φ0 - кутова координата нульової площини в полярній системі відліку.

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



У сімействі AS50хх інтегрована обробка сигналів з функцією арктангенс, реалізованої з 6-бітним диференціальним АЦП (AS5020 і AS50223) або 10-бітовим АЦП (AS5040 / 3), утворює еквівалентний по розрядності двійковий код, доступний через стандартний синхронний послідовний SSI-інтерфейс, і дозволяє зчитувати відповідно 64 або 1024 кутових становища за період 360 ° (див. ріс.36). Цифровий код включає попереджуючі біти стану джерела магнітного поля й біти парності.

Рисунок 11 - Схема 10-бітного програмованого кутового енкодера AS5040: а - функціональна схема; б - SSI - інтерфейс з даними про абсолютне кутовому положенні, в - інкрементальні вихідні режими AS5040; г - гістерезис інкрементальних висновків; д - ШІМ - інтерфейс з даними про абсолютне положенні

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

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

Обробка сигналу в AS5040 здійснюється через сигма-дельта аналогоцифрового перетворення і CORDIC-алгоритм ЦГЗ, що розраховує величину і зміщення сигналів елементів Холла, що забезпечує одержання високоточної інформації про абсолютне кутовому положенні.

Магнітні кутові енкодери типу AS5040 стійкі до зсувів магніту і зовнішнім магнітним збурень згідно диференціальної техніці вимірів, варіацій повітряного зазору і температурних варіацій згідно синусно - косинусне оцінці сигналу.

Цифрове слово SSI-інтерфейсу AS5040 з 10-бітним кодом даних включає біти статусу компенсації зрушень, помилки даних (переповнення CORDIC-алгоритму), застережливий біт лінійності, цифрову інформацію MagINCn іMagDECn про переміщення магніту у вертикальній осі (доступну також на виходах MagINCn і MagDECn), і біт парності. Абсолютна становище оцінюється зі швидкістю 10 кГц (0,1 мс), що відповідає зчитування 1024 положень магніту за період 360 ° протягом 0,1 с (9,76 Гц або 585,9 об / хв максимум). Без пропусків можливо отримання швидкостей до 1200 об / хв.

На додаток, 10-бітове абсолютне значення кута у вигляді одноканального ШІМ-сигналу з робочим циклом, пропорційним куті, є на виведення 12 PWM_LSB. З використанням зовнішнього ФНЧ ШІМ-сигнал може бути перетворений в пропорційне аналогове напруга, що дозволяє використовувати AS5040 для заміщення потенціометрів.

.2 Реалізація програмної частини мікроконтролера

Сформуємо основні вимоги, які повинна виконати програма, що працює на мікроконтролері ATmega8:

) Набір команд:

початок вимірювання;

запит даних;

Завершення вимірювань.

) Перед початком вимірювань для кожного датчика повинна бути визначена початкова точка відліку.

) Опитування всіх датчиків.

) На основі отриманих даних від датчиків визначити напрямок повороту.

) Для кожного датчика розрахувати зміщення відносно початкової точки.

) формувати посилки даних відправляються на ПК.

Сформуємо основні вимоги, які повинна виконати програма верхнього рівня:

) Виведення інформації у вигляді графіків;

) Вибір номера COM-порту;

) Вибір файлу в який будуть збережуться результати роботи;

) Можливість відправляти керуючі команди пристрою.

) Вибір частоти опитування датчиків.

3.2.1 Логічна структура програми для МК ATmega8

Програма реалізована з використанням операційної системи scmRTOS. Причиною використання ОС послужило, те що програма повинна виконувати три задачі:

) очікування команд;

) опитування датчиків та обробка результатів;

) формування посилки відповіді.

Завдання 2 і 3 реалізовані засобами ОС scmRTOS. Задача 1 реалізована на основі переривання від UART.

Рисунок 12 - Структура программы прошивки

Процес № 1 очікує вхідні дані. Реалізований на основі переривання від UART.

Якщо мікроконтроллер отримає дані, то вони будуть записані в канал. Канал - це сервіс OC scmRTOS який дозволяє безпечно передати дані будь-якого процесу в системі. Після чого переривання завершиться і управління буде передано ОС, яка тут же передасть управління процесу який очікує дані.

Рисунок 13 - Блок схема процесу 1

Процес №2 здійснює дві функції:

якщо цей початок виміру, то проводить ініціалізацію початкових даних;

якщо це робочий режим, то проводить опитування датчиків і коригує дані.

Процес реалізований засобами ОС і є її частиною.

Якщо процес був запущений з командою початок вимірів, то будуть виконані наступні дії:

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

) Визначається поточний стан энкодеров. Це стани надалі сприйматиметься як нуль.

) Ініціалізувалися змінні необхідні для визначення напрями повороту енкодерів і довжина кроку на який змістилася стрілка.

) Процес переводиться в робочий режим.

) Вихід з критичної секції.

) Кінець

Якщо процес знаходиться в робочому режимі, то будуть виконані наступні дії:

) Вхід в критичну секцію.

) Опитування стану енкодерів.

) Вихід з критичної секції.

) Захоплення мьютекса. Ця дія потрібна для синхронізації процесів 2 і 3.

) Коригування даних. Буде визначено напрям повороту енкодерів і довжина кроку.

) Звільнення мьютекса.

) Кінець.

Рисунок 14 - Блок схема процесу 2

Процес №3 чекає подію від ОС "повернути дані". Процес реалізований засобами ОС і є її частиною.

Після настання події процес виконає наступні дії:

) Захоплення мьютекса. Ця дія потрібна для синхронізації процесів 2 і 3.

) Відправка даних на ПК.

) Звільнення мьютекса.

) Кінець.

Рисунок 15 - Блок схема процесу 3.

3.3 Критерій вибору мікросхеми узгодження рівнів RS232 <=> UART4

В якості мікросхеми узгодження була обрана мікросхема MAX232. Це було зумовлено її великою популярністю і доступністю.- інтегральна схема, яка перетворює сигнали послідовного порту RS-232 у сигнали, придатні для використання в цифрових схемах на базі ТТЛ або КМОП технологій. MAX232 працює прийомопередатчиком і перетворює сигнали RX, TX, CTS і RTS.

Функціональність і цоколевка мікросхеми стала стандартом де-факто і її аналоги (з іншого маркуванням) випускаються безліччю виробників напівпровідників.

Схема забезпечує рівень вихідної напруги, що використовується в RS-232 (приблизно ± 7.5 В), перетворюючи вхідну напругу + 5 В за допомогою внутрішнього зарядового насоса на зовнішніх конденсаторах. Це спрощує реалізацію RS-232 в пристроях, що працюють на напругах від 0 до + 5 В, так як не потрібно ускладнювати джерело живлення тільки для того, щоб використовувати RS-232.

Вхідна напруга від RS-232, яке може досягати ± 25 В, знижується до стандартних 5 В, використовуваних в транзисторних-транзисторної логіки. Входи мають середній поріг 1.3 В і середній гістерезис 0.5 В.

4. Розробка програмного забезпечення інформаційно-керуючої оболонки системи

Програма верхнього рівня реалізована на мові С Sharp.

Користувач може:

• Вибрати номер COM-порту до якого підключено пристрій;

• Вибрати частоту опитування датчиків;

• Вибрати файл для збереження результату роботи. У цей файл динамічно буде збережуться результати;

• У будь-який момент часу зберегти результати опитування будь-якого з датчиків. Для цього необхідно натиснути праву кнопку миші на необхідному графіку і вибрати пункт "Зберегти у...";

Рисунок 16 - Головне вікно програми: 1-закладка вибору основного режиму; 2 - закладка вибору режиму підстроювання; 3-графік, відображає поточні результати; 4 - поточне значення сили; 5 - поточні налаштування проекту; 6 - виклик діалогу налаштування; 7 - запуск роботи; 8 - Зупинити вимірювання.

У разі виникнення помилки робота буде зупинена. Під час роботи може виникнути два види помилок:

. Пристрій перестало відгукуватися.

. Файл для запису результатів роботи став недоступний.

Рисунок 17 - Вікно налаштування підключення: 1-вибір COM-порту; 2-вибір частоти опитування датчиків.

Рисунок 18 - Вікно настройки проекту.

Вкладка "Перевірка"необхідна для налагодження та калібрування пристрою.

Рисунок 19 - Вікно для калібрування пристрою: 1 - поточне значення, МКК, 2-графік, відображає динаміку зміни значень датчика; 3 - вибір файлу для збереження результату.

5. Техніко-економічне обґрунтування

У дипломній роботі розроблено програмне забезпечення приладу, що дозволяє виміряти лінійне зміщення у динамічному діапазоні 0 .. 10 мм з точністю 10 мкм. У даному розділі необхідно виконати розрахунок собівартості вище зазначеного програмного продукту та проаналізувати його орієнтовну ціну, рентабельність, порівняти отримані результати з ідентичними показниками аналогічних програмних продуктів.

Згідно з методикою, представленої в [23] собівартість розробки програмного продукту визначається сумарними витратами на його розробку.

Калькуляція собівартості розробленого програмного продукту (програмного забезпечення) складається за такими статтями витрат:

 (5.1)

де  - вартість витратних матеріалів, необхідних для розробки програмного продукту, грн.;

 - витрати на сумарну заробітну плату розробників програмного продукту, грн.;

 - відрахування із заробітної плати розробників програмного продукту до фондів загальнообов'язкового державного соціального страхування (відрахування на соціальні заходи), грн.;

 - витрати на утримання та експлуатацію обладнання (або витрати на оплату машинного часу) у складі витрат на розробку програмного продукту, грн.;

 - інші накладні витрати у складі витрат на розробку програмного продукту, грн.

5.1 Визначення вартості витратних матеріалів, необхідних для розробки програмного продукту

Вартість витратних матеріалів, необхідних для розробки програмного продукту, визначається за формулою:

 (5.2)

де  - ціна i-го виду витратних матеріалів, необхідних для розробки програмного продукту, грн. / шт.;

 - норма витрати (кількість) i-го виду витратних матеріалів, необхідних для розробки програмного продукту, шт.;

 - відсоток транспортно-заготівельних витрат на матеріали, приймається = 7%;

 - відсоток вартості зворотних відходів, приймається .

Вартість транспортно-заготівельних витрат (Стр), визначається за формулою:

 (5.3)

Вартість зворотних відходів (), визначається за формулою:

 (5.4)

Розрахунок вартості витратних матеріалів, необхідних для розробки програмного продукту наведено в таблиці 5.1.

Таблиця 5.1 - Розрахунок вартості витратних матеріалів, необхідних для розробки програмного продукту

Вартість, грн./шт.

Кількість, шт.

Вартість, грн.

Папір для офісної техніки (формат А 4)

49,50

1

49,50

CD-RW

2,75

3

8,25

Заправка картриджа для лазерного принтера

55,00

1

55,00

Канцелярські товари

21,12

Серветки для протирання монітора

22,00

1

22,00

Навчальні посібники

78

2

156,00

РАЗОМ: Вартість покупки матеріалів, грн.

207,25

8

311,87

Вартість транспортно-заготівельних витрат, грн. (7%)

21,83

Вартість зворотних відходів, грн. (3%)

9,36

Вартість витратних матеріалів, необхідних для розробки програмного продукту, , грн.343,06



Відповідно до формули (5.3), вартість транспортно-заготівельних витрат становить:

Відповідно до формули (5.4), вартість зворотних відходів становить:

Відповідно до формули (5.2) вартість витратних матеріалів, необхідних для розробки програмного забезпечення, складає:

См =  343,06 грн.

Таким чином, вартість витратних матеріалів (См), необхідних для розробки програмного продукту, складає 343,06 грн..

5.2 Визначення витрат на сумарну заробітну плату розробників програмного продукту

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

Згідно з [9] фонд оплати праці складається з:

) фонду основної заробітної плати ;

) фонду додаткової заробітної плати ;

) фонду інших заохочувальних та компенсаційних виплат .

Таким чином, витрати на сумарну заробітну плату розробників програмного продукту  становлять:

 (5.5)

Основна заробітна плата розробників програмного продукту:

 (5.6)

де  - годинна тарифна ставка розробника програмного продукту відповідно до його кваліфікації, грн. / год.;

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

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

Годинні тарифні ставки за розрядами тарифної сітки визначаються шляхом множення годинної тарифної ставки працівника першого тарифного розряду на відповідний тарифний коефіцієнт тарифної сітки. Годинна тарифна ставка розробника програмного продукту визначається відповідно до [10] на підставі "Єдиної тарифної сітки розрядів і коефіцієнтів з оплати праці працівників підприємств, установ і організацій окремих галузей бюджетної сфери". Єдина тарифна сітка наведена в Додатку А.

У рамках даної роботи тарифна ставка працівника першого тарифного розряду приймається рівною 5,77 грн./год.

Тарифний розряд розробника програмного продукту (посада - спеціаліст-програміст) приймається рівним 8 [10], відповідний тарифний коефіцієнт становить - 1,64 [10]. Тарифні розряди і відповідні їм тарифні коефіцієнти наведені в Додатку А.

Середня годинна тарифна ставка розробника програмного забезпечення становить:= грн./год.

Розрахунок значення підсумкової трудомісткості розробки програмного продукту та фонду основної заробітної плати  виконано нижче.

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

, грн. (5.7)

Інші заохочувальні та компенсаційні виплати  приймаємо в розмірі 23% від фонду основної заробітної плати розробників програмного продукту.

, грн. (5.8)

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

Відповідно до ISO / IEC 12207-2008 "Systems and software engineering. Software life cycle processes" (відповідний вітчизняний стандарт - "ДСТУ 3918-99 Інформаційні технології. Процеси життєвого циклу програмного забезпечення") можна виділити такі типові етапи (стадії) розробки програм:

постановка (формулювання) завдання;

розробка специфікації вимог до програмного продукту;

дослідження предметної області (у тому числі: обґрунтування принципової можливості вирішення поставленого завдання; визначення структури даних; попередній вибір методів рішення поставленої задачі та ін.);

проектування програмної архітектури;

опрацювання модульної структури програми;

розробка інтерфейсів між модулями;

розробка алгоритмів програми;

розробка коду програми;

тестування і налагодження програми;

підготовка та оформлення програмної документації.

Таким чином, трудомісткість робіт з розробки програмного продукту можна представити як суму тривалості всіх передбачених етапів (стадій) розробки програмного продукту:

 (5.9)

где i - порядковий номер етапу розробки програмного продукту;- загальна кількість етапів розробки програмного продукту;

 - тривалість i-го етапу розробки програмного продукту, год.

Тривалість i-го етапу розробки програмного продукту - це дійсні витрати часу, що затрачені програмістом під час розробки програмного забезпечення приладу, що дозволяє виміряти лінійне зміщення у динамічному діапазоні 0 … 10 мм.

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

Підсумкова трудомісткість розробки програмного продукту становить:

 (5.10)

де  - базова трудомісткість розробки програмного продукту (без врахування ступеня новизни програмного продукту, ступеня складності програмного продукту, рівня мови програмування і кваліфікації розробника);

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

 - значення коефіцієнта кваліфікації розробника програмного продукту.

Значення коефіцієнта кваліфікації  розробника програмного продукту умовно характеризує рівень кваліфікації розробника і, в загальному випадку, залежить від стажу роботи розробника. Відповідність між рівнем кваліфікації розробника програмного продукту  і стажем роботи розробника подається в Додатку Б. Значення  в межах дипломної роботи приймається рівним 0,8 (стаж роботи до 2-х років) (см. Додаток Б).

Значення коефіцієнту, що враховує новизну програми, складність програми та рівень мови програмування (с) обирається з Додатку В (з урахуванням ступеня новизни програмного продукту, ступеня складності програмного продукту, рівня мови програмування). Для програмного забезпечення приладу, що дозволяє виміряти лінійне зміщення у динамічному діапазоні 0 .. 10 мм, що передбачає розробку програм з використанням типових рішень (ступінь новизни - В), включаючи алгоритми оптимізації і моделювання системи (ступінь складності програми - 1), мовою високого рівня, значення коефіцієнту, що враховує новизну програми, складність програми та рівень мови програмування (с), складає 1,15 (см. Додаток В).

Значення коефіцієнта коригування програми (p) характеризує збільшення обсягу робіт за рахунок внесення змін до алгоритму або програму за результатами уточнення технічного завдання в процесі виконання робіт на різних стадіях розробки програмного забезпечення. У рамках даної роботи коефіцієнт р приймається рівним 1,1.

На підставі вищезазначеного розрахуємо значення підсумкової трудомісткості розробки програмного забезпечення:

У таблиці 5.2 представлена структура підсумкової трудомісткості робіт  з розробки програмного продукту (тобто розподіл трудомісткості робіт за стадіями розробки програмного забезпечення). Значення базової трудомісткості розробки програмного продукту 509 год. є сумарним значенням тривалості розробки програмного забезпечення приладу, що дозволяє виміряти лінійне зміщення у динамічному діапазоні 0 .. 10 мм, за етапами, що зазначені в таблиці 5.2.

Відповідно до формули (5.6), основна заробітна плата розробника ПЗ становить:

грн.

Таблиця 5.2 - Розподіл трудомісткості робіт за стадіями розробки програмного продукту

Стадія розробки програмного продукту

Позначення

Значення

Питома вага,%

1

2

3

4

Витрати праці на постановку (формулювання) завдання

Т1

8,04

1%

Витрати праці на розробку специфікації вимог до програмного продукту

Т2

16,08

2%

Витрати праці на дослідження предметної області

Т3

40,2

5%

Витрати праці на проектування програмної архітектури

Т4

56,28

7%

Витрати праці на опрацювання модульної структури програми

Т5

40,2

5%

Витрати праці на розробку інтерфейсів між модулями

Т6

40,2

5%

Витрати праці на розробку алгоритмів програми

Т7

80,4

10%

Витрати праці на розробку коду програми

Т8

160,8

20%

Витрати праці на тестування і налагодження програми

Т9

281,4

35%

Витрати праці на підготовку та оформлення програмної документації

Т10

80,4

10%

РАЗОМ: Трудомісткість робіт з розробки програмного продукту, ч.

ТПО

804

100%


Відповідно до формули (5.7), додаткова заробітна плата розробника програмного забезпечення становить:

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

 

Відповідно до формули (5.5), витрати на сумарну заробітну плату розробників програмного продукту становлять:


5.3 Розрахунок відрахувань на соціальні заходи

Згідно з [13] існує чотири фонди загальнообов’язкового державного соціального страхування.

Відповідно [11] для платників-роботодавців базою оподаткування внесками до фондів обов'язкового державного страхування є всі виплати, які включаються до фонду оплати праці, які підлягають оподаткуванню з доходів фізичних осіб.

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

Суми єдиного внеску розподіляються за видами загальнообов’язкового державного соціального страхування пропорційно до сум єдиного внеску (у відсотках) згідно з 2 класом професійного ризику і становлять:

загальнообов’язкове державне пенсійне страхування (до солідарної системи) - 90,291%;

загальнообов’язкове державне соціальне страхування на випадок безробіття - 4,0794%;

загальнообов’язкове державне соціальне страхування у зв’язку з тимчасовою втратою працездатності та витратами, зумовленими похованням - 3,8075%.

загальнообов’язкове державне соціальне страхування від нещасного випадку на виробництві та професійного захворювання, які спричинили втрату працездатності - 1,8221%.

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

Визначення класу професійного ризику виробництва за видами економічної діяльності здійснюється Фондом соціального страхування від нещасних випадків у порядку, встановленому відповідно до [14].

Відповідно [13] єдиний внесок на загальнообов'язкове державне соціальне страхування, що відповідає другому класу види професійного ризику (згідно з [14] "Створення програмного забезпечення" має другий клас професійної діяльності) дорівнює 36,77 %.

З урахуванням вищевикладеного розрахуємо розмір відрахувань із заробітної плати до фонду загальнообов'язкового державного страхування ():

Отже, відрахування із заробітної плати розробників програмного продукту до фондів загальнообов’язкового державного соціального страхування  становлять 5257,74 грн.

5.4 Розрахунок витрат на оплату машинного часу при розробці програмного продукту

Витрати на оплату машинного часу при розробці програмного продукту  визначають витрати на утримання та експлуатацію обладнання і становлять:

 (5.11)

де  - фонд машинного часу при створенні програмного продукту, год.;

 - вартість 1 машино-години, грн. / год..

Розрахуємо фонд машинного часу при розробці програмного продукту за формулою:

 (5.12)

де  - затрати праці на розробку коду програми, год.;

 - затрати праці на тестування і налагодження програми, год.;

 - затрати праці на підготовку та оформлення програмної документація, год.;

 - коефіцієнт, що враховує витрати часу на профілактичні ремонти обладнання (в розрахунку приймається ).

Витрати праці по всіх складових фонду машинного часу при створенні програмного продукту  визначаються відповідно до розподілу трудомісткості робіт за стадіями розробки програмного продукту (дивись таблиця 5.2).

Отже, фонд машинного часу при розробці програмного продукту становить:

Вартість 1 машино-години включає оплату утримання та сервісного обслуговування ЕОМ і оргтехніки і становить:

 (5.13)

де  - повні витрати на утримання та експлуатацію устаткування протягом року, грн. - за рік;

 - дійсний річний фонд часу роботи обладнання, год. - на рік.

Повні витрати на утримання та експлуатацію устаткування протягом року  становлять:

 (5.14)

де  - річні витрати на сумарну заробітну плату працівників із числа обслуговуючого персоналу, грн. на рік;

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

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

 - річні витрати на електроенергію у складі витрат на утримання та експлуатацію обладнання, грн. на рік;

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

 - річні інші накладні витрати у складі витрат на утримання та експлуатацію обладнання, грн. на рік.

Розрахунок річних витрат на сумарну заробітну плату працівників із числа обслуговуючого персоналу () у складі витрат на утримання та експлуатацію устаткування представлено п.5.4.

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

Розрахунок річних амортизаційних відрахувань () у складі витрат на утримання та експлуатацію обладнання наведений нижче.

Розрахунок річних витрат на електроенергію () у складі витрат на утримання та експлуатацію обладнання і розрахунок річного фонду часу роботи обладнання представлені нижче.

Розрахунок річних загальногосподарських витрат () і інших накладних витрат () у складі витрат на утримання та експлуатацію устаткування також представлено нижче.

Річні витрати на сумарну заробітну плату працівників із числа обслуговуючого персоналу () визначаються складовими фонду оплати праці обслуговуючого персоналу і складають:

 (5.15)

де  - річний фонд основної заробітної плати працівників з числа обслуговуючого персоналу, грн. на рік;

- річний фонд додаткової заробітної плати працівників із числа обслуговуючого персоналу, грн. на рік;

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

Річний фонд основної заробітної плати працівників із числа обслуговуючого персоналу:

 (5.16)

де - годинна тарифна ставка працівника з числа обслуговуючого персоналу відповідно до його кваліфікації, грн. / год.;

Фд - дійсний фонд часу роботи одного працівника з числа обслуговуючого персоналу, год. на рік.

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

Кваліфікаційний тарифний розряд [10] працівника з числа обслуговуючого персоналу приймається рівним 6 (посада - старший лаборант), відповідно до схеми посадових окладів тарифний коефіцієнт становить 1,45 (дивись Додаток А).

Середня годинна тарифна ставка обслуговуючого персоналу складає:

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

При розрахунку  враховується, що в загальному випадку, у відповідності до вимог Кодексу законів про працю (КЗпП), при п'ятиденному робочому тижні робота не проводиться у вихідні та святкові дні, а в передсвяткові дні тривалість робочого дня скорочується на одну годину [15, стаття 53, стаття 73].

З урахуванням зазначеного графіка роботи, дійсний річний фонд часу роботи одного працівника з числа обслуговуючого персоналу () складає:

 (5.17)

де - кількість робочих днів у році, дн. на рік;

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

 - тривалість робочого дня (зміни) відповідно до встановленого графіка роботи, год. / дн.

Кількість робочих днів у році () становить:

 (5.18)

де  - кількість календарних днів у році, дн. на рік;

 - кількість вихідних днів у році (відповідно до встановленого графіка роботи), дн. на рік;

 - кількість святкових днів у році (робота в які не проводиться), дн. на рік.

У таблиці 5.4 зведені дані, відповідно до [16], необхідні для розрахунку дійсного фонду часу роботи.

Таблиця 5.4 - Розрахунок дійсного фонду часу роботи на 2011 р.

Найменування

Позначення

Значення

Кількість календарних днів у році, дн. на рік

365

Кількість вихідних днів, дн. на рік

105

Кількість святкових днів, дн. на рік

Nсв

10

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

Nсрд

4

Тривалість робочого дня (зміни), р. в день

t

8


Відповідно до формули (5.18), кількість робочих днів у році складає:

Відповідно до формули (5.17), дійсний річний фонд часу роботи одного працівника з числа обслуговуючого персоналу складає:

Відповідно до формули (5.16), річний фонд основної заробітної плати працівника з числа обслуговуючого персоналу:

Річний фонд додаткової заробітної плати працівників з числа обслуговуючого персоналу () в рамках дипломної роботи приймаємо в розмірі 1,5% від річного фонду основної заробітної плати працівників з числа обслуговуючого персоналу.

Річний фонд інших заохочувальних та компенсаційних виплат працівникам з числа обслуговуючого персоналу () приймається в розмірі 3% від річного фонду основної заробітної плати працівників з числа обслуговуючого персоналу.

Відповідно до формули (5.15), річні витрати на сумарну заробітну плату працівників із числа обслуговуючого персоналу складають:

 

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

Річні відрахування до фондів на соціальні заходи з фонду оплати праці обслуговуючого персоналу складають (Зсоц) 6419,42 грн.

У рамках дипломної роботи для розрахунку річних амортизаційних відрахувань (За) використовується метод нарахування амортизації, передбачений податковим законодавством [17, стаття 8 "Амортизація"].

Відповідно до [17] сума амортизаційних відрахувань звітного періоду визначається як сума амортизаційних відрахувань, нарахованих для кожного із календарних кварталів, що входять у звітний період (далі - розрахункові квартали).

Сума амортизаційних відрахувань на розрахунковий квартал визначається шляхом застосування норм амортизації до балансової вартості об'єктів відповідних груп основних фондів на початок розрахункового кварталу.

Відповідно до [17] устаткування, яке використовується при розробці програмного забезпечення, належить до 4-ої групи основних фондів. Норма

амортизації, що відповідає 4-ої групи основних фондів, становить 15% на один розрахунковий квартал.

Балансова вартість об'єктів основних фондів на початок розрахункового кварталу () визначається за формулою:

 (5.19)

де i - номер розрахункового кварталу;

(i − 1) - номер кварталу, що передував розрахунковому кварталу;

 - балансова вартість основних фондів на початок кварталу, що передував розрахунковому, грн.;

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

 - сума виведених з експлуатації основних фондів протягом кварталу, що передував розрахунковому, грн.;

 - сума амортизаційних відрахувань, нарахованих у кварталі, що передував розрахунковому, грн.

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

Сума амортизаційних відрахувань на поточний розрахунковий квартал () визначається за формулою:

 (5.20)

де i - номер розрахункового кварталу;

- балансова вартість основних фондів на початок розрахункового кварталу, грн.;

- норма амортизації для відповідної групи основних фондів, %.

Норма амортизації () встановлюються у розрахунку на один квартал, у відсотках до балансової вартості кожної з груп основних фондів на початок розрахункового кварталу в розмірах, передбачених відповідним законодавством [17] на поточну дату.

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

Річні амортизаційні відрахування () у складі витрат на утримання і експлуатацію обладнання складають:

 (5.21)

де i - номер розрахункового кварталу;

 - сума амортизаційних відрахувань на поточний розрахунковий квартал, грн.

Розрахунок річних амортизаційних відрахувань у складі витрат на утримання і експлуатацію обладнання зведено в таблицю 5.6.

Таблиця 5.6 - Розрахунок річних амортизаційних відрахувань () у складі витрат на утримання і експлуатацію обладнання

№ кварталу

Балансова вартість основних фондів на початок поточного розрахункового кварталу (Баі), грн.

Сума амортизаційних відрахувань на поточний розрахунковий квартал грн. (Ааі), грн.

1

2

3

1

3350,00

502,5

2

2847,50

427,13

3

2420,37

363,06

4

2057,31

308,59

РАЗОМ: Сума річних амортизаційних відрахувань (За), грн.

1601,28


Річні амортизаційні відрахування () у складі витрат на утримання і експлуатацію обладнання складають 1601,28 грн.

Річні витрати на електроенергію () у складі витрат на утримання та експлуатацію устаткування визначаються вартістю електроенергії, споживаної обладнанням (ЕОМ, оргтехнікою та ін.) протягом року.

Вартість електроенергії, споживаної обладнанням за рік, становить:

 (5.22)

де  - загальна сумарна потужність обладнання (ЕОМ, оргтехніка та ін), кВт-год.;

- ціна (тариф) електроенергії з ПДВ, грн. / 1 кВт-год.;

 - дійсний річний фонд часу роботи обладнання, год. на рік.

Сумарна потужність обладнання за умови, що обладнання експлуатується в робочому режимі (при завантаженні процесора 80%) (дивись Додаток Г):

За станом на 01.04.2011 ціна 1 кВт для промислових споживачів 2-го класу напруги з ПДВ становить 0,95124 грн. /кВт-год [18].

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

Дійсний річний фонд часу роботи обладнання () складає:

 (5.23)

де  - номінальний (або режимний) фонд часу роботи обладнання (відповідно до встановленого режиму роботи підприємства), год. на рік;

- тривалість планових простоїв на ремонт, заміну і модернізацію устаткування, год. на рік.

У рамках розрахунків дипломної роботи номінальний фонд часу роботи обладнання () приймається рівним дійсному річному фонду часу роботи одного працівника з числа обслуговуючого персоналу (), а тривалість планових простоїв на ремонт, заміну і модернізацію обладнання () дорівнює 10 % від  :

 (5.24)

 (5.25)

Відповідно до формули (5.25) тривалість планових простоїв на ремонт, заміну і модернізацію устаткування становить:

Дійсний річний фонд часу роботи обладнання становить:

Відповідно до формули (5.22) річні витрати на електроенергію () у складі витрат на утримання та експлуатацію устаткування становлять:

Під загальногосподарськими витратами () у складі повних витрат на утримання та експлуатацію устаткування протягом року слід розуміти оплату вартості освітлення, опалення, інших комунальних послуг, вартість оренди приміщення та ін. У рамках дипломної роботи вартість загальногосподарських витрат приймається у розмірі 7% від річного фонду основної заробітної плати обслуговуючого персоналу:

 (5.26)

Відповідно до формули (5.26) загальногосподарські витрати () у складі повних витрат на утримання та експлуатацію устаткування протягом року становлять:

Інші накладні витрати () у складі повних витрат на утримання та експлуатацію устаткування протягом року приймаємо у розмірі 5% від річного фонду основної заробітної плати обслуговуючого персоналу:

 (5.27)

Відповідно до формули (5.27) інші накладні витрати () у складі повних витрат на утримання та експлуатацію устаткування протягом року становлять:

Відповідно до формули (5.14) повні витрати на утримання та експлуатацію обладнання протягом року становлять:

Відповідно до формули (5.13) вартість 1 машино-години становить:

Розрахуємо витрати на утримання та експлуатацію обладнання  у складі витрат на розробку програмного продукту відповідно до формули (5.11):

5.5 Розрахунок інших накладних витрат у складі витрат на розробку програмного продукту

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

 (5.28)

Відповідно до формули (5.28), інші накладні витрати у складі витрат на розробку програмного продукту складають:

Відповідно до формули (2.1) собівартість розробленого програмного продукту становить:

Результати розрахунку собівартості розробки програмного продукту зведені у таблиці 5.8.


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

Таблиця 5.7 - Елементи витрат на апаратну частину комплексу

Назва елементу

Вартість, грн./шт.

Кількість, шт.

Вартість, грн.

Часовий мікрометр

863,23

1

863,23

Угловий енкодер переміщення AS5040

180,00

1

180,00

Мікроконтроллер ATmega8

40,2

1

40,2

РАЗОМ: Вартість покупки матеріалів, грн.

1083,43

3

1083,43

Вартість транспортно-заготівельних витрат, грн. (2%)



21,67

Вартість монтажу, грн. (5%)



54,17

Вартість відладки, 3%(грн.),.



32,50


Витрати на апаратне забезпечення дорівнюють

,

де - транспортні витрати (2%),

- витрати на монтаж апаратного забезпечення,

- витрати на відладку апаратного забезпечення.

Разом витрати на апаратне забезпечення становлять:

 грн.

5.7 Висновки за розділом

.7.1 Результати розрахунку собівартості розробленого програмного забезпечення

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

Підсумкова собівартість розробки даного програмного продукту склала 30479,45 грн. Велику частку собівартості становлять витрати на оплату сумарною заробітної плати розробників програмного продукту 46,91% і відрахування із заробітної плати розробників програмного забезпечення до фонду загальнообов'язкового державного соціального страхування 17,25%.

У таблиці 5.7 представлені показники, необхідні для визначення собівартості розробки програмного продукту.

Результати розрахунку собівартості розробки програмного продукту зведені у таблиці 5.8.

Таблиця 5.7 - Розрахункові показники для визначення собівартості розробки програмного продукту

Найменування показника

Позначення

Значення

1. Базова трудомісткість розробки програмного продукту, год.

ТО

509

2. Підсумкова трудомісткість розробки програмного продукту, год.

ТПЗ

804

3. Підсумкова трудомісткість розробки програмного продукту, (8-годинний робочий день) днів

ТПОД

101

4. Фонд машинного часу при створенні програмного продукту, год.

tM

575

5. Дійсний річний фонд часу роботи обладнання, год.-на рік

Фоб

1976,04

6. Повні витрати на утримання та експлуатацію устаткування протягом року, грн.-на рік

Зоб

28300,33

7. Вартість 1 машино-години, грн / год.

Rоб

15,75


Таблиця 5.8 - Результати розрахунків собівартості розробки програмного забезпечення

Назва показника

Позначення

Значення



грн.

%

1

2

3

4

1. Вартість витратних матеріалів, необхідних для розробки програмного продукту, грн.

СМ

343,06

1,13

2. Витрати на сумарну заробітну плату розробників програмного продукту, грн.

СЗП

14298,98

46,91

3. Відрахування із заробітної плати розробників програмного продукту до фондів загальнообов'язкового державного соціального страхування (відрахування на соціальні заходи), грн.

Ссоц

5257,74

17,25

4. Витрати на утримання та експлуатацію обладнання (або витрати на оплату машинного часу) у складі витрат на розробку програмного продукту, грн.

Соб

9058,5

29,72

5. Інші накладні витрати у складі витрат на розробку програмного продукту, грн.

Сін

1521,17

4,99

РАЗОМ: Собівартість розробленого програмного забезпечення, грн.

СПЗ

30479,45

100,00


5.7.2 Аналіз собівартості системи

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

Стаття витрат

Значення



грн.

%

1

Витрати на розробку ПО

30479,45

96,24

2

Витрати на придбання апаратного забезпечення

1191,77

3,76


Повна собівартість

31671,22

100


Як бачимо у затратах переважують витрати на розробку ПО 30479,45грн. (96,24%). Затрати на придбання апаратного забезпечення становлять 1191,77 грн.

Висновок

У ході роботи було розроблено пристрій для визначення лінійного зміщення в динамічному діапазоні 0 ... 10 мм. Накопичувальна похибка не перевищує 10 мкм.

Була написана програма прошивка а також реалізована програма високого рівня для управління роботою пристрою.

Перелік посилань

. ГОСТ 15150-69. Машини, прилади та інші технічні вироби. Виконання для різних районів. Категорії, умови експлуатації, зберігання і транспортування в частині впливу кліматичних факторів зовнішнього середовища. Введ. 01.01.70.

. Практичний посібник з навчального конструювання РЕА. / Под ред. К.Б. Круковського-Сіневич, Ю.Л. Мазора. - К.: "Вища школа", 1992. - 494с.

. ГОСТ 23751-86. Плати друковані. Основні параметри конструкції. - Введ. 01.07.87.

. Методичні вказівки до виконання курсового проекту з дисципліни "Основи конструювання і технології електронних пристроїв" / Укл.: Ю.Е. Паеранд - Алчевськ: ДГМІ, 2003. 55 - с.

. ДСТУ 2779-94. Монтаж електричний радіоелектронної апаратури та приладів. Загальні технічні вимоги до формування висновків і до установки виробів електронної техніки на друковані плати. - Введ. 01.01.96.

. ГОСТ 10317 - 79. Друковані плати. Основні розміри. - Введ. 01.01.80.

. ГОСТ 2.417-91. ЕСКД. Плати друковані. Правила виконання креслень. - Введ. 01.07.92.

. Закон України "Про оплату праці" № 108/95-вр.

. Постанова Кабінету Міністрів України "Про оплату праці працівників на основі Єдиної тарифної сітки розрядів і коефіцієнтів з оплати праці працівників установ, закладів та організацій окремих галузей бюджетної сфери" № 1298 від 30.08.2002 р. (у редакції Постанови Кабінету Міністрів України від 22.08.2005г. № 790, із змінами на поточну дату).

. Закон України "Про загальнообов'язкове державне соціальне страхування від нещасного випадку на виробництві та професійного захворювання, які спричинили втрату працездатності" № 1105-14

.     Закон України "Про загальнообов'язкове державне пенсійне страхування" № 1058-15

12.    Закон Украины "Про збір та облік єдиного внеску на загальнообов'язкове державне соціальне страхування" № 2464-VI від 8.07.2010 року (набуття чинності 1 січня 2011 року).

.        Постанова КМУ "Про затвердження Порядку визначення страхових тарифів для підприємств, установ та організацій на загальнообов'язкове державне соціальне страхування від нещасного випадку на виробництві та професійного захворювання" № 1423 від 13 вересня 2000 р.

.        Кодекс законів про працю України № 322-VIII.

.        Лист Мінпраці "Про розрахунок норми тривалості робочого часу на 2011 рік" від 25.08.2010 р. N 9111/0/14-10/13.

.        Закон України "Про оподаткування прибутку підприємств" № 334/94-вр.

.        Національна комісія регулювання електроенергетики (НКРЕ) України Постанова "Щодо затвердження на квітень 2011 року роздрібних тарифів на електроенергію з урахуванням граничних рівнів тарифів при поступовому переході до формування єдиних роздрібних тарифів для споживачів на території України" № 389 від 24 березня 2011.

.        "Основи законодавства України про загальнообов'язкове державне соціальне страхування" № 16/98-вр.

.        Закон України "Про збір на обов'язкове державне пенсійне страхування" № 400/97-вр.

.        Закон України "Про загальнообов'язкове державне соціальне страхування на випадок безробіття" № 1533-14.

.        Закон України "Про розмір внесків на деякі види загальнообов'язкового державного соціального страхування" № 2213-14 (із змінами на поточну дату).

.        Постанова Кабінету Міністрів України "Про затвердження порядку визначення страхових тарифів для підприємств, установ та організацій на загальнообов'язкове державне соціальне страхування від нещасного випадку на виробництві та професійного захворювання" № 1423 від 13.09.2000р.

Додаток А. Єдина тарифна сітка розрядів і коефіцієнтів по оплаті праці робітників

Тарифні розряди

Тарифні коефіцієнти

1

1,00

2

1,09

3

1,18

4

1,27

5

1,36

6

1,45

7

1,54

8

1,64

9

1,73

10

1,82

11

1,97

12

2,12

13

2,27

14

2,42

15

2,58

16

2,79

17

3,00

18

3,21

19

3,42

20

3,64

21

3,85

22

4,06

23

4,27

24

4,36

25

4,51


Додаток Б. Значення коефіцієнта кваліфікації розробника ПЗ

Стаж роботи розробника

Коефіцієнт кваліфікації розробника ()

до 2-х років

0,8

від 2-х до 3-х лет

1,0

від 3-х до 5 лет

1,1…1,2

від 5 до 7 лет

1,2…1,3

більше 7 лет

1,3…1,5


Додаток В. Значення коефіцієнта, що враховує новизну програми

Програмні продукти за новизною відносяться до 4 груп:

група А - рішення нових задач;

група Б - розробка оригінальних програм;

група В - розробка програм з використанням типових рішень;

група Г - реалізація разової типової задачі.

За ступенем важкості програмні продукти можуть бути віднесені до одної з 3 груп:

- алгоритми оптимізації та моделювання систем;

- задачі обліку, статистики;

- стандартні алгоритми.

Значення коефіцієнту вибирається з представленої нижче таблиці:


Додаток Г. Розрахунок сумарної потужності устаткування


Додаток Д. Схема принципова, система опитування кутових енкодерів


Додаток Е. Плата друкована, модуль системи опитування датчиків


Додаток Є. Схема принципова, схема узгодження рівні RS-232 і USART


Додаток Ж. Плата друкована, схеми узгодження рівнів RS-232 і USART


Додаток З. Программа прошивка

#include <avr/io.h> #include <util/delay.h>  #include "pin_macros.h" #include "scmRTOS/Common/scmRTOS.h"   #include "uart.h" #include "as5040.h"  #define EncoderCount 5  //--------------------------------------------------------------------------- // //      Process types //  typedef OS::process<OS::pr0, 100> TProc1; typedef OS::process<OS::pr1, 100> TProc2; //--------------------------------------------------------------------------- // //      Process objects // TProc1 Proc1; TProc2 Proc2; //--------------------------------------------------------------------------- UART::CUart MyUart; as5040 Encoder;  Data d[EncoderCount];  //значения датчиков  struct TData {  char a; }; OS::channel<TData,5> RXChannel; //--------------------------------------------------------------------------- int main() {  MyUart.init();   Encoder.init();   Encoder.readPosition(EncoderCount,d); //сброс буферов датчиков  _delay_ms(50);   // Start System Timer  TCCR0 = (1 << CS02)|(0 << CS01) | (0 << CS00); // clk/256  TIMSK |= (1 << TOIE0);   //Запускаем ОС  OS::Run();   return 0; }  //--------------------------------------------------------------------------- namespace OS {  char STATUS; TMutex MutexData;  template<> OS_PROCESS void TProc1::Exec() {   char Err[]="00000000";  TData data;  STATUS=1;  for(;;)  {   Sleep(200);    if(data.a=='s') //start   {    STATUS=1;   }    if(STATUS==2)    {     MutexData.Lock();      MyUart.sendMass("previos0: ",10);     itoa(d[0].data,Err,10);     MyUart.sendMass(Err,4);     MyUart.sendByte(0x0D);     MyUart.sendByte(0x0A);      MyUart.sendMass("previos1: ",10);     itoa(d[1].data,Err,10);     MyUart.sendMass(Err,4);     MyUart.sendByte(0x0D);     MyUart.sendByte(0x0A);      MyUart.sendMass("previos2: ",10);     itoa(d[2].data,Err,10);     MyUart.sendMass(Err,4);     MyUart.sendByte(0x0D);     MyUart.sendByte(0x0A);      MyUart.sendMass("previos3: ",10);     itoa(d[3].data,Err,10);     MyUart.sendMass(Err,4);     MyUart.sendByte(0x0D);     MyUart.sendByte(0x0A);      MyUart.sendMass("previos4: ",10);     itoa(d[4].data,Err,10);     MyUart.sendMass(Err,4);     MyUart.sendByte(0x0D);     MyUart.sendByte(0x0A);      MyUart.sendMass("==========",10);     MyUart.sendByte(0x0D);     MyUart.sendByte(0x0A);     MutexData.Unlock();     }else if (STATUS==3)    {     MyUart.sendMass("=====Error=====",15);     MyUart.sendByte(0x0D);     MyUart.sendByte(0x0A);    }   } } // TProc1::Exec()   //процес опрашивает датчики template<> OS_PROCESS void TProc2::Exec() {  //STATUS==1 - старт  //STATUS==2 - постоянный опрос датчиков  //STATUS==3 - ошибка  //STATUS==4 - простой   char Err[]="00000000";   for(;;)  {   //Ожидание события начала измерений   if(STATUS==1)    //Начало измерений   {    TCritSect cr;  //критическая секция.     Encoder.readPosition(EncoderCount,d); //получение первоначальных данных    //инициализация    for(char i=0;i<EncoderCount;i++)    {     d[i].zero=d[i].data;  //засекаем точку нуля     d[i].res=0;          //Сбрасываем результаты измерений     d[i].previos=0;       //предыдущее значение     //MyUart.sendByte('1');    }     STATUS=2;   //начало обработки данных     cr.~TCritSect(); //конец критической секции   }   else if(STATUS==2)   {    char err=0;     TCritSect cr;    Encoder.readPosition(EncoderCount,d);     //чтение данных     cr.~TCritSect();     //обработка данных     MutexData.Lock();    err=Encoder.correctData(EncoderCount,d);     MutexData.Unlock();    }    //Sleep(500);  } } // TProc2::Exec()  }  //----------------------- OS_INTERRUPT void USART_RXC_vect() {  OS::TISRW_SS ISRW;   TData data;  data.a=UDR;   RXChannel.push(data); }   //------ end of file  main.cpp -------------------------------------------


Додаток I. Програма верхнього рівня

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;  using ZedGraph;  using System.IO.Ports; using System.IO; using System.Threading;   namespace Bokaev {     public partial class Form1 : Form     {         //создаем графики         GraphPane pane0, pane1, pane2, pane3, pane4;         //проверочные графики         GraphPane paneControl0, paneControl1, paneControl2, paneControl3, paneControl4;          // создаем списки точек         PointPairList list0 = new PointPairList();         PointPairList list1 = new PointPairList();         PointPairList list2 = new PointPairList();         PointPairList list3 = new PointPairList();         PointPairList list4 = new PointPairList();          //списки проверочных точек         PointPairList listControl0 = new PointPairList();         PointPairList listControl1 = new PointPairList();         PointPairList listControl2 = new PointPairList();         PointPairList listControl3 = new PointPairList();         PointPairList listControl4 = new PointPairList();          //координата Х (время)         double x = 0;          //CSV Writer  (Excel)         private StreamWriter m_CSVWriter;         private StreamWriter m_CSVWriter1;         private StreamWriter m_CSVWriter2;         private StreamWriter m_CSVWriter3;         private StreamWriter m_CSVWriter4;          private StreamWriter global_CSVWriter;           //Для определения времени измерения         DateTime data1, data2;          public Form1()         {             InitializeComponent();              //csv добавляем пункт меню             zedGraph.ContextMenuBuilder += new ZedGraphControl.ContextMenuBuilderEventHandler(MyContextMenuBuilder);             zedGraph1.ContextMenuBuilder += new ZedGraphControl.ContextMenuBuilderEventHandler(MyContextMenuBuilder1);             zedGraph2.ContextMenuBuilder += new ZedGraphControl.ContextMenuBuilderEventHandler(MyContextMenuBuilder2);             zedGraph3.ContextMenuBuilder += new ZedGraphControl.ContextMenuBuilderEventHandler(MyContextMenuBuilder3);             zedGraph4.ContextMenuBuilder += new ZedGraphControl.ContextMenuBuilderEventHandler(MyContextMenuBuilder4);          }          //==============================0         //добавлеение меню(Excel)         private void MyContextMenuBuilder(ZedGraphControl control,ContextMenuStrip menuStrip,                                           Point mousePt, ZedGraphControl.ContextMenuObjectState objState)         {             // зодать новую запись меню             ToolStripMenuItem _item = new ToolStripMenuItem();             //Для обращения к меню             _item.Name = "Export Data as CSV";             _item.Tag = "export_data_csv";             //Отображение меню              _item.Text = "Export Data as CSV";             // Получить хендел на функцию меню             _item.Click += new System.EventHandler(ShowSaveAsForExportCSV);             // Вставить пункт по указанному месту              menuStrip.Items.Insert(2, _item);         }          //функция меню         private void ShowSaveAsForExportCSV(object sender, System.EventArgs e)         {             try             {                 //Отображение диалога для сохранения                 saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";                 saveFileDialog1.ShowDialog();                 //получить имя файла                 m_CSVWriter = new StreamWriter(saveFileDialog1.FileName);                 WriteCSVToStream();  //запись                  m_CSVWriter.Close(); //закрыть                 MessageBox.Show("CSV File Saved", " ZedGraph ", MessageBoxButtons.OK);             }             catch (Exception ex)             {                 MessageBox.Show("Выбранный файл недоступен для записи", "Ошибка", MessageBoxButtons.OK);             }         }          //запись в файл         private void WriteCSVToStream()         {             //записать информацию о измерениях             //название графика             m_CSVWriter.Write("Name graph: ;" + zedGraph.GraphPane.Title.Text + "\n");             //время начала             m_CSVWriter.Write("Date start: ;" + data1.ToString() +"\n" );             //время конца             m_CSVWriter.Write("Date end: ;" + DateTime.Now.ToString()+"\n");             //продолжительность             m_CSVWriter.Write("Time: ;" + (DateTime.Now-data1).ToString() + "\n");             //количество записей             m_CSVWriter.Write("Count: ;" + list0.Count.ToString() + "\n");             //цена деления             m_CSVWriter.Write("Frequency (ms): ;" + txtFren.Text+ "\n");              //Записываем заголовки осей Х и У              string _xAxisHeader = CheckCSVString(zedGraph.GraphPane.XAxis.Title.Text);             string _yAxisHeader = CheckCSVString(zedGraph.GraphPane.YAxis.Title.Text);             m_CSVWriter.Write(_xAxisHeader + ";" + _yAxisHeader + "\n");              //записываем точки из списка             for (int i = 0; i < list0.Count; i++)             {                 m_CSVWriter.Write(list0[i].X.ToString() + ";" + list0[i].Y.ToString() + "\n");             }         }         //============ End 0          //==============================1         //добавлеение меню(Excel)         private void MyContextMenuBuilder1(ZedGraphControl control, ContextMenuStrip menuStrip,                                           Point mousePt, ZedGraphControl.ContextMenuObjectState objState)         {             // зодать новую запись меню             ToolStripMenuItem _item = new ToolStripMenuItem();             //Для обращения к меню             _item.Name = "Export Data as CSV";             _item.Tag = "export_data_csv";             //Отображение меню              _item.Text = "Export Data as CSV";             // Получить хендел на функцию меню             _item.Click += new System.EventHandler(ShowSaveAsForExportCSV1);             // Вставить пункт по указанному месту              menuStrip.Items.Insert(2, _item);         }          //функция меню         private void ShowSaveAsForExportCSV1(object sender, System.EventArgs e)         {             try             {                 //Отображение диалога для сохранения                 saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";                 saveFileDialog1.ShowDialog();                 //получить имя файла                 m_CSVWriter1 = new StreamWriter(saveFileDialog1.FileName);                 WriteCSVToStream1();  //запись                  m_CSVWriter1.Close(); //закрыть                 MessageBox.Show("CSV File Saved", " ZedGraph ", MessageBoxButtons.OK);             }             catch (Exception ex)             {                 MessageBox.Show("Выбранный файл недоступен для записи", "Ошибка", MessageBoxButtons.OK);             }         }          //запись в файл         private void WriteCSVToStream1()         {             //записать информацию о измерениях             //название графика             m_CSVWriter1.Write("Name graph: ;" + zedGraph1.GraphPane.Title.Text + "\n");             //время начала             m_CSVWriter1.Write("Date start: ;" + data1.ToString() + "\n");             //время конца             m_CSVWriter1.Write("Date end: ;" + DateTime.Now.ToString() + "\n");             //продолжительность             m_CSVWriter1.Write("Time: ;" + (DateTime.Now - data1).ToString() + "\n");             //количество записей             m_CSVWriter1.Write("Count: ;" + list1.Count.ToString() + "\n");             //цена деления             m_CSVWriter1.Write("Frequency (ms): ;" + txtFren.Text + "\n");              //Записываем заголовки осей Х и У              string _xAxisHeader = CheckCSVString(zedGraph1.GraphPane.XAxis.Title.Text);             string _yAxisHeader = CheckCSVString(zedGraph1.GraphPane.YAxis.Title.Text);             m_CSVWriter1.Write(_xAxisHeader + ";" + _yAxisHeader + "\n");              //записываем точки из списка             for (int i = 0; i < list1.Count; i++)             {                 m_CSVWriter1.Write(list1[i].X.ToString() + ";" + list1[i].Y.ToString() + "\n");             }         }         //============ End 1          //==============================2         //добавлеение меню(Excel)         private void MyContextMenuBuilder2(ZedGraphControl control, ContextMenuStrip menuStrip,                                           Point mousePt, ZedGraphControl.ContextMenuObjectState objState)         {             // зодать новую запись меню             ToolStripMenuItem _item = new ToolStripMenuItem();             //Для обращения к меню             _item.Name = "Export Data as CSV";             _item.Tag = "export_data_csv";             //Отображение меню              _item.Text = "Export Data as CSV";             // Получить хендел на функцию меню             _item.Click += new System.EventHandler(ShowSaveAsForExportCSV2);             // Вставить пункт по указанному месту              menuStrip.Items.Insert(2, _item);         }            //функция меню         private void ShowSaveAsForExportCSV2(object sender, System.EventArgs e)         {             try             {                 //Отображение диалога для сохранения                 saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";                 saveFileDialog1.ShowDialog();                 //получить имя файла                 m_CSVWriter2 = new StreamWriter(saveFileDialog1.FileName);                 WriteCSVToStream2();  //запись                  m_CSVWriter2.Close(); //закрыть                 MessageBox.Show("CSV File Saved", " ZedGraph ", MessageBoxButtons.OK);             }             catch (Exception ex)             {                 MessageBox.Show("Выбранный файл недоступен для записи", "Ошибка", MessageBoxButtons.OK);             }         }          //запись в файл         private void WriteCSVToStream2()         {             //записать информацию о измерениях             //название графика             m_CSVWriter2.Write("Name graph: ;" + zedGraph2.GraphPane.Title.Text + "\n");             //время начала             m_CSVWriter2.Write("Date start: ;" + data1.ToString() + "\n");             //время конца             m_CSVWriter2.Write("Date end: ;" + DateTime.Now.ToString() + "\n");             //продолжительность             m_CSVWriter2.Write("Time: ;" + (DateTime.Now - data1).ToString() + "\n");             //количество записей             m_CSVWriter2.Write("Count: ;" + list2.Count.ToString() + "\n");             //цена деления             m_CSVWriter2.Write("Frequency (ms): ;" + txtFren.Text + "\n");              //Записываем заголовки осей Х и У              string _xAxisHeader = CheckCSVString(zedGraph2.GraphPane.XAxis.Title.Text);             string _yAxisHeader = CheckCSVString(zedGraph2.GraphPane.YAxis.Title.Text);             m_CSVWriter2.Write(_xAxisHeader + ";" + _yAxisHeader + "\n");              //записываем точки из списка             for (int i = 0; i < list2.Count; i++)             {                 m_CSVWriter2.Write(list2[i].X.ToString() + ";" + list2[i].Y.ToString() + "\n");             }         }         //============ End 2          //==============================3         //добавлеение меню(Excel)         private void MyContextMenuBuilder3(ZedGraphControl control, ContextMenuStrip menuStrip,                                           Point mousePt, ZedGraphControl.ContextMenuObjectState objState)         {             // зодать новую запись меню             ToolStripMenuItem _item = new ToolStripMenuItem();             //Для обращения к меню             _item.Name = "Export Data as CSV";             _item.Tag = "export_data_csv";             //Отображение меню              _item.Text = "Export Data as CSV";             // Получить хендел на функцию меню             _item.Click += new System.EventHandler(ShowSaveAsForExportCSV3);             // Вставить пункт по указанному месту              menuStrip.Items.Insert(2, _item);         }          //функция меню         private void ShowSaveAsForExportCSV3(object sender, System.EventArgs e)         {             try             {                 //Отображение диалога для сохранения                 saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";                 saveFileDialog1.ShowDialog();                 //получить имя файла                  m_CSVWriter3 = new StreamWriter(saveFileDialog1.FileName);                 WriteCSVToStream3();  //запись                  m_CSVWriter3.Close(); //закрыть                 MessageBox.Show("CSV File Saved", " ZedGraph ", MessageBoxButtons.OK);             }             catch (Exception ex)             {                 MessageBox.Show("Выбранный файл недоступен для записи", "Ошибка", MessageBoxButtons.OK);             }         }          //запись в файл         private void WriteCSVToStream3()         {             //записать информацию о измерениях             //название графика             m_CSVWriter3.Write("Name graph: ;" + zedGraph3.GraphPane.Title.Text + "\n");             //время начала             m_CSVWriter3.Write("Date start: ;" + data1.ToString() + "\n");             //время конца             m_CSVWriter3.Write("Date end: ;" + DateTime.Now.ToString() + "\n");             //продолжительность             m_CSVWriter3.Write("Time: ;" + (DateTime.Now - data1).ToString() + "\n");             //количество записей             m_CSVWriter3.Write("Count: ;" + list3.Count.ToString() + "\n");             //цена деления             m_CSVWriter3.Write("Frequency (ms): ;" + txtFren.Text + "\n");              //Записываем заголовки осей Х и У              string _xAxisHeader = CheckCSVString(zedGraph3.GraphPane.XAxis.Title.Text);             string _yAxisHeader = CheckCSVString(zedGraph3.GraphPane.YAxis.Title.Text);             m_CSVWriter3.Write(_xAxisHeader + ";" + _yAxisHeader + "\n");              //записываем точки из списка             for (int i = 0; i < list3.Count; i++)             {                 m_CSVWriter3.Write(list3[i].X.ToString() + ";" + list3[i].Y.ToString() + "\n");             }         }         //============ End 3          //==============================4         //добавлеение меню(Excel)         private void MyContextMenuBuilder4(ZedGraphControl control, ContextMenuStrip menuStrip,                                           Point mousePt, ZedGraphControl.ContextMenuObjectState objState)         {             // зодать новую запись меню             ToolStripMenuItem _item = new ToolStripMenuItem();             //Для обращения к меню             _item.Name = "Export Data as CSV";             _item.Tag = "export_data_csv";             //Отображение меню              _item.Text = "Export Data as CSV";             // Получить хендел на функцию меню             _item.Click += new System.EventHandler(ShowSaveAsForExportCSV4);             // Вставить пункт по указанному месту              menuStrip.Items.Insert(2, _item);         }          //функция меню         private void ShowSaveAsForExportCSV4(object sender, System.EventArgs e)         {             try             {                 //Отображение диалога для сохранения                 saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";                 saveFileDialog1.ShowDialog();                 //получить имя файла                 m_CSVWriter4 = new StreamWriter(saveFileDialog1.FileName);                 WriteCSVToStream4();  //запись                  m_CSVWriter4.Close(); //закрыть                 MessageBox.Show("CSV File Saved", " ZedGraph ", MessageBoxButtons.OK);             }             catch (Exception ex)             {                 MessageBox.Show("Выбранный файл недоступен для записи", "Ошибка", MessageBoxButtons.OK);             }         }          //запись в файл         private void WriteCSVToStream4()         {             //записать информацию о измерениях             //название графика             m_CSVWriter4.Write("Name graph: ;" + zedGraph4.GraphPane.Title.Text + "\n");             //время начала             m_CSVWriter4.Write("Date start: ;" + data1.ToString() + "\n");             //время конца             m_CSVWriter4.Write("Date end: ;" + DateTime.Now.ToString() + "\n");             //продолжительность             m_CSVWriter4.Write("Time: ;" + (DateTime.Now - data1).ToString() + "\n");             //количество записей             m_CSVWriter4.Write("Count: ;" + list4.Count.ToString() + "\n");             //цена деления             m_CSVWriter4.Write("Frequency (ms): ;" + txtFren.Text + "\n");              //Записываем заголовки осей Х и У              string _xAxisHeader = CheckCSVString(zedGraph4.GraphPane.XAxis.Title.Text);             string _yAxisHeader = CheckCSVString(zedGraph4.GraphPane.YAxis.Title.Text);             m_CSVWriter4.Write(_xAxisHeader + ";" + _yAxisHeader + "\n");              //записываем точки из списка             for (int i = 0; i < list4.Count; i++)             {                 m_CSVWriter4.Write(list4[i].X.ToString() + ";" + list4[i].Y.ToString() + "\n");             }         }         //============ End 4          private string CheckCSVString(string _string)         {//Check to see if there are any characters that can disturb the CSV delimeters.               string _returnString = _string;             if (_string.IndexOfAny("\",\x0A\x0D".ToCharArray()) > -1)             {                 _returnString = "\"" + _string.Replace("\"", "\"\"") + "\"";             }             return _returnString;         }           private void Form1_Load(object sender, EventArgs e)         {             //инициализация графиков             pane0 = zedGraph.GraphPane;             pane1 = zedGraph1.GraphPane;             pane2 = zedGraph2.GraphPane;             pane3 = zedGraph3.GraphPane;             pane4 = zedGraph4.GraphPane;             //инициализация проверочных графиков             paneControl0= zedGraphControl5.GraphPane;             paneControl1 =zedGraphControl4.GraphPane;             paneControl2 =zedGraphControl3.GraphPane;             paneControl3= zedGraphControl2.GraphPane;             paneControl4 =zedGraphControl1.GraphPane;               // Устанавливаем цвет линии и привязываем список точек             Color curveColor = Color.Black;             LineItem myCurve0 = pane0.AddCurve("", list0, curveColor, SymbolType.None);             LineItem myCurve1 = pane1.AddCurve("", list1, curveColor, SymbolType.None);             LineItem myCurve2 = pane2.AddCurve("", list2, curveColor, SymbolType.None);             LineItem myCurve3 = pane3.AddCurve("", list3, curveColor, SymbolType.None);             LineItem myCurve4 = pane4.AddCurve("", list4, curveColor, SymbolType.None);               LineItem myCurveControl0 = paneControl0.AddCurve("", listControl0, curveColor, SymbolType.None);             LineItem myCurveControl1 = paneControl1.AddCurve("", listControl1, curveColor, SymbolType.None);             LineItem myCurveControl2 = paneControl2.AddCurve("", listControl2, curveColor, SymbolType.None);             LineItem myCurveControl3 = paneControl3.AddCurve("", listControl3, curveColor, SymbolType.None);             LineItem myCurveControl4 = paneControl4.AddCurve("", listControl4, curveColor, SymbolType.None);               //Задать оси и названия графиков             pane0.Title.Text = "Graph0";             pane0.XAxis.Title.Text = "X";             pane0.YAxis.Title.Text = "Y";              pane1.Title.Text = "Graph1";             pane1.XAxis.Title.Text = "X";             pane1.YAxis.Title.Text = "Y";              pane2.Title.Text = "Graph2";             pane2.XAxis.Title.Text = "X";             pane2.YAxis.Title.Text = "Y";                           pane3.Title.Text = "Graph3";             pane3.XAxis.Title.Text = "X";             pane3.YAxis.Title.Text = "Y";              pane4.Title.Text = "Graph4";             pane4.XAxis.Title.Text = "X";             pane4.YAxis.Title.Text = "Y";                //Задаем оси для проверочных графиков             paneControl0.Title.Text = "Graph0";             paneControl0.XAxis.Title.Text = "X";             paneControl0.YAxis.Title.Text = "Y";              paneControl1.Title.Text = "Graph1";             paneControl1.XAxis.Title.Text = "X";             paneControl1.YAxis.Title.Text = "Y";              paneControl2.Title.Text = "Graph2";             paneControl2.XAxis.Title.Text = "X";             paneControl2.YAxis.Title.Text = "Y";              paneControl3.Title.Text = "Graph3";             paneControl3.XAxis.Title.Text = "X";             paneControl3.YAxis.Title.Text = "Y";              paneControl4.Title.Text = "Graph4";             paneControl4.XAxis.Title.Text = "X";             paneControl4.YAxis.Title.Text = "Y";            }                  //начать опрос         private void button1_Click(object sender, EventArgs e)         {             //открыть файл для записи (Excel)             try             {                 //получить имя файла                 global_CSVWriter = new StreamWriter(txtSave.Text);                                  //записать шапку                 //записать информацию о измерениях                 //время начала                 global_CSVWriter.Write("Date start: ;" + data1.ToString() + "\n");                 //цена деления                 global_CSVWriter.Write("Frequency (ms): ;" + txtFren.Text + "\n");                  //название графика                 global_CSVWriter.Write("Name graph: ;" + zedGraph.GraphPane.Title.Text +";;;"                                                        + zedGraph1.GraphPane.Title.Text +";;;"                                                        + zedGraph2.GraphPane.Title.Text +";;;"                                                        + zedGraph3.GraphPane.Title.Text +";;;"                                                        + zedGraph4.GraphPane.Title.Text +"\n");                   //Записываем заголовки осей Х и У                  string _xAxisHeader0 = CheckCSVString(zedGraph.GraphPane.XAxis.Title.Text);                 string _yAxisHeader0 = CheckCSVString(zedGraph.GraphPane.YAxis.Title.Text);                  string _xAxisHeader1 = CheckCSVString(zedGraph1.GraphPane.XAxis.Title.Text);                 string _yAxisHeader1 = CheckCSVString(zedGraph1.GraphPane.YAxis.Title.Text);                  string _xAxisHeader2 = CheckCSVString(zedGraph2.GraphPane.XAxis.Title.Text);                 string _yAxisHeader2 = CheckCSVString(zedGraph2.GraphPane.YAxis.Title.Text);                  string _xAxisHeader3 = CheckCSVString(zedGraph3.GraphPane.XAxis.Title.Text);                 string _yAxisHeader3 = CheckCSVString(zedGraph3.GraphPane.YAxis.Title.Text);                  string _xAxisHeader4 = CheckCSVString(zedGraph4.GraphPane.XAxis.Title.Text);                 string _yAxisHeader4 = CheckCSVString(zedGraph4.GraphPane.YAxis.Title.Text);                  global_CSVWriter.Write(  _xAxisHeader0 + ";" + _yAxisHeader0 + ";;"                                         + _xAxisHeader1 + ";" + _yAxisHeader1 + ";;"                                          + _xAxisHeader2 + ";" + _yAxisHeader2 + ";;"                                        + _xAxisHeader3 + ";" + _yAxisHeader3 + ";;"                                        + _xAxisHeader4 + ";" + _yAxisHeader4 + "\n");                  serialPort1.PortName = txtPort.Text;                 serialPort1.BaudRate = 19200;                  serialPort1.Open();                 serialPort1.ReadTimeout = 100;                 serialPort1.Write("s");  //начало измерений                  //очистить графики                 list0.Clear();                 list1.Clear();                 list2.Clear();                 list3.Clear();                 list4.Clear();                 x = 0;                   listControl0.Clear();                 listControl1.Clear();                 listControl2.Clear();                 listControl3.Clear();                 listControl4.Clear();                   //задаем настройки опроса                 switch (txtFren.Text)                 {                     case "1000":                         timer1.Interval = 1000;                         break;                     case "1500":                         timer1.Interval = 1500;                         break;                     case "2000":                         timer1.Interval = 2000;                         break;                     case "2500":                         timer1.Interval = 2500;                         break;                     case "3000":                         timer1.Interval = 3000;                         break;                 }                   //заблокировать кнопки                 button1.Enabled = false;                 btnStart.Enabled = false;                 button2.Enabled = true;                  //Отобразить время начала измерений                 data1 = DateTime.Now;                 lblStart.Text = DateTime.Now.ToString();                  timer1.Enabled = true;                 serialPort1.Write("r");    //команда получить данные                  // Обновим график                 zedGraph.AxisChange();                 zedGraph.Invalidate();                  zedGraph1.AxisChange();                 zedGraph1.Invalidate();                  zedGraph2.AxisChange();                 zedGraph2.Invalidate();                  zedGraph3.AxisChange();                 zedGraph3.Invalidate();                  zedGraph4.AxisChange();                 zedGraph4.Invalidate();                  //проверочные                 zedGraphControl1.AxisChange();                 zedGraphControl1.Invalidate();                  zedGraphControl2.AxisChange();                 zedGraphControl2.Invalidate();                  zedGraphControl3.AxisChange();                 zedGraphControl3.Invalidate();                  zedGraphControl4.AxisChange();                 zedGraphControl4.Invalidate();                  zedGraphControl5.AxisChange();                 zedGraphControl5.Invalidate();              }             catch (Exception ex)             {                 // в случае исключения прекратить процедуру                 global_CSVWriter.Close();                 serialPort1.Close();                                  //MessageBox.Show(ex.ToString());                 MessageBox.Show("COM порт недоступен, или запрещена запись в файл.", " Ошибка ", MessageBoxButtons.OK);             }          }          //таймер опроса датчиков         private void timer1_Tick(object sender, EventArgs e)         {             byte[] Mes = new byte[11];  //массив входных данных             int y0,y1,y2,y3,y4; //буфер для значения датчика              try             {                 serialPort1.Write("r");    //команда получить данные                 Thread.Sleep(1);                 serialPort1.Read(Mes, 0, 11); //получить посылку с данными                  //определяем координату У                 y0 = (Mes[0] << 8);                 y0 |= (Mes[1]);                 y1 = (Mes[2] << 8);                 y1 |= (Mes[3]);                 y2 = (Mes[4] << 8);                 y2 |= (Mes[5]);                 y3 = (Mes[6] << 8);                 y3 |= (Mes[7]);                 y4 = (Mes[8] << 8);                 y4 |= (Mes[9]);                  //расчет силы                 textBox1.Text = (0.05 * y0).ToString();                  // добавим в список точку                 list0.Add(y1, y0);                 list1.Add(y2, y0);                 list2.Add(y3, y0);                 list3.Add(x, y0);                 list4.Add(y4, y0);                   // добавим в список точку                 listControl0.Add(x, y0*(1/1.024));                 listControl1.Add(x, y1*(1 / 1.024));                 listControl2.Add(x, y2*(1 / 1.024));                 listControl3.Add(x, y3*(1 / 1.024));                 listControl4.Add(x, y4*(1 / 1.024));                  //вывести значения                 label10.Text = (y0 * (1 / 1.024)).ToString();                 label11.Text = (y1 * (1 / 1.024)).ToString();                 label12.Text = (y2 * (1 / 1.024)).ToString();                 label13.Text = (y3 * (1 / 1.024)).ToString();                 label14.Text = (y4 * (1 / 1.024)).ToString();                   //сохранить данные в excel файле                 global_CSVWriter.Write(list0[list0.Count - 1].X.ToString() + ";" + list0[list0.Count - 1].Y.ToString() + ";;"                                        + list1[list1.Count - 1].X.ToString() + ";" + list1[list1.Count - 1].Y.ToString() + ";;"                                        + list2[list2.Count - 1].X.ToString() + ";" + list2[list2.Count - 1].Y.ToString() + ";;"                                        + list3[list3.Count - 1].X.ToString() + ";" + list3[list3.Count - 1].Y.ToString() + ";;"                                        + list4[list4.Count - 1].X.ToString() + ";" + list4[list4.Count - 1].Y.ToString() + "\n");                  global_CSVWriter.Flush();                  //время                 x++;                  // Обновим график                 zedGraph.AxisChange();                 zedGraph.Invalidate();                  zedGraph1.AxisChange();                 zedGraph1.Invalidate();                  zedGraph2.AxisChange();                 zedGraph2.Invalidate();                  zedGraph3.AxisChange();                 zedGraph3.Invalidate();                  zedGraph4.AxisChange();                 zedGraph4.Invalidate();                   //проверочные                 zedGraphControl1.AxisChange();                 zedGraphControl1.Invalidate();                  zedGraphControl2.AxisChange();                 zedGraphControl2.Invalidate();                  zedGraphControl3.AxisChange();                 zedGraphControl3.Invalidate();                  zedGraphControl4.AxisChange();                 zedGraphControl4.Invalidate();                  zedGraphControl5.AxisChange();                 zedGraphControl5.Invalidate();              }             catch (Exception ex)             {                 timer1.Enabled = false;                  //заблокировать кнопки                 button1.Enabled = true;                 button2.Enabled = false;                 btnStart.Enabled = true;                  serialPort1.Close();                 global_CSVWriter.Close();                  MessageBox.Show("Произошол сбой.Возможные причины: \n1)Устройство не отвечает на запросы;\n2)Файл стал недоступен для записи.", " Ошибка ", MessageBoxButtons.OK);             }          }          //остановить опрос         private void button2_Click(object sender, EventArgs e)         {              serialPort1.Write("c");  //прекратить измерения                           //задаем настройки опроса             timer1.Enabled = false;              serialPort1.Close();              //отобразить время завершения измерений             data2 = DateTime.Now;             lblEnd.Text = DateTime.Now.ToString();              //продолжительность измерения             lblTime.Text = (data2 - data1).ToString();               global_CSVWriter.Write("\n");             //время конца             global_CSVWriter.Write("Date end: ;" + data2.ToString() + "\n");             //продолжительность             global_CSVWriter.Write("Time: ;" + lblTime.Text + "\n");             //количество записей             global_CSVWriter.Write("Count: ;" + list0.Count.ToString() + "\n");              global_CSVWriter.Close();              //заблокировать кнопки             button1.Enabled = true;             button2.Enabled = false;             btnStart.Enabled = true;         }           //Начало измерений         private void btnStart_Click(object sender, EventArgs e)         {             frmConfig frmCnf = new frmConfig();              frmCnf.ShowDialog();         }           private void btnSave_Click_1(object sender, EventArgs e)         {             //Отображение диалога для сохранения             saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";             saveFileDialog1.ShowDialog();             //получить имя файла             txtNameT.Text = saveFileDialog1.FileName;             button3.Enabled = true;         }          private void tabPage2_Click(object sender, EventArgs e)         {          }          private void button3_Click(object sender, EventArgs e)         {              //открыть файл для записи (Excel)                  StreamWriter CSVWriter;                 //получить имя файла                 CSVWriter = new StreamWriter(txtNameT.Text);                                  //записать шапку                 //записать информацию о измерениях                 //время начала                 CSVWriter.Write("Date start: ;" + data1.ToString() + "\n");                   //время конца                 CSVWriter.Write("Date end: ;" + DateTime.Now.ToString() + "\n");                 //продолжительность                 CSVWriter.Write("Time: ;" + (DateTime.Now - data1).ToString() + "\n");                 //количество записей                 CSVWriter.Write("Count: ;" + listControl0.Count.ToString() + "\n");                  //цена деления                 CSVWriter.Write("Frequency (ms): ;" + txtFren.Text + "\n");                  //название графика                 CSVWriter.Write("Name graph: ;" + zedGraphControl1.GraphPane.Title.Text +";;;"                                                 + zedGraphControl2.GraphPane.Title.Text + ";;;"                                                 + zedGraphControl3.GraphPane.Title.Text + ";;;"                                                 + zedGraphControl4.GraphPane.Title.Text + ";;;"                                                 + zedGraphControl5.GraphPane.Title.Text + "\n");                   //Записываем заголовки осей Х и У                  string _xAxisHeader0 = CheckCSVString(zedGraphControl1.GraphPane.XAxis.Title.Text);                 string _yAxisHeader0 = CheckCSVString(zedGraphControl1.GraphPane.YAxis.Title.Text);                  string _xAxisHeader1 = CheckCSVString(zedGraphControl2.GraphPane.XAxis.Title.Text);                 string _yAxisHeader1 = CheckCSVString(zedGraphControl2.GraphPane.YAxis.Title.Text);                  string _xAxisHeader2 = CheckCSVString(zedGraphControl3.GraphPane.XAxis.Title.Text);                 string _yAxisHeader2 = CheckCSVString(zedGraphControl3.GraphPane.YAxis.Title.Text);                  string _xAxisHeader3 = CheckCSVString(zedGraphControl4.GraphPane.XAxis.Title.Text);                 string _yAxisHeader3 = CheckCSVString(zedGraphControl4.GraphPane.YAxis.Title.Text);                  string _xAxisHeader4 = CheckCSVString(zedGraphControl5.GraphPane.XAxis.Title.Text);                 string _yAxisHeader4 = CheckCSVString(zedGraphControl5.GraphPane.YAxis.Title.Text);                  CSVWriter.Write(  _xAxisHeader0 + ";" + _yAxisHeader0 + ";;"                                  + _xAxisHeader1 + ";" + _yAxisHeader1 + ";;"                                   + _xAxisHeader2 + ";" + _yAxisHeader2 + ";;"                                 + _xAxisHeader3 + ";" + _yAxisHeader3 + ";;"                                 + _xAxisHeader4 + ";" + _yAxisHeader4 + "\n");                 //сохранить данные                  //записываем точки из списка                 for (int i = 0; i < listControl0.Count; i++)                 {                      CSVWriter.Write(listControl0[i].X.ToString() + ";" + listControl0[i].Y.ToString() + ";;"                                   + listControl1[i].X.ToString() + ";" + listControl1[i].Y.ToString() + ";;"                                   + listControl2[i].X.ToString() + ";" + listControl2[i].Y.ToString() + ";;"                                   + listControl3[i].X.ToString() + ";" + listControl3[i].Y.ToString() + ";;"                                   + listControl4[i].X.ToString() + ";" + listControl4[i].Y.ToString() + "\n");                 }                   CSVWriter.Close();         }      } }


Похожие работы на - Програмно-апаратний комплекс управління та обліку інформації

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!