Розробка програми контролю виробів і підготовка програмної документації

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

БАЛТІЙСЬКИЙ ДЕРЖАВНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ "Военмех"
ім. Д.Ф. УСТІНОВА
Звіт
Про проходження переддипломної практики
«Програмна документація»
САНКТ-ПЕТЕРБУРГ, 2009 р

Зміст
  Мета
Технічне завдання
Загальні відомості про підприємство
Загальні відомості про розробленою програмою
Алгоритм програми
Режими роботи програми
Результати тестування
Вхідні параметри
Висновок
Додаток 1 - Вихідні тексти програми


Мета

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

Технічне завдання

Потрібно розробити програму контролю версій компонент виробів і підготувати до випуску програмну документацію.
Програмна документація повинна бути виконана відповідно до ГОСТ 19.105-78 (ЕСПД. Загальні вимоги до програмних документів).
Комплект програмного забезпечення повинен містити опис програми, текст програми і виконуваний модуль.
Програма призначена для автоматизованої перевірки версій всіх компонентів вироби (модуля або приладу). Програма повинна забезпечувати контроль версії, як окремих модулів, так і приладів в різній комплектації.
Програма повинна запускатися з допомогою програми MonU «Монітор для здачі робіт» 643.0691.00249-01. Виведення інформації повинен здійснюватися у вікно монітора по каналу обміну. Програма взаємодіє з приладом через інтерфейс RS-232. Програма може містити частину, що виконується на приладі, а може взаємодіяти зі "Службовим програмою для модуля М207" 643.0691.00255-01. Еталонні значення версій компонентів виробів повинні зберігатися в текстовому файлі у вигляді, зручному для читання і редагування в текстовому редакторі.
Загальний алгоритм роботи програми:
1. Програма запускається за допомогою скрипта програми MonU. Виріб, версії компонентів якого потрібно перевірити, визначається параметрами командного рядка.
2. Програма отримує доступ до COM порту (або до іншого інтерфейсу зв'язку з виробом).
3. Підключається до MonU використовуючи канал обміну.
4. Відкриває файл, що містить еталонні версії компонентів виробів.
5. Читає версії з виробу і порівнює з еталонними. У разі розходження, версії виводяться за допомогою програми MonU. У випадку, якщо версії всіх компонентів вироби збіглися, програма виводить "Контроль версій зроблений. Результат: НОРМА". У разі, якщо мали місце розбіжності: "Контроль версій зроблений. Результат: ненорми".
6. Програма повинна повертати код результату. 0 - НОРМА, -1 - ненорми.
Вхідні параметри, приклад:
ver_verify.exe M207
ver_verify.exe ПОТІК-3VSB X7
ver_verify.exe БЦВМб134
ver_verify.exe БС12

Загальні відомості про підприємство

Акціонерне товариство «ГРАНІТ-ВТ» було утворено в 1992 році на базі колективу співробітників науково-дослідного відділу ЦНДІ «ГРАНІТ».
Основним видом діяльності підприємства були і залишаються розробка, виробництво і підтримка експлуатації обчислювальних і периферійних електронних модулів і систем на їх основі. Основною сферою застосування розроблюваної апаратури є системи, що експлуатуються в важких умовах, таких як широкий діапазон робочих температур, підвищена вологість навколишнього середовища, інші несприятливі кліматичні чинники, а також підвищені рівні механічних впливів.
Вдалим прикладом роботи компанії може служити розробка в 1993-94рр. за сприяння співробітників російського представництва компанії Intel ® обчислювального модуля КРЕДО-486, використовуваного в даний момент у низці залізничних і авіаційних систем.
Окремим етапом діяльності стала організація в 1994 р . спільно з АТ «Гамма» (нині ТОВ «Гамма Плюс») та за сприяння представництва Intel ® регіонального центру підтримки розробок на основі елементів програмованої логіки. У рамках цієї діяльності більше 40 підприємств (в основному - північно-західного регіону Росії) були забезпечені початковою версією САПР для розробки схем на основі програмованої логіки, комплектом перекладної літератури, можливістю програмування базових PLD-схем, технічними консультаціями. З багатьма учасниками роботи регіонального центру ЗАТ «ГРАНІТ-ВТ» підтримує технічні контакти та комерційну кооперацію і до цього дня.
В активі підприємства:
- Розробка, виробництво і підтримка в експлуатацію ряду сумісних комплектів електронних модулів на основі магістралей ISA, VME і CompactPCI;
- Розробка локомотивної інформаційно-керуючої системи підвищення безпеки руху для модернізації локомотивів Жовтневої залізниці;
- Участь у розробці комплексної безплатформного навігаційної системи для модернізації авіоніки літаків цивільної авіації;
- Розробка поїзної інформаційно-керуючої системи з функцією забезпечення автоведения для високошвидкісної магістралі Москва-Санкт-Петербург.
ЗАТ «ГРАНІТ-ВТ» пропонує споживачу ряд обчислювальних модулів загального призначення, модулів розширення пам'яті, інтерфейсних і сістемозавісімих модулів. Особливо рекомендуються модулі розширення розробки ФГУП ЦНДІ «Граніт» та джерела вторинного живлення виробництва ТОВ «Авіоніка-Віст».
Крім представленої серійно випускається, підприємство раде запропонувати послуги в області проектування і виробництва як електронних систем управління будь-якого ступеня складності, так і будь-яких їх складових частин - приладів, модулів, критичного програмного забезпечення, контрольно-перевірочної апаратури.
Можна замовити розробку спеціалізованих модулів «під ключ» або будь-яку складову частину такої розробки:
- Розробку схемотехнічних рішень;
- Проектування логічних функцій у заданому базисі (програмовані логічні мікросхеми);
- Розробку топології друкованих плат будь-якого ступеня складності з організацією при необхідності їх виробництва;
- Автоматичний і ручний монтаж і ремонт електронних модулів практично без обмежень по типу корпусів;
- Нанесення поліпараксіліленового вологозахисного покриття на вироби замовника;
- Розробку тестового та функціонального програмного забезпечення;
- Розробку спеціалізованого стендового обладнання.
За довгі роки розробки спеціальної керуючої техніки колектив ЗАТ «ГРАНІТ-ВТ» придбав глибокий досвід створення обчислювальних модулів, приладів і систем, призначених для управління рухомими об'єктами в реальному часі у важких експлуатаційних умовах (кліматичні та механічні дії). Основна пропонована ЗАТ «ГРАНІТ-ВТ» продукція, в першу чергу, флагманська лінія обчислювальних і периферійних модулів, призначена саме для цього сегменту ринку. Сфера застосування диктує основні технічні принципи, яких, на наш погляд, слід дотримуватися при розробці високонадійної апаратури для відповідальних застосувань і які є основою технічної політики ЗАТ «ГРАНІТ-ВТ»:
- Орієнтація на промислові стандарти в частині загальної обчислювальної архітектури, внутрішніх і зовнішніх інтерфейсів, конструкторських рішень, загального програмного забезпечення, стендового обладнання, технологічних процесів;
- Відкритість технічних рішень, що має на увазі можливість, при необхідності, надання споживачеві всієї технічної інформації (схемотехнічна і конструкторська документація, вихідні тексти вбудованого, інструментального та тестового програмного забезпечення власної розробки). Відкритість документації дозволяє користувачеві провести сертифікацію кінцевої продукції;
- Використання елементної бази, що задовольняє умовам експлуатації кінцевої апаратури. Як правило, це компоненти в індустріальному виконанні, в розширеному температурному виконанні, в окремих обгрунтованих випадках - компоненти, виконані за військовим нормам;
- Довгострокова підтримка відтворення (можливість випуску ідентичною апаратури протягом тривалого терміну експлуатації систем). Грунтується на переважному використанні компонентів, що мають довгострокової підтримкою виробника (long-life support) або є де-факто промисловим стандартом і випускаються декількома виробниками;
- Мінімізація енергоспоживання за рахунок використання переважно мікропотужні компонентів, поступового переходу на знижені рівні напруги електроживлення, внутрімодульного формування нестандартних номіналів напруг електроживлення.
- Забезпечення гарантованого теплос'ема шляхом використання теплопровідних прокладок, суцільних потовщених металізованих шарів у багатошарових друкованих платах, кондуктивного відведення тепла на несучі конструкції через металеві теплостокі та клинові замки;
- Використання вологозахисного покриття на основі поліпараксілілена, що забезпечує відсутність "повітряних подушок" під SMD-компонентами і, як наслідок, відсутність відкритого конденсату на поверхні друкованої плати і компонентах при термоциклировании;
- Використання технічних рішень, які гарантують необхідну стійкість до механічних впливів, - використання переважно легких компонентів в корпусах для поверхневого монтажу, закріплення компонентів при необхідності, відсутність механічно нестійких елементів (панелей під мікросхеми, з'єднувачів-джамперів, кнопок, механічних контакторів і пр.);
- Використання ремонтопрігодним технологій, забезпечення довгострокового гарантійного та післягарантійного обслуговування;
- Диференційований підхід до вбудованого системному і функціональному програмного забезпечення: можливість розробки спеціалізованих програмних комплексів для відповідальних критичних за часом застосувань у керуючих системах реального часу, що забезпечують рестартуемость (відновлення перерваного ходу обчислювального процесу) обчислювального процесу при короткочасних відмовах електроживлення і функціональних збої зі збереженням інтегральних величин ; можливість розробки мінімального програмного обрамлення для забезпечення програмування функціональних завдань мовою високого рівня; сумісність з універсальними ОС реального часу типу VxWorks ™, QNX ™, ОС2000 та ін, підтверджена дослідними роботами.

Загальні відомості про розробленою програмою

Найменування програми - "Програма перевірки версій виробів".
Позначення виконуваного файлу програми - Version-verifier.exe.
Програма написана на мові C + + - CBuilder версії 10.0 фірми Borland Software Corporation для ОС Windows.

Програма проводить перевірку версій окремого модуля або версій модулів входять до складу приладу за бажанням користувача.
Програма розташовується і виконується на стендовій ЕОМ.
База еталонів версій створюється і зберігається у файлах "device_list.xml" і "module_list.xml".
Виклик програми здійснюється запуском виконуваного модуля програми засобами операційної системи, або з командного рядка з параметрами командного рядка.
У програми є один параметр командного рядка - назва виробу.
Приклад:
C: \ Version-verifier.exe BS12
Або
C: \ Version-verifier.exe M207
Через параметр командного рядка в програму вводиться найменування виробу, що підлягає перевірці. Так само найменування вироби можна передати через скрипт "Сервісної програми монітор для здачі робіт" 643.0691.00249-01. Детальніше про скриптах "Сервісної програми монітор для здачі робіт" можна прочитати в керівництві програміста 643.0691.00249-01 33 01.
Інформацію про модулях програма отримує з XML-файлів "device_list.xml" і "module_list.xml".
Поправки в роботу програми можна внести за допомогою файлу "corrections.txt".
Програма може бути запущена через "Сервісну програму монітор для здачі робіт" 643.0691.00249-01. У цьому випадку результати роботи програми будуть виводитися у вікні "Сервісної програми монітор для здачі робіт". Про запуск додатків через "Сервісну програму монітор для здачі робіт" можна прочитати в керівництві програміста 643.0691.00249-01 33 01.

Алгоритм програми

Параметром командного рядка в програму передається найменування виробу, яке необхідно перевірити.
Проводиться пошук найменування виробів у файлі "device_list.xml". Спочатку проводиться пошук серед тегів "device" (список приладів), якщо виріб не виявлено, то пошук продовжується в тезі "default" серед тегів "module" (список модулів).
Якщо виріб знайдено, то програма отримує тип вироби (прилад або модуль). Якщо виріб не знайдено, то виводиться повідомлення про помилку.
Якщо з вхідними параметрами було отримано найменування модуля, то програма зчитує з файлу "device_list.xml" базовий адресу модуля за замовчуванням.
Потім з файлу "module_list.xml" зчитуються адреси регістрів версій, значення версій і розрядність версій відповідного модуля.
Потім програма зчитує фактичні значення версій модуля і порівнює їх зі значеннями, ліченими з файлу "module_list.xml". При збігу цих значень програма видає норму, при розбіжності - ненорму.
Якщо з вхідними параметрами було отримано найменування приладу, то програма зчитує з файлу "device_list.xml" базові адреси всіх модулів, що входять до складу приладу.
Потім з файлу "module_list.xml" зчитуються адреси регістрів версій, значення версій і розрядність версій для кожного модуля, що входить до складу приладу.
Потім програма зчитує фактичні значення версій модулів, що входять до складу приладу, і порівнює їх зі значеннями, ліченими з файлу "module_list.xml". При збігу цих значень для кожного модуля програма видає норму, при розбіжності хоча б для одного модуля - ненорму.

Режими роботи програми

Якщо програма була запущена "Сервісної програмою монітор для здачі робіт" 643.0691.00249-01, то вона буде згорнута, і вся інформація буде виводитися у вікні "Сервісної програми монітор для здачі робіт". Після перевірки, програма буде завершена самостійно.
Якщо програма була запущена з командного рядка незалежно від "Сервісної програми монітор для здачі робіт", то вся інформація буде виводитися в текстовому полі вікна програми. Після перевірки, програма залишиться відкритою.

Результати тестування

При перевірці версій приладу фіксується, результат перевірки для кожного модуля, що входить до складу приладу. Якщо перевірка всіх модулів завершилася з результатом НОРМА, загальний результат - НОРМА. Якщо перевірка хоча б одного модуля завершилася з результатом ненорми, то загальний результат - ненорми.
При перевірці версій окремого модуля, результат НОРМА - якщо перевірка завершилася успішно, і ненорми - якщо перевірка завершилася невдало.

Вхідні параметри

Структура XML-файлу "device_list.xml"

Файл "device_list.xml" складається з тегів "device" і тега "default".
Тег "device" має атрибут "name", в якому міститься назва приладу, відповідного цьому тегу. Всередині тегів "device" містяться теги "module", які мають атрибут "baseaddress", що містить базову адресу модуля в приладі. Усередині тега "module" вказується назва модуля.
Тег "default" містить у собі теги "module". Тег "module" має один атрибут "baseaddress", в якому міститься базовий адресу модуля за замовчуванням. Усередині тега "module" вказується назва модуля.

Структура XML-файлу "module_list.xml"

Файл "module_list.xml" складається з тегів "module".
Тег "module" містить у собі тег "name" і теги "version". Тег "name" містить в собі назву модуля. Тег "version" має один атрибут "description", в якому міститься інформація про версію, описуваної відповідним тегом "version". Тег "version" містить у собі теги "address" (адреса регістра версії модуля), "value" (значення версії модуля) і "type" (розрядність версії модуля).
При випуску нової версії модуля, тег "name" у відповідному теге "module" доповнюється датою випуску наступної версії. Потім створюється новий тег "module" з найменуванням модуля і оновленими значеннями версій в тезі "version".

Структура TXT-файлу "corrections.txt"

Якщо є необхідність перевірити прилад з більш ранніми версіями яких-небудь модулів, що входять до його складу, складається файл поправок "corrections.txt". Структура файла "corrections.txt" за п. REF _Ref202681050 \ n \ h \ * MERGEFORMAT 0 .
Якщо в папці з програмою міститься файл "corrections.txt", то програма робить обробку цього файлу.
У процесі обробки заповнюється масив поправок, що містять два найменування модулів: з ранніми версіями і з більш ранньою версією.
Файл "corrections.txt" призначений для внесення поправок в роботу програми.
Файл складається із записів види:
<name> = <new_name>;
Тут "name" - найменування модуля, який потрібно перевірити з особливими значеннями версій; "new_name" - найменування модуля у файлі "module_list.txt" з особливими значеннями версій.

Висновок

У ході переддипломної практики (у період з 15 грудня 2008 по 15 лютого 2009 р .) Мною були виконані поставлені попередньо завдання:
- Отримані практичні навички роботи в колективі інженерів,
- Розроблено програму перевірки версій компонент виробів,
- Підготовлена ​​до випуску програмна документація.

Додаток 1 - Вихідні тексти програми

//------------------------------------------------ --------------
# Ifndef Unit2H
# Define Unit2H
//------------------------------------------------ --------------# include <Classes.hpp>
//------------------------------------------------ -------------- class Executing: public TThread
{
private:
protected:
void __fastcall Execute ();
public:
bool end;
__fastcall Executing (bool CreateSuspended);
};
//------------------------------------------------ --------------# endif
//------------------------------------------------ --------------
# Include <vcl.h>
# Pragma hdrstop
# Include "Unit1.h"
# Include "Unit2.h"
# Include <stdio.h>
# Include "ProgExchCl_b.h"
# Include "Udevices.h"
# Define SecondLevelNodeAccess Form1-> XMLDocument1-> DocumentElement-> ChildNodes
# Define ThirdLevelNodeAccess (a) Form1-> XMLDocument1-> DocumentElement-> ChildNodes-> GetNode (a) -> ChildNodes

# Define FourthLevelNodeAccess (a, b) Form1-> XMLDocument1-> DocumentElement-> ChildNodes-> GetNode (a) -> ChildNodes-> GetNode (b) -> ChildNodes
char received_data [255];
PModule Module; / / масив модулів
PCorrection Correction; / / масив виправлень
HANDLE m_Disp = NULL; / / для монітора
int wrtd, / / ​​для функції mWrite
cor_count; / / кількість виправлень
TCom * ComPort; / / порт
//------------------------------------------------ --------------
void __fastcall msg (char * str) / / повідомлення для монітора
{
if (! mWrite (m_Disp, (AnsiString (str) + AnsiString ("\ n \ r")). c_str (), strlen (str) +2, & wrtd));
}
void __fastcall logmsg (AnsiString mes) / / повідомлення в полі мемо
{
Form1-> LogText-> Lines-> Add (mes);
}
//------------------------------------------------ -------------- char __fastcall DeviceOrModule (AnsiString Parameter, int * item_index) / / визначити що було передано з початковими параметрами: прилад або модуль і видати порядковий номер потрібного тега.
{
int i, all_nodes;
/ / Шукаємо прилад
all_nodes = SecondLevelNodeAccess-> GetCount (); / / кількість тегів другого рівня
for (i = 0; i <all_nodes; i + +) {
if (AnsiString (SecondLevelNodeAccess-> GetNode (i) -> Attributes [WideString ("name")]) == Parameter) {
* Item_index = i;
return 1;
}
}
/ / Якщо прилад не знайдено, шукаємо модуль в тезі default
all_nodes = SecondLevelNodeAccess-> FindNode ("default") -> ChildNodes-> GetCount (); / / кількість тегів третього рівня в теге default
for (i = 0; i <all_nodes; i + +) {
if (AnsiString (SecondLevelNodeAccess-> FindNode ("default") -> ChildNodes-> GetNode (i) -> Text) == Parameter) {
* Item_index = i;
return 2;
}
}
return 0;
}
//------------------------------------------------ --------------
void __fastcall GetModuleList (AnsiString Parameter, PModule * ModuleList, int item_index, int * modules_counter) / / отримання списку модулів входять до складу приладу
{
int i, j, k, p, all_modules, version_count;
AnsiString mes;
* Modules_counter = ThirdLevelNodeAccess (item_index) -> GetCount (); / / кількість модулів у приладі
* ModuleList = new TModule [* modules_counter]; / / виділяємо пам'ять під масив модулів

for (i = 0; i <* modules_counter; i + +) {/ / заповнюємо поля name і baseaddress
if (cor_count)
{
for (j = 0; j <cor_count; j + +) {
if (AnsiString (ThirdLevelNodeAccess (item_index) -> GetNode (i) -> GetNodeValue ()) == Correction [j]. name) {
(* ModuleList) [i]. Name = Correction [j]. New_name;
break;
}
else (* ModuleList) [i]. name = AnsiString (ThirdLevelNodeAccess (item_index) -> GetNode (i) -> GetNodeValue ());
}
}
else (* ModuleList) [i]. name = AnsiString (ThirdLevelNodeAccess (item_index) -> GetNode (i) -> GetNodeValue ());
(* ModuleList) [i]. Baseaddress = StrToInt (ThirdLevelNodeAccess (item_index) -> GetNode (i) -> Attributes [WideString ("baseaddress ")]);
}
/ / LOG-> Add (AnsiString ());
/ / Активізація dll зі списком модулів
Form1-> XMLDocument1-> FileName = "module_list.xml";
Form1-> XMLDocument1-> Active = true;
all_modules = SecondLevelNodeAccess-> GetCount (); / / скільки всього модулів в базі
for (i = 0; i <* modules_counter; i + +) {
for (j = 0; j <= all_modules; j + +) {/ / заповнюємо поля version
if (j> = all_modules) {/ / не знайшли модуль (помилка у файлі з виправленнями)
mes = AnsiString ("Не знайдено модуль") + (* ModuleList) [i]. name;
MessageBox (NULL, mes.c_str (), "Помилка", MB_ICONERROR | MB_OK);
break;
}
if ((* ModuleList) [i]. name == AnsiString (ThirdLevelNodeAccess (j) -> GetNode (0) -> GetNodeValue ())) {
(* ModuleList) [i]. Version_count = ThirdLevelNodeAccess (j) -> GetCount () - 1;
for (k = 0; k <(* ModuleList) [i]. version_count; k + +) {
(* ModuleList) [i]. Version [k] = new TVersion;
(* ModuleList) [i]. Version [k] -> address = StrToInt (FourthLevelNodeAccess (j, k +1) -> GetNode (0) -> NodeValue);
(* ModuleList) [i]. Version [k] -> value = StrToInt (FourthLevelNodeAccess (j, k +1) -> GetNode (1) -> NodeValue);
(* ModuleList) [i]. Version [k] -> type = StrToInt (FourthLevelNodeAccess (j, k +1) -> GetNode (2) -> NodeValue);
(* ModuleList) [i]. Version [k] -> description = AnsiString (ThirdLevelNodeAccess (j) -> GetNode (k +1) -> Attributes [WideString ("description ")]);
}
break;
}
}
/ / LOG-> Add (ModuleList [i]. Name + AnsiString ("") + ModuleList [i]. Baseaddress);
}
}
//------------------------------------------------ --------------

void __fastcall GetModule (AnsiString Parameter, PModule * ModuleList, int item_index) / / отримуємо інформацію для одного модуля
{
int i, j, all_modules;
* ModuleList = new (TModule);
(* ModuleList) [0]. Name = AnsiString (Form1-> XMLDocument1-> DocumentElement-> ChildNodes-> FindNode ("default") -> ChildNodes-> GetNode (item_index) -> GetNodeValue ());
(* ModuleList) [0]. Baseaddress = StrToInt (Form1-> XMLDocument1-> DocumentElement-> ChildNodes-> FindNode ("default") -> ChildNodes-> GetNode (item_index) -> Attributes [WideString ("baseaddress")] );
Form1-> XMLDocument1-> FileName = "module_list.xml";
Form1-> XMLDocument1-> Active = true;
all_modules = SecondLevelNodeAccess-> GetCount ();
for (i = 0; i <= all_modules; i + +) {
if (i> = all_modules) {
MessageBox (NULL, "Модуль не був знайдений. Версія недоступна", "Error", MB_ICONERROR | MB_OK);
break;
}
if ((* ModuleList) [0]. name == AnsiString (ThirdLevelNodeAccess (i) -> GetNode (0) -> GetNodeValue ())) {
(* ModuleList) [0]. Version_count = ThirdLevelNodeAccess (i) -> GetCount () - 1;
for (j = 0; j <(* ModuleList) [0]. version_count; j + +) {
(* ModuleList) [0]. Version [j] = new TVersion;
(* ModuleList) [0]. Version [j] -> address = StrToInt (FourthLevelNodeAccess (i, j +1) -> GetNode (0) -> NodeValue);
(* ModuleList) [0]. Version [j] -> value = StrToInt (FourthLevelNodeAccess (i, j +1) -> GetNode (1) -> NodeValue);
(* ModuleList) [0]. Version [j] -> type = StrToInt (FourthLevelNodeAccess (i, j +1) -> GetNode (2) -> NodeValue);
(* ModuleList) [0]. Version [j] -> description = AnsiString (ThirdLevelNodeAccess (i) -> GetNode (j +1) -> Attributes [WideString ("description ")]);
}
break;
}
}
/ * LOG-> Add ((* ModuleList) [0]. Name + AnsiString ("") + (* ModuleList) [0]. Baseaddress);
for (i = 0; i <(* ModuleList) [0]. version_count; i + +) {
LOG-> Add ((* ModuleList) [0]. Version [i] -> address);
LOG-> Add ((* ModuleList) [0]. Version [i] -> value);
LOG-> Add ((* ModuleList) [0]. Version [i] -> type);
} * /
}
//------------------------------------------------ --------------
unsigned int _fastcall get_version (unsigned int BaseAddress, unsigned int type) / / зчитуємо версію з модуля
{
unsigned short i, j;
unsigned short SHsum; / / контрольна сума
unsigned char * pTarget = new unsigned char [10];
unsigned char * pReceived;
unsigned short MessageSize = 6;
unsigned int version;
ComPort = new TCom ("COM2", 115 200);
i = ComPort-> link_on ();
if (i) {
MessageBox (NULL, AnsiString (i). C_str (), "Помилка ініціалізації порту", MB_OK);
return 0;
}
pTarget [0] = 0x31;
pTarget [1] = (unsigned char) (MessageSize); / / молодший байт
pTarget [2] = (unsigned char) (MessageSize>> 8); / / старший байт
pTarget [3] = 0x04;
pTarget [4] = (unsigned char) type;
* (Int *) (pTarget + 0x05) = BaseAddress;
version = 0;
SHsum = 0x0;
for (i = 3; i <= 8; i + +) {SHsum + = pTarget [i];} / / підрахунок КС
/ / MessageBox (NULL, AnsiString (SHsum). C_str (), "Контрольна сума", MB_OK);
pTarget [9] = (unsigned char) (SHsum); / / молодший байт
pTarget [10] = (unsigned char) (SHsum>> 8); / / старший байт
ComPort-> write (pTarget, 3 + MessageSize +2);
delete [] pTarget;
Sleep (100);
i = ComPort-> read ();
if (i> 0)
{
/ / MessageBox (NULL, AnsiString (i). C_str (), "Прийнято байт", MB_OK);
pReceived = ComPort-> get_receiver_ptr (); / / зчитуємо отримане значення
if (pReceived [0]! = 0x55 | | pReceived [1]! = 0xAA) {
MessageBox (NULL, pReceived, "Помилка", MB_OK);
return 0;
}
/ / Накладення масок
switch (type) {
case 1:
version = (unsigned int) (* (char *) (pReceived + 5)) &0x000000FF;
break;
case 2:
version = (unsigned int) (* (short *) (pReceived + 5)) &0x0000FFFF;
break;
case 4:
version = (unsigned int) * (int *) (pReceived + 5);
break;
default:
version = (unsigned int) (* (short *) (pReceived + 5)) &0x0000FFFF;
break;
}
}
ComPort-> link_off ();
return version;
}
__fastcall Executing:: Executing (bool CreateSuspended) / / конструктор
: TThread (CreateSuspended)
{
end = false; / / мітка закінчення = брехливо
}
//------------------------------------------------ --------------
int __fastcall get_correction (PCorrection * CorrectionList) / / обробка файлу виправлень
{
int i = 0;
int j = 0;
int n = 0;
int correction_counter = 0; / / кількість виправлень
FILE * CorrectFilePtr; / / файл з виправленнями
char tempchar = '';
char * tempFile; / / масив під файл з сіправленіямі
char control_buff [20]; / / масив знаків пунктуації
if ((CorrectFilePtr = fopen ("corrections.txt", "r")) == NULL) {
return 0;
}
/ / Дізнаємося розмір файлу і виділяємо тимчасовий масив під файл
fseek (CorrectFilePtr, 0L, SEEK_END);
n = ftell (CorrectFilePtr);
fseek (CorrectFilePtr, 0L, SEEK_SET);
tempFile = new char [n];
/ / Виправляємо можливі помилки пунктуації
while (tempchar == '\ n' | | tempchar == '') {
tempchar = fgetc (CorrectFilePtr);
}
tempFile [0] = tempchar;
i = 1;
while (1) {
tempchar = fgetc (CorrectFilePtr);
if (tempchar == '\ n') {
continue;
}
if (tempchar == '') {
continue;
}
if (tempchar =='='){
control_buff [j] = tempchar;
j + +;
}
if (tempchar ==';'){
control_buff [j] = tempchar;
correction_counter + +;
j + +;
}
if (tempchar == EOF) {
tempFile [i] = tempchar;
control_buff [j] = tempchar;
break;
}
tempFile [i] = tempchar;
i + +;
}
/ / Чи правильно розставлені знаки пріпенанія
for (i = 0; i <= j; i + +) {
if (control_buff [i] =='='){
if (control_buff [i +1]! =';'){
logmsg ("У файлі коригування виявлена ​​помилка. Коригування враховані не будут33");
return 0;
}
}
if (control_buff [i] ==';'){
if (! (control_buff [i +1] == '=' | | control_buff [i +1] == EOF)) {
logmsg ("У файлі коригування виявлена ​​помилка. Коригування враховані не будут331");
return 0;
}
}
}
/ / MessageBox (NULL, tempFile, "прочитав", MB_OK);
* CorrectionList = new TCorrection [correction_counter];
/ / Заполянем масив виправлень
tempchar = 0;
i = 0;
n = 0;
while (tempchar! = EOF) {
while (tempFile [i]! = '=') {
(* CorrectionList) [n]. Name + = tempFile [i + +];
}
/ / (* CorrectionList) [n]. Name [j] = '\ 0';
i + +;
while (tempFile [i]! = ';') {
(* CorrectionList) [n]. New_name + = tempFile [i + +];
}
/ / (* CorrectionList) [n]. New_name [j] = '\ 0';
n + +;
tempchar = tempFile [+ + i];
}
/ * For (j = 0; j <correction_counter; j + +) {
MessageBox (NULL, (* CorrectionList) [j]. Name, "", MB_OK);
MessageBox (NULL, (* CorrectionList) [j]. New_name, "", MB_OK);
} * /
delete [] tempFile;
fclose (CorrectFilePtr);
return correction_counter;
}
//------------------------------------------------ -------------- void __fastcall Executing:: Execute ()
{
CoInitialize (NULL);
char item_type;
DWORD res;
char received_data [255];
unsigned int received_version = 0;
AnsiString mes;
int i, j, index, modules_counter, all_modules, p, param_num;
int error = 0;
if (! FileExists ("device_list.xml")) {
MessageBox (NULL, "Файл device_list.xml не був знайдений", "Помилка", MB_ICONERROR | MB_OK);
PostMessage (Form1-> Handle, WM_CLOSE, 0,0);
return;
}
if (! FileExists ("module_list.xml")) {
MessageBox (NULL, "Файл module_list.xml не був знайдений", "Помилка", MB_ICONERROR | MB_OK);
PostMessage (Form1-> Handle, WM_CLOSE, 0,0);
return;
}
/ / Обробка вхідних параметрів
if (ParamCount () == 0) {
MessageBox (NULL, "Не було передано жодного параметра!", "Помилка", MB_ICONERROR | MB_OK);
PostMessage (Form1-> Handle, WM_CLOSE, 0,0);
return;
}
/ / Отримати управління над функціями бібліотеки ProgExchCl.dll
res = ProgExchCl_LoadLibrary ();
if (res! = 0x0)
{
sprintf (received_data, "Отримано помилку% d при зверненні до бібліотеки \" ProgExchCl.dll \ ".", res);
MessageBox (NULL, received_data, "Помилка", MB_OK);
}
/ / Відкриття каналу видачі даних на екран
sprintf (received_data, "PipeDisplay% d", GetCurrentProcessId ());
res = mOpen (received_data, & m_Disp);
if (res == 0x0)
{
/ / Перевести висновок в режим налагоджувальної (0x01 0x02) або звітної (0x01 0x01) інформації
received_data [0] = 0x01; received_data [1] = 0x01;
res = mWrite (m_Disp, received_data, 2, & wrtd);
if (res! = 0x0)
{
sprintf (received_data, "Отримано помилку% d при перекладі виведення в режим налагоджувальної інформації", res);
MessageBox (NULL, received_data, "Помилка", MB_OK);
logmsg (received_data);
}
Form1-> WindowState = wsMinimized;
}
else {
sprintf (received_data, "Отримано помилку% d при відкритті каналу видачі даних на екран", res);
logmsg (AnsiString (received_data));
logmsg (AnsiString ("Режим автономної роботи"));
Form1-> WindowState = wsNormal;
}
cor_count = get_correction (& Correction);
/ / Відкриття XML-файлу
Form1-> XMLDocument1-> FileName = "device_list.xml";
Form1-> XMLDocument1-> Active = true;
item_type = DeviceOrModule (ParamStr (1), & index);
/ / Отримання списку модулів входять до складу приладу
if (item_type == 0) {
MessageBox (NULL, "Прилад або модуль не був знайдений", "Помилка", MB_ICONERROR | MB_OK);
PostMessage (Form1-> Handle, WM_CLOSE, 0,0);
return;
}
if (item_type == 1) {
GetModuleList (ParamStr (1), & Module, index, & modules_counter);
if (index == -1) {
PostMessage (Form1-> Handle, WM_CLOSE, 0,0);
return;
}
mes = AnsiString ("Перевірка версії приладу:") + ParamStr (1);
}
if (item_type == 2) {
GetModule (ParamStr (1), & Module, index);
if (index == -1) {
PostMessage (Form1-> Handle, WM_CLOSE, 0,0);
return;
}
mes = AnsiString ("Перевірка версії модуля:") + ParamStr (1);
modules_counter = 1;
}
msg ("");
msg ("");
msg (mes.c_str ());
logmsg (mes.c_str ());
/ / Перевести висновок в режим налагоджувальної (0x01 0x02) або звітної (0x01 0x01) інформації
received_data [0] = 0x01; received_data [1] = 0x02;
res = mWrite (m_Disp, received_data, 2, & wrtd);
if (res! = 0x0)
{
/ / Sprintf (received_data, "Отримано помилку% d при перекладі виведення в режим налагоджувальної інформації", res);
/ / MessageBox (NULL, received_data, "Помилка", MB_OK);
}
/ / Вивід результатів тестування з кожного модуля
for (i = 0; i <modules_counter; i + +) {
/ / Назва модуля
msg ("");
msg (Module [i]. name.c_str ());
logmsg ("");
logmsg (Module [i]. name.c_str ());
for (j = 0; j <Module [i]. version_count; j + +) {
received_version = get_version ((unsigned int) (Module [i]. baseaddress + Module [i]. version [j] -> address), Module [i]. version [j] -> type);
/ / Якщо версії збігаються, то НОРМА, якщо не збігаються, то ненорми
if (received_version == Module [i]. version [j] -> value) {
mes = AnsiString ("") + Module [i]. version [j] -> description + AnsiString ("0x") + IntToHex ((int) Module [i]. version [j] -> value, Module [i] . version [j] -> type) + AnsiString (": HOPMA");
msg (mes.c_str ());
logmsg (mes.c_str ());
}
else {
mes = AnsiString ("") + Module [i]. version [j] -> description + AnsiString ("0x") + IntToHex ((int) received_version, Module [i]. version [j] -> type) + AnsiString (": HEHOPMA") + AnsiString ("(повинно бути 0x") + IntToHex ((int) Module [i]. version [j] -> value, Module [i]. version [j] -> type) + AnsiString (")");
msg (mes.c_str ());
logmsg (mes.c_str ());
error + = 1;
}
}
}
/ / Перевести висновок в режим налагоджувальної (0x01 0x02) або звітної (0x01 0x01) інформації
received_data [0] = 0x01; received_data [1] = 0x01;
res = mWrite (m_Disp, received_data, 2, & wrtd);
if (res! = 0x0)
{
/ / Sprintf (received_data, "Отримано помилку% d при перекладі виведення в режим звітної інформації", res);
/ / MessageBox (NULL, received_data, "Помилка", MB_OK);
}
/ / Загальний результат тестування
if (error) {
msg ("");
msg ("Результат: ненорми");
logmsg ("");
logmsg ("Результат: ненорми");
}
else {
msg ("");
msg ("Результат: НОРМА");
logmsg ("");
logmsg ("Результат: НОРМА");
}
/ / Звільняємо динамічно виділену пам'ять
if (item_type == 1) {
delete [] Module;
}
else delete Module;
delete [] Correction;
if (mClose! = NULL)
{
/ / Відключити канали обміну
mClose (m_Disp);
}
ProgExchCl_FreeLibrary ();
CoUninitialize ();
PostMessage (Form1-> Handle, WM_CLOSE, 0,0);
}
//------------------------------------------------ --------------
# Ifndef Unit1H
# Define Unit1H
//------------------------------------------------ --------------# include <Classes.hpp>
# Include <Controls.hpp>
# Include <StdCtrls.hpp>
# Include <Forms.hpp>
# Include <msxmldom.hpp>
# Include <XMLDoc.hpp>
# Include <xmldom.hpp>
# Include <XMLIntf.hpp>
//------------------------------------------------ --------------
typedef struct _SVersion {
unsigned int address; / / адреса регістра версії
unsigned int value; / / лічене значення версії
unsigned int type; / / розрядність версії
AnsiString description; / / опис версії
} TVersion, * PVersion;
typedef struct _SModule {
AnsiString name; / / ім'я модуля
unsigned int baseaddress; / / базовий адресу модуля
int version_count; / / кількість версій у модуля
PVersion version [10]; / / масив версій модуля
} TModule, * PModule;
typedef struct _SCorrection {
AnsiString name;
AnsiString new_name;
} TCorrection, * PCorrection;
class TForm1: public TForm
{
__published: / / IDE-managed Components
TXMLDocument * XMLDocument1;
TMemo * LogText;
void __fastcall FormActivate (TObject * Sender);
void __fastcall FormClose (TObject * Sender, TCloseAction & Action);
private: / / User declarations
public: / / User declarations
__fastcall TForm1 (TComponent * Owner);
};
//------------------------------------------------ --------------
extern PACKAGE TForm1 * Form1;
//------------------------------------------------ --------------
# Endif
//------------------------------------------------ --------------
# Include <vcl.h>
# Pragma hdrstop
# Include "Unit1.h"
# Include "Unit2.h"
# Include <stdio.h>
//------------------------------------------------ --------------# pragma package (smart_init)
# Pragma resource "*. dfm"
Executing * Thread;
TForm1 * Form1;
tagMSG lpMsg;
//------------------------------------------------ -------------- __fastcall TForm1:: TForm1 (TComponent * Owner)
: TForm (Owner)
{
}
//------------------------------------------------ --------------
void __fastcall TForm1:: FormActivate (TObject * Sender)
{
Thread = new Executing (FALSE); / / запускаємо потік
}
//------------------------------------------------ --------------
void __fastcall TForm1:: FormClose (TObject * Sender, TCloseAction & Action)
{
Thread-> WaitFor ();
delete (Thread);
}
//------------------------------------------------ --------------
//------------------------------------------------ ---------------------------
# Ifndef UdevicesH
# Define UdevicesH
# Include <classes.hpp>
/ / # Include "U_MK_pipe.h"
# Include <Mask.hpp>
//------------------------------------------------ --------------// Абстрактний клас, який реалізує базові функції будь-якого пристрою
class TDevFather: public TObject
{
__published:
private: / / User declarations
protected:
bool active;
char receiver [0x1000]; / / апріорно виділено 4кБ буфера, приготовлені для відправки класу монітору
int receiver_size; / / розмір реально прийнятих байт в буфері
public:
virtual __fastcall TDevFather ();
virtual __fastcall ~ TDevFather ();
virtual int __fastcall link_on ();
virtual int __fastcall link_off ();
/ / Функції для роботи з мостом з метою введення / виводу
/ / Читання з буфера устройтва
virtual int __fastcall scan ();// Повертає ознака статусу пристрою
virtual int __fastcall read ();// Якщо позитивне число, то це число пінятих байт, якщо негативне, то це код помилки
virtual char * __fastcall get_receiver_ptr ();//
/ / Відправити дані
virtual int __fastcall write (char * chs, int size); / / передача символів / байтів на пристрій
/ / Запис в буфер
/ / Virtual int __fastcall add_to_sender (char * chs, int size); / / передача символів / байтів в передавальний буфер
};
//------------------------------------------------ --------------
class TCom: public TDevFather
{
__published:
private: / / User declarations
protected:
AnsiString comname;
int baudrate;
HANDLE com_hndl;
DCB st_dcb;
public:
virtual __fastcall TCom (char * comname, int baudrate);
virtual __fastcall ~ TCom ();
int __fastcall link_on ();
int __fastcall link_off ();
/ / Функції для роботи з мостом з метою введення / виводу
/ / Читання з буфера устройтва
int __fastcall scan ();// Повертає ознака статусу пристрою
int __fastcall read ();// Якщо позитивне число, то це число пінятих байт, якщо негативне, то це код помилки
/ / Virtual char * __fastcall get_receiver_ptr ();// метод успадковується без зміни
/ / Відправити дані
virtual int __fastcall write (char * chs, int size); / / передача символів / байтів на пристрій
/ / Запис в буфер
/ / Virtual int __fastcall add_to_sender (char * chs, int size); / / передача символів / байтів в передавальний буфер
void __fastcall set_comname (AnsiString comname);
void __fastcall set_baudrate (int baudrate);
AnsiString __fastcall get_comname ();
int __fastcall get_baudrate ();
};
//------------------------------------------------ --------------# endif
//------------------------------------------------ --------------
# Pragma hdrstop
# Include <Forms.hpp>
# Include <Mask.hpp>
# Include "Udevices.h"
//------------------------------------------------ -------------- __fastcall TDevFather:: TDevFather () {}
//------------------------------------------------ -------------- __fastcall TDevFather:: ~ TDevFather () {}
//------------------------------------------------ -------------- int __fastcall TDevFather:: link_on ()
{Return 0;}
//------------------------------------------------ -------------- int __fastcall TDevFather:: link_off ()
{Return 0;}
//------------------------------------------------ -------------- / / функції для роботи з мостом
int __fastcall TDevFather:: scan () / / Повертає ознака статусу пристрою
{
/ /
return receiver_size;
}
//------------------------------------------------ ---------------------------
int __fastcall TDevFather:: read () / / Якщо позитивне число, то це число прийнятих байт, якщо негативне, то це код помилки
{
/ /
return receiver_size;
}
//------------------------------------------------ ---------------------------
char * __fastcall TDevFather:: get_receiver_ptr () / /
{
return receiver;
}
//------------------------------------------------ ---------------------------
int __fastcall TDevFather:: write (char * chs, int size)
{
return size;
}
//--------------- TCom -------------------------------- ----------- __fastcall TCom:: TCom (char * comname, int baudrate)
{
/ /
TCom:: comname = comname; / / = "COM1";
TCom:: baudrate = baudrate; / / = 115200;
active = false;
}
//------------------------------------------------ -------------- __fastcall TCom:: ~ TCom ()
{
/ /
if (active)
{
link_off ();
}
}
//------------------------------------------------ -------------- int __fastcall TCom:: link_on ()
{
/ /
if (! active)
{
com_hndl = CreateFile (comname.c_str (), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
if (com_hndl == INVALID_HANDLE_VALUE)
{
/ / MessageBoxA (0, "Invalid handle value", "Simple_COM", MB_OK);
active = false;
return -1;
}
/ / Налагодження параметрів з'єднання
st_dcb.DCBlength = sizeof (DCB);
st_dcb.Parity = NOPARITY; / / NOPARITY, ODDPARITY, MARKPARITY, EVENPARITY
st_dcb.StopBits = ONESTOPBIT; / / ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS
st_dcb.ByteSize = 8; / / 4-8
st_dcb.BaudRate = baudrate; / / CBR_115200
SetCommState (com_hndl, & st_dcb);
if (com_hndl == INVALID_HANDLE_VALUE)
{
/ / MessageBoxA (0, "Invalid handle value", "Simple_COM", MB_OK);
active = false;
return -1;
}
SetupComm (com_hndl, 40000, 40000); / / розміри банків
if (com_hndl == INVALID_HANDLE_VALUE)
{
/ / MessageBoxA (0, "Invalid handle value", "Simple_COM", MB_OK);
active = false;
return -1;
}
SetCommMask (com_hndl, EV_RXCHAR);
if (com_hndl == INVALID_HANDLE_VALUE)
{
/ / MessageBoxA (0, "Invalid handle value", "Simple_COM", MB_OK);
active = false;
return -1;
}
active = true;
};
if (! active)
{
return -1;
} Else {
return 0;
}
}
//------------------------------------------------ -------------- int __fastcall TCom:: link_off ()
{
/ /
if (active)
{
active = false;
CloseHandle (com_hndl);
return 0;
}
else
{
active = false;
return -1;
}
}
//------------------------------------------------ -------------- int __fastcall TCom:: scan () / / Повертає ознака статусу пристрою
{
COMSTAT st;
unsigned long Err;
if (active)
{
if (ClearCommError (com_hndl, & Err, & st))
{
return st.cbInQue;
}
else
{
/ / MessageBoxA (0, "Com scan error", "Simple_COM", MB_OK);
return -1;
}
}
else
{
return 0;
}
}
//------------------------------------------------ -------------- int __fastcall TCom:: read () / / Якщо позитивне число, то це число пінятих байт, якщо негативне, то це код помилки
{
COMSTAT st;
unsigned long Err;
unsigned long readed_bytes;
/ /
readed_bytes = 0;
if (active)
{
if (ClearCommError (com_hndl, & Err, & st))
{
if ((Err & CE_BREAK)> 0)
{
/ / MessageBoxA (0, "Com read error: CE_BREAK", "Simple_COM", MB_OK);
return -2;
}
if (0x1000> st.cbInQue)
{
if (! ReadFile (com_hndl, receiver, st.cbInQue, & readed_bytes, NULL))
{
/ / MessageBoxA (0, "Com read error: ReadFile 1", "Simple_COM", MB_OK);
return -3;
}
}
else
{
if (! ReadFile (com_hndl, receiver, 0x1000, & readed_bytes, NULL))
{
/ / MessageBoxA (0, "Com read error: ReadFile 2", "Simple_COM", MB_OK);
return -4;
}
}
}
else
{
/ / MessageBoxA (0, "0шібка сканування пристрою COM", "Simple_COM", MB_OK);
}
}
return (int) readed_bytes;
}
//------------------------------------------------ -------------- int __fastcall TCom:: write (char * chs, int size)
{
unsigned long sended;
/ /
sended = 0;
if (! WriteFile (com_hndl, chs, (unsigned long) size, & sended, NULL))
{/ / Помилка
/ / MessageBoxA (0, "Помилка передачі даних", "Simple_COM", MB_OK);
return -1;
}
return (int) sended;
}
//------------------------------------------------ --------------
void __fastcall TCom:: set_comname (AnsiString comname) {}
void __fastcall TCom:: set_baudrate (int baudrate) {}
AnsiString __fastcall TCom:: get_comname ()
{/ /
return comname;
}
//------------------------------------------------ -------------- int __fastcall TCom:: get_baudrate ()
{/ /
return baudrate;
}
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Звіт з практики
74.8кб. | скачати


Схожі роботи:
Підготовка та оформлення організаційно-розпорядчої документації
Підготовка документації повірочної лабораторії на право акредитації
Підготовка документації повірочної лабораторії на право акредитації теплолічильників
Побудова програми ведення електронної документації кадрового відділу
Розробка проектно-конструкторської документації на жіночі штани галіфе
Розробка документації та постановка задачі Облік наявності стану
Удосконалення системи неруйнівного контролю якості виробів на підприємствах машинобудівного
Диференціальний вихорострумовий перетворювач для контролю параметрів немагнітних виробів
Розробка конструкторсько-технологічної документації на модель жіночого жакета з напіввовняної
© Усі права захищені
написати до нас