Автоматизированное рабочее место оператора радиостанции

 













ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к выпускной квалификационной работе на тему:

«АРМ оператора радиостанции»



Дипломник

Д.А. Шергин

студент гр. 8-78-11

Руководитель

Е.А. Коробков

Нормоконтролер

В.П. Соболева

Зав. кафедрой «Программное обеспечение»

И.О. Архипов

к.т.н., доцент



РЕФЕРАТ


Пояснительная записка к выпускной квалификационной работе бакалавра на тему «АРМ оператора радиостанции» оформлена на 61 странице, содержит 19 рисунков и 8 таблиц.

Ключевыми словами в данной работе являются: радиостанция, протокол обмена, интерфейс, режим, передача данных.

Целью создания системы является автоматизация работы с радиостанцией при подключении её к компьютеру. Оператор может обеспечивать двухстороннюю симплексную телефонную и телеграфную связь как в коротковолновом, так и в ультракоротковолновом диапазоне. Так же он может проводить сеансы связи для передачи произвольных данных в пакетном режиме..

Система позволяет:

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

.обеспечить сеансы связи для передачи произвольных файлов в пакетном режиме;

.обеспечить защиту от несанкционированного доступа к программе;

.при подключении к радиостанции модуля GPS/Глонасс определять координаты радиостанции в метрах или градусах.

В результате проделанной работы было разработано программное обеспечение, предназначенное для автоматизации работы оператора радиостанции.

Система находится на стадии разработки и готовится к внедрению в реальных условиях.



СОДЕРЖАНИЕ


ВВЕДЕНИЕ

.РАЗРАБОТКА АРМ ОПЕРАТОРА РАДИОСТАНЦИИ

.1Обоснование целесообразности разработки системы

.1.1Назначение объекта автоматизации

.1.2Обоснование цели создания системы

.1.3Обоснование состава автоматизируемых задач

.2Аналитический обзор

.3Основные требования к системе

.3..Цель создания системы и критерии эффективности её функционирования

.3.2Функциональное назначение системы

.3.3Требование к функциональной структуре системы

.3.4Состав типовых проектных решений и пакетов прикладных программ, применяемых в системе

.3.5Требования к техническому обеспечению

.3.6Требования к информационному обеспечению

.3.7Требования к программному обеспечению

.3.8Перспективность системы, возможность ее развития

.4Основные технические решения проекта системы

.4.1Описание системы программного обеспечения

.РАЗРАБОТКА АРМ ОПЕРАТОРА РАДИОСТАНЦИИ

.1Описание постановки задачи

.1.1Характеристика задачи

.1.2Входная информация

.1.3Выходная информация

.2Описание алгоритма отправки команды

.2.1Назначение и характеристика алгоритма

.2.2Используемая информация

.2.3Результаты решения

.2.4Алгоритм решения

.3Описание алгоритма защиты доступа к программе

.3.1Назначение и характеристика алгоритма

.3.2Используемая информация

.3.3Результаты решения

.3.4Алгоритм решения

.4Описание алгоритма вывода координат

.4.1Назначение и характеристика алгоритма

.4.2Используемая информация

.4.3Результаты решения

.4.4Алгоритм решения

.5Описание программы формирования команды

.5.1Функциональное назначение

.5.2Описание информации

.5.3Используемые подпрограммы

.5.4Описание логики

.6Описание контрольного примера

.6.1Назначение

.6.2Исходные данные

.6.3Результаты испытания программы

ЗАКЛЮЧЕНИЕ

СПИСОК ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ 1 Тексты ОСНОВНЫХ АЛГАРИТМОВ

ПРИЛОЖЕНИЕ 2 РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММ

ПРИЛОЖЕНИЕ 3 РУКОВОДСТВО ОПЕРАТОРА



перечень условных обозначений, сокращений, символов и специальных терминов с их определениями


ЗПЧ - заранее подготовленная частота

КВ - коротковолновый

МТГ - проводная микротелефонная гарнитура

НЧ - низкочастотный

ППРЧ - псевдослучайная перестройка рабочей частоты

ППРЧ-А- псевдослучайная перестройка рабочей частот аналоговом режиме

ППРЧ-Ц- псевдослучайная перестройка рабочей частоты в цифровом режиме

РРУ- ручная регулировка усиления

СПО- специальное программное обеспечение

ТЛФ- телефон

ТЛГ- телеграф

ТФ-А- телефон аналоговый

ТФ-Ц- телефон цифровой

УКВ - ультракоротковолновый

ЦФР - цифровая речь

ШП - шумоподавительA- телеграфия незатухающими колебаниями, код МорзеA- двухполосная телеграфия, код МорзеE- двухполосная телефония (радиовещание)E- телефония с частотной модуляциейA- однополосная телеграфия c подавлением несущей, код Морзе


ВВЕДЕНИЕ


Наше время - это время простого общения через интернет. Нажимаешь на кнопку, и Ваше сообщение отправлено без малейшего звука. Пара нажатий клавиш на сотовом телефоне и вы говорите с человеком на другой стороне земли. Именно поэтому привлекательность человеческого общения через связь на коротких волнах сегодня велика как никогда.

Но что делать, если вы отправились в поход в горы или любую другую, далёкую от цивилизации местность, где сотовая связь не имеет доступа и вы отрезаны от внешнего мира? Даже спутниковая связь не всегда позволяет осуществить звонок. В подобном случае связь с помощью коротковолновой радиостанции просто незаменима.

Использование тяжелых стационарных радиостанций высокой мощности имеет большое значение для различных спецслужб и военных. Для них качественная и быстрая связь имеет огромное значение. Поэтому современный радист должен с легкостью управляться со всем комплексом различной радиоаппаратуры, а объединение всех её функций в одной программе на компьютере должно значительно упростить работу.


1.РАЗРАБОТКА АРМ ОПЕРАТОРА РАДИОСТАНЦИИ


1.1Обоснование целесообразности разработки системы


1.1.1 Назначение объекта автоматизации

Объектом автоматизации является рабочее место оператора радиостанции. Оператор должен с помощью данной системы, установленной на персональный компьютер, управлять работой радиостанции: обеспечивать телефонную и телеграфную связь, пакетную передачу данных.


1.1.2Обоснование цели создания системы

Целью создания системы является автоматизация работы оператора с радиостанцией при подключении её к компьютеру. Оператор может обеспечивать двухстороннюю симплексную телефонную и телеграфную связь как в коротковолновом, так и в ультракоротковолновом диапазоне. Так же он может проводить сеансы связи для передачи произвольных данных в пакетном режиме.

Для достижения поставленной цели решаются следующие задачи задачи:

обеспечить настройку и запуск работы двусторонней симплексной телефонной и телеграфной связи в коротковолновом и ультра- коротковолновом диапазонах;

обеспечить сеансы связи для передачи произвольных файлов в пакетном режиме;

реализовать протокол передачи данных между компьютером и радиостанцией;

обеспечить защиту от несанкционированного доступа к программе;

Обеспечить удобный пользовательский интерфейс и удобный ввод вывод пользовательских данных данных (прием передача файлов в пакетном режиме) при обмене с РС

обеспечить быстрый доступ к информации, полученной с помощью радиостанции;

при подключении к радиостанции модуля GPS/Глонасс система должна позволять определять координаты радиостанции в метрах или градусах.


1.1.3Обоснование состава автоматизируемых задач

Все задачи ограничиваются возможностями радиостанции и возможным подключенным к ней оборудованием.

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

Интерфейс подключения радиостанции к компьютеру должен позволять без потерь и заметных замедлений передавать данные.

Интерфейс системы имеет важное значение и является неотъемлемой ее составляющей, ориентированной, прежде всего, на конечного пользователя. Именно через интерфейс пользователь судит о прикладной программе в целом, поэтому интерфейс системы должен быть прост и удобен для пользователя и не вызывать у него при работе больших сложностей.


1.2Аналитический обзор


Разработка систем автоматизации работы радиостанций имеет локальный характер, поскольку для различных моделей радиостанций необходимы свои собственные программные продукты. Система может быть использована для различных моделей радиостанций одной серии или для комплекса радиостанций. Существенные различия могут быть в интерфейсе подключения радиостанции к компьютеру:: Широко используемый последовательный интерфейс синхронной и асинхронной передачи данных, определяемый стандартом EIA RS-232. Изначально создавался для связи компьютера с терминалом. В настоящее время используется в самых различных применениях. Интерфейс RS-232 соединяет два устройства. Линия передачи первого устройства соединяется с линией приема второго и наоборот.

Данный интерфейс позволяет передавать данные на расстояние до 15 метров на скорости до 115 Кбит/с.: универсальная последовательная шина, предназначенная для подключения периферийных устройств. Шина USB представляет собой последовательный интерфейс передачи данных для высоко-, средне- и низкоскоростных периферийных устройств. В данное время USB интерфейс имеет более широкое распространение и позволяет передавать данные на скорости до 480 Мбит/с, но на практике эта скорость редко достигается. И дальность передачи данных не может превышать 5 метров.

Таким образом, можно сделать вывод, что мы можем использовать интерфейс RS-232, поскольку он прост в реализации, имеет удовлетворительную скорость передачи данных и имеет высокую дальность передачи данных.

Так же огромную роль играет пользовательский интерфейс системы, поскольку оператор должен без проблем освоить и использовать большое разнообразие режимов работы радиостанции, без каких-либо проблем осуществлять изменение в настройках передачи данных. Интерфейс должен иметь возможности для представления исходных данных и результатов в виде, общепринятом в данной предметной области, либо в зависимости от категорий пользователей и их пожеланий. В данном случае интерфейс может позволять одинаковую сложность для доступа ко всем режимам, либо позволять настроить интерфейс под отдельные режимы, которые будут использоваться чаще всего.

Большое значение имеет информация, передаваемая с радиостанции, и её представление для оператора, и информация о состоянии радиостанции в данный момент.


1.3Основные требования к системе


1.3.1Цель создания системы и критерии эффективности её функционирования

Создание автоматизированной системы для работы оператора с радиостанцией.

Критерии эффективности функционирования:)Работа в различных режимах связи;)Смена режима работы радиостанции в короткое время;)Создание отчета работы при каждом запуске программы;)Ввод вывод информации в удобном для пользователя виде;)Ограничение доступа к определенным режимам связи;)Вход в систему по паролю;)Удобство использования


1.3.2Функциональное назначение системы

Система предназначена для управления радиостанцией с помощью компьютера. Оператор должен иметь возможность с помощью компьютера управлять всеми функциями радиостанции.

При подключении радиостанции к компьютеру оператор может осуществлять двустороннюю симплексную телефонную и телеграфную радиосвязь в диапазоне коротковолновых и ультракоротковолновых частот. Передавать произвольные файлы в пакетном режиме. При подключении к радиостанции модуля GPS/Глонасс оператор может получать координаты радиостанции и высоту над уровнем моря.



1.3.3Требование к функциональной структуре системы

Структурная схема системы представлена на рис. 1.1.


Структурная схема

рис. 1.1


Автономный режим предназначен для работы с системой без подключения радиостанции, позволяет только настроить программу для работы.


1.3.4Состав типовых проектных решений и пакетов прикладных программ, применяемых в системе

В системе применяется средство для разработки приложений Microsoft Visual Studio 2008;


1.3.5Требования к техническому обеспечению

Для работы системы необходима следующая аппаратура:

)Изделие Намотка - КС

)ПК со следующими минимальными характеристиками:

а) процессор с частотой 1 ГГц и выше;

б) объем ОЗУ 512 МБ;

в) свободное пространство на жестком диске не менее 100 МБ;

г) видеокарта обеспечивающая разрешение не хуже 800x600x16;

д) наличие последовательного порта с интерфейсом RS-232C или порта USB;

е) Монитор;

ж) клавиатура;

з) мышь.


1.3.6Требования к информационному обеспечению

Все файлы используемые в системе хранятся на жестком диске в папке программы:

) *.LOG - расширение файлов используемых для хранения информации о сеансах работы системы;

) *.DAT - расширение файлов используемых для хранения текущих настроек системы;

) *.SNS - расширение файлов содержащих шаблоны настроек сеансов радиосвязи.


1.3.7Требования к программному обеспечению

На ПК должна быть установлена операционная система Windows ХР SP2 и выше и дистрибутивный пакет платформы Microsoft .NET Framework 2.0 и выше.


1.3.8Перспективность системы, возможность ее развития

Система может быть модернизирована для работы с другими моделями радиостанций. Могут быть расширены функции системы при модернизации возможностей радиостанции.


1.4Основные технические решения проекта системы


1.4.1Описание системы программного обеспечения

Для реализации и нормального функционирования проекта необходимо наличие:

1)Операционной системы Windows XP/Vista/Seven;

2)дистрибутивного пакета платформы Microsoft .NET Framework 2.0 и выше.

Для разработки системы использовалось средство разработки приложений Microsoft Visual Studio 2008 код программы написан на языке С#.



2.РАЗРАБОТКА АРМ ОПЕРАТОРА РАДИОСТАНЦИИ


2.1Описание постановки задачи


2.1.1 Характеристика задачи

Настройка и запуск режимов работы радиостанции с передачей параметров на устройство. Это позволяет в короткое время изменить параметры работы радиостанции в определенном режиме и передать их на устройство. При настройке режима оператором программа должна передать на устройство информацию об состоянии определенного параметра. При запуске режима программа должна создать файл режима и передать его на устройство. Передача информации должна производиться через интерфейс RS-232.


2.1.2Входная информация

Входной информацией служат состояния параметров всех режимов радиостанции. Параметры режимов отображены в соответствующей вкладке каждого режима.

Параметры режима ТЛФ показаны в таблице 2.1.


Таблица 2.1

Параметры режима ТЛФ

Имя параметраХарактеристики параметра (диапазон)Тип данныхТип режимаКВ режимы: ТФ-А, ТФ-Ц, ТФ ППРЧ-А, ТФ ППРЧ-Ц УКВ режимы: F3A, A3E, ТФ-Ц, ТФ ППРЧ-ЦbooleanДополнительный параметр для ТФ-ЦЦФР1, ЦФР2booleanЧастотаДля КВ: от 2000 до 29999 КГц Для УКВ: от 52 до 174 МГцfloatУсилениеОт 0 до 99IntСтатус кореспондентаВедущий, ведомыйbooleanШумоподавлениеОт 0 до 30IntНомер ППРЧ для режимов ТФ ППРЧОт 1 до 64Int

Параметры режимов ТЛГ и УКВ показаны в таблице 2.2.


Таблица 2.2

Параметры режимов ТЛГ и УКВ

Имя параметраХарактеристики параметра (диапазон)Тип данныхКласс излученияA1A, J2A, A3AbooleanЧастотаДля КВ: от 2000 до 29999 КГц Для УКВ: от 52 до 174 МГцfloatУсилениеОт 0 до 99IntШумоподавлениеОт 0 до 30Int

Параметры передачи файлов показаны в таблице 2.3.


Таблица 2.3

Параметры передачи файлов

Имя параметраХарактеристики параметра (диапазон)Тип данныхСтатус корреспондентаВедущий, ведомыйbooleanЧастотаДля КВ: от 2000 до 29999 КГцfloatРазмер пакета16, 32, 64, 158, 252IntРазмер окнаОт 1 до 30Int

2.1.3Выходная информация

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

При отсутствии подключения устройства выдается сообщение «Устройство не подключено».

Если оборудование не опознано выдается сообщение «Устройство не опознано».

Сообщения оператору об ошибках и сбоях представлены в таблице 2.4.


Таблица 2.4

Сообщения об ошибках

СообщенияАвария! Ошибка обмена с ПК. (формируется от ПДУ)Авария! Ошибка хранения данных.Внимание! Запрещенная частота.Внимание! Нет ответа от вызываемой станции. (пока убрать)Внимание! Файл существует, перезаписать?Внимание! Файл не найден.Внимание! Нет свободного места.

2.2Описание алгоритма отправки команды


2.2.1Назначение и характеристика алгоритма

Данный алгоритм предназначен для создания и отправки команды на устройство. Команда формируется в зависимости от выбранных пользователем данных и типа выбранного режима.


2.2.2Используемая информация

Используемая информация представлена в таблице 2.5.


Таблица 2.5

Используемая информация при отправке команды

Описание информацииТип данныхЧастота приемаFloatЧастота передачиFloatМассив частотFloat[]Найденный портCRS232PortТекущее времяDateTimeОтдельный потокBackgroundWorkerКласс, отвечающий за взаимодействие с портомSerialPort

2.2.3Результаты решения

При отсутствии подключения устройства выдается сообщение «Устройство не подключено».

Если оборудование не опознано выдается сообщение «Устройство не опознано».

В случае сбоя при передаче команды выдается сообщение «Ошибка: <имя команды>».

После успешного завершения отправки команды выдается сообщение «Готово: <имя команды>».


2.2.4Алгоритм решения

Логика алгоритма представлена схематически в виде блок-схемы, представленной на рис. 2.1.


Блок-схема алгоритма отправки команды

Рис. 2.1


2.3Описание алгоритма защиты доступа к программе


2.3.1Назначение и характеристика алгоритма

Данный алгоритм предназначен для защиты доступа к программе и данным, которые были внесены в программу в течение работы с ней. В случае трех попыток неверного ввода пароля оператору должно быть предложено, выполнить вход с использованием пароля «по умолчанию». При использовании оператором пароля «по умолчанию» все файлы ключей, паролей, шаблонов сеансов будут удалены.


2.3.2Используемая информация

Данный алгоритм должен использовать специальный файл, который будет содержать пароль в зашифрованном виде. Так же он имеет доступ к папке, содержащей файл паролей, файлы ключей и шаблонов сеансов.


2.3.3Результаты решения

В результате решения данного алгоритма пользователю будет дан доступ к программе, либо отказано в доступе. В случае входа с паролем «по умолчанию» доступ к программе будет представлен без возможности использования сохраненных файлов.


2.3.4Алгоритм решения

Логика алгоритма представлена схематически в виде блок-схемы, представленной на рис. 2.2.


Блок-схема алгоритма защиты доступа

Рис. 2.2


2.4Описание алгоритма вывода координат


2.4.1Назначение и характеристика алгоритма

Выводит координаты радиостанции, полученные с помощью модуля GPS/Глонасс, подключенного к радиостанции в метрах или градусах.


2.4.2Используемая информация

При запросе координат программа отправляет соответствующую команду на радиостанцию и ждет получения пакета, содержащего координаты радиостанции.

Структура данных запроса координат представлена в таблице 2.6.


Таблица 2.6

Структура данных запроса координат

Тип управленияТип системыТип отображенияКоличество байт121

Тип управления - 0, означает запрос координат;

Тип системы:

-ГЛОНАСС;

-GPS;

-ГЛОНАСС+ GPS;

-GPS+ ГЛОНАСС.

Тип отображения:

-градусы;

-метры.

Структура данных приема координат представлена в таблице 2.7.


Таблица 2.7

Структура данных приема координат

Тип управленияКоординатыКоличество байт150

Тип управления - 2, означает прием координат;

Координаты:

..41 байты координат в градусах;

-45 Х коодината;

знак Х координаты;

-50 - Y коодината;

знак Y координаты.


2.4.3Результаты решения

При отсутствии подключения устройства выдается сообщение «Устройство не подключено».

Если оборудование не опознано выдается сообщение «Устройство не опознано».

В случае ошибки отправки команды выдается сообщение «Ошибка: Запрос координат».

В случае отмены отправки команды выдается сообщение «Отменено: Запрос координат».

После окончания отправки команды выдается сообщение «Готово: Запрос координат».


2.4.4Алгоритм решения

Логика алгоритма представлена схематически в виде блок-схемы, представленной на рис. 2.3.


Блок-схема алгоритма вывода координат

Рис. 2.3


2.5Описание программы формирования команды


2.5.1Функциональное назначение

Программа предназначена для формирования команды, которая впоследствии будет передана на устройство. Данные могут иметь различный размер и порядок в зависимости от команды.


2.5.2Описание информации

Формат команды представлен на рисунке 2.4.

Формат команды

55hСтартКомуОт когоN кадраДлинаИнформацияКонтрольная суммаРис. 2.4


Представленные на рисунке поля имеют следующие значения:

h - байт не несет информации, требуется только для перевода радиостанции в рабочий режим;

Старт - байт начала кадра (7Fh);

Кому - поле показывает, какому устройству предназначен кадр;

От кого - поле показывает, от какого устройства передается кадр;кадра - номер кадра в цикле обмена;

Длина - количество информационных байт;

Информация*- последовательность информационных байт;

Контрольная сумма - контрольная сумма;

*- необязательные поля.


2.5.3Используемые подпрограммы

enumCommand - содержит список всех команд;


2.5.4Описание логики

Логика алгоритма представлена схематически в виде блок-схемы, представленной на рис. 2.5.


Алгоритм формирования команды

Рис. 2.5


2.6Описание контрольного примера


2.6.1Назначение

Данный контрольный пример служит для проверки полноты и корректности работы системы. В ходе выполнения контрольного примера должны быть просмотрены все варианты работы программы.


2.6.2Исходные данные

Для проверки системы просматриваются все её функции и возможные ситуации.


2.6.3Результаты испытания программы

В результате испытания программы на контрольном примере были успешно получены все возможные варианты выходных сообщений.

С точки зрения удобства и комфортности работы программа показала также хорошие характеристики. Необходимая информация предоставляется в наглядном и удобном для использования виде. Интерфейс достаточно прост для освоения неподготовленным пользователем, предварительно получившим представление о предметной области задачи.



ЗАКЛЮЧЕНИЕ

система алгоритм команда программа

В ходе выполнения выпускной квалификационной работы была разработана система автоматизации рабочего места оператора радиостанции. Система предназначена для работы с подключением радиостанции через интерфейс RS-232.

В процессе разработки системы были рассмотрены режимы работы радиостанции, формат передачи данных между компьютером и радиостанцией. Разработаны функции для настройки и запуска режимов радиостанции. Обеспечена функция передачи и получения данных с помощью радиостанции. Разработаны функции формирования данных команд для передачи на радиостанцию. Предусмотрена возможность получения координат радиостанции в метрах или градусах при подключении модуля GPS/Глонасс.

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


СПИСОК ЛИТЕРАТУРЫ


1.Герберт Шилдт. С# Полное руководство. М.: изд-во Издательский дом «Вильямс», 2010г. - 992с.

2.Интернет-ресурс. Последовательный интерфейс RS-232: <#"justify">7.ГОСТ 19.505-79 ЕСПД. Руководство оператора. Требования к содержанию и оформлению.

8.ГОСТ 19.201-78 ЕСПД. Техническое задание. Требования к содержанию и оформлению.

.ГОСТ 19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.


ПРИЛОЖЕНИЕ 1


Тексты ОСНОВНЫХ АЛГАРИТМОВ

П1.1. Текст программы CRS232Port.cs:

using System;System.Collections.Generic;System.IO.Ports;System.Threading;NamotkaLibrary.Protocol;NamotkaLibrary.Protocol.Commands;NamotkaLibrary.Classes

{class CRS232Port : SerialPort

{

#region Delegatesdelegate void OnRecievedEventHandler(CCommand _command);delegate void GetFrameEventHandler(byte[] frame, bool isFrame, bool isCommand);

#endregionList<byte> _cacheBuffer = new List<byte>();enumDevices _iam;List<enumDevices> _iamAccept;bool _killFrameToSend = false;

/// <summary>

/// Очередь на прием кадров

/// </summary>

//private List<CFrame> _ReadFrameQueue = new List<CFrame>();

/// <summary>

/// Очредь на посылку кадров

/// </summary>List<CFrame> _WriteFrameQueue = new List<CFrame>();Thread _ThreadToSend;Thread _ThreadToRead;Thread _ThreadToCommand;byte _IndexFrame;bool isWaitForSend;

/// <summary>

/// Класс конструктор для инициализации порта

/// </summary>

/// <param name="portName">Название порта, например COM1</param>

/// <param name="iam"> Устройство, которому изначально отправляем кадры

/// <param name="iamAccept"> Список устройств, которыми мы можем выступать, и на эти запросы должны откликаться

/// <param name="baundRate">Битрейт, например 9600</param>

/// <param name="parity">Бит четности</param>

/// <param name="dataBits">Бит данных</param>

/// <param name="stopBits">Стоповый бит</param>CRS232Port(string portName, enumDevices iam, List<enumDevices> iamAccept, int baundRate, Parity parity,dataBits, StopBits stopBits)

: base(portName, baundRate, parity, dataBits, stopBits)

{

_iam = iam;

_iamAccept = iamAccept;.Info(string.Format("{0}: Инициализируем", portName));= 1;_timeout = 2560000 / baundRate; //примерно 23 мсек на посылку 256 байт при скорости в 115200 бит= (int) Math.Floor(_timeout);= (int) Math.Floor(_timeout);

//DataReceived += portDataReceived;+= portErrorReceived;+= portPinChanged;.Info(string.Format("{0}: Открываем", portName));.Info(ReadBufferSize.ToString());.Info(WriteBufferSize.ToString());

//DtrEnable = true;= false;= false;

///Инициализируем потоки на примем и итправку кадров();

//Сделано для того, чтобы поток на прием успел подгрузиться раньше отправки. (Для слабых машин)..Threading.Thread.Sleep(300);

_ThreadToSend = new Thread(ThreadToSend);

_ThreadToSend.Name = "Send " + _ThreadToSend.ManagedThreadId;

_ThreadToSend.Start();

_ThreadToRead = new Thread(ThreadToRead);

_ThreadToRead.Name = "Read " + _ThreadToSend.ManagedThreadId;

_ThreadToRead.Start();

}enumDevices Iam

{{ return _iam; }

}List<enumDevices> IamAccept

{{ return _iamAccept; }

}byte IndexFrame

{{ return _IndexFrame; }

}event GetFrameEventHandler onGetFrame;event OnRecievedEventHandler onRecieved;virtual void OnReceived(CCommand _command)

{(onRecieved != null)(_command);

}void UpdateIndex()

{(_IndexFrame == 255)

_IndexFrame = 0;

_IndexFrame += 1;

}

/// <summary>

/// Возвращает значение, жив ли поток на отправку.

/// </summary>

/// <returns></returns>bool ThreadToSend_isAlive()

{(_ThreadToSend.IsAlive)true;false;

}void SetIndex(byte _z)

{

_IndexFrame = _z;

}

/////Временный метод

//public void AddPacket(byte[] buffer)

//{

// var _Frame = new CFrame(buffer);

// _ReadFrameQueue.Add(_Frame);

//}

/// <summary>

/// Включает DTR на время time

/// </summary>

/// <param name="time">время в мс</param>void DTREnable(int time)

{= true;.Sleep(time);= false;

}void DTRDisable(int time)

{= false;.Sleep(time);= true;

}

/// <summary>

/// Закрываем порт

/// </summary>void MyClose()

{(IsOpen)

{.Close();

}

}

/// <summary>

/// Посылаем фрейм

/// </summary>

/// <param name="_Packet"></param>void Send(CFrame _Packet)

{(_WriteFrameQueue)

{(_ThreadToSend.IsAlive)

{

_WriteFrameQueue.Add(_Packet);

}

{

_Packet.State = enumState.Error;

}

}

}

/// <summary>

/// Метод, удаляющий указанный кадр из очереди на отправку

/// </summary>

/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void RemoveTargetFrameToSend(int _PacketNumber)

{

{(_WriteFrameQueue.Count != 0)

{(_PacketNumber < _WriteFrameQueue.Count)

{.Info(string.Format(PortName + ": Удаляем пакет {1}, его номер в очереди: {0}", _PacketNumber.ToString(),_WriteFrameQueue[_PacketNumber].ToString()));

_WriteFrameQueue.RemoveAt(_PacketNumber);

}

{new Exception(string.Format("Пакета с выбранным номером {0} не существует в очереди.", _PacketNumber.ToString()));

}

}

}(Exception _ex)

{.Error(_ex);

}

}

/// <summary>

/// Метод, удаляющий все кадры из очереди на отправку

/// </summary>

/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void ClearWriteFrameQueue()

{

{(_WriteFrameQueue.Count != 0)

{

_WriteFrameQueue.Clear();.Info(PortName + ": Очистили очередь на отправку 1");

}

}(Exception _ex)

{.Error(_ex);

}

}

/// <summary>

/// Метод, прерывающий процесс отправки текущего кадра (Выставляет флаг, который делает пакет, крутящийся в цикле, мертвым)

/// </summary>

/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void KillFrameToSend()

{

{

_killFrameToSend = true;.Info(PortName + ":Убили текущий пакет на отправку");

}(Exception _ex)

{.Error(_ex);

}

}

/// <summary>

/// Метод, удаляющий всю информацию из буффера приема

/// </summary>

/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void ClearReadFrameQueue()

{

{(_cacheBuffer.Count != 0)

{

_cacheBuffer.Clear();.Info(PortName + ": Очистили буффер приема 2");

}

}(Exception _ex)

{.Error(_ex);

}

}

/// <summary>

/// Метод, удаляющий все кадры из очереди на отправку и всю информацию из буффера приема

/// </summary>

/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void ClearAllFrameQueues()

{

{(_WriteFrameQueue.Count != 0)

{

_WriteFrameQueue.Clear();.Info(PortName + ": Очистили очередь на отправку 3" );

}(_cacheBuffer.Count != 0)

{

_cacheBuffer.Clear();.Info(PortName + ": Очистили буффер приема 3");

}

}(Exception _ex)

{.Error(_ex);

}

}

/// <summary>

/// Метод, удаляющий указанный кадр из очереди принятых кадров

/// </summary>

/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>

//public void RemoveTargetReceivedFrame(int _PacketNumber)

//{

// if (_ReadFrameQueue.Count != 0)

// {

// _ReadFrameQueue.RemoveAt(_PacketNumber);

// }

//}

/// <summary>

/// Возвращает CFrame стоящий на посылке.

/// </summary>

/// <returns></returns>CFrame GetCurrentFrameToSend()

{(_WriteFrameQueue.Count == 0)null;_WriteFrameQueue[0];

}

/// <summary>

/// Удаляет CFrame стоящий на посылке.

/// </summary>

/// <returns></returns>void RemoveCurrentFrameToSend()

{(_WriteFrameQueue.Count != 0)

{

_WriteFrameQueue.RemoveAt(0);

}

}

/// <summary>

/// Метод вызыватся, если порт не удалось настроить...

/// Признак того, что надо менять параметры работы порта

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>void portPinChanged(object sender, SerialPinChangedEventArgs e)

{.Info(PortName + ": portPinChanged:" + e);

}

/// <summary>

/// Метод который вызывается когда произошла ошибка при получении данных

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>void portErrorReceived(object sender, SerialErrorReceivedEventArgs e)

{

//Выходим если порт в состоянии закрытия..Info(e.ToString());

}

/// <summary>

/// Метод для чтения данных с порта

/// </summary>void ThreadToCommand(object command)

{_command = (CCommand)command;

{

_command.onCommandReceived();(Global_locks.waitcomplete)

{(_command.Prepare())

{.Info(string.Format("{0}: {1} Попали в execute пришедшей команды", PortName, _command.Name));

_command.Execute();

}

}((_command.Name != "ПРМ") && (_command.Name != "ПРД") && (_command.Name != "Запрос телеметрии")) _command.onCommandCompleted();.Info(string.Format("{0}: Завершение минипотока обработки команды {1}", PortName, _command.Name));

}(Exception _ex)

{

_command.onError();.Error(_ex);

}

}

/// <summary>

/// Метод для чтения данных с порта

/// </summary>void ThreadToRead()

{

//Выходим если порт в состоянии закрытия.(!IsOpen) return;.Info(PortName + ": Поток отвечающий за прием - запущен.");(IsOpen)

{

{bytes = BytesToRead;buffer = new byte[bytes];(buffer, 0, bytes);

_cacheBuffer.AddRange(buffer);(_cacheBuffer.Count > 0)

{(_cacheBuffer.IndexOf(CFrame.VersionFrame) != 1)

{.WriteBytesToLog(PortName + " Ошибка в буфере", _cacheBuffer.ToArray());(_cacheBuffer.IndexOf(CFrame.VersionFrame) < 0)

{

//В буфере по любому должен оставаться идентификатор пакета

//если его нет - то буфер 100% с ошибкой.Info(PortName + ": Очистили буффер приема 4");

_cacheBuffer.Clear();

}

{

_cacheBuffer.RemoveRange(0, _cacheBuffer.IndexOf(CFrame.BeginFrame));

}.WriteBytesToLog(PortName + " Исправленный буфер", _cacheBuffer.ToArray());

}(CFrame.isFrame(_cacheBuffer.ToArray()) && IsOpen)

{[] _frame = CFrame.GetFrame(_cacheBuffer.ToArray());

_cacheBuffer.RemoveRange(0, _frame.Length);.WriteBytesToLog(PortName + ": Выделеный фрейм из буфера:", _frame);isFrame = false;isCommand = false;_Frame = null;_command = null;

{

_Frame = new CFrame(_frame);= true;(_iamAccept.Contains(_Frame.ToDevice))

{

_command = _Frame.Parse();

_command.m_Port = this;

_command.Action = enumAction.Receive;

_command.State = enumState.Receive;

_ThreadToCommand = new Thread(ThreadToCommand);

_ThreadToCommand.Name = "Command " + _ThreadToCommand.ManagedThreadId;

_ThreadToCommand.Start((_command));.Info(string.Format("{0}: Запущен минипоток обработки команды {1}", PortName, _command.Name));= true;(_command);

}

{.Info(PortName + " Пришедший кадр не для меня!");

}

}(Exception innerException)

{.Error(PortName + " Ошибка формирования кадра", innerException);

}(isFrame && !isCommand)

{(_iamAccept.Contains(_Frame.ToDevice))

{

//Отправляем квитанцию только если пришедший кадр для меняticket = CCommand.GetCommand(enumCommand.Ticket);.TimeOutToSend = 0; //не ждать ответа вообще..Action = enumAction.Send;.Send(this, _Frame.FromDevice, _Frame.ToDevice, _Frame.Index, ticket);

}

}(onGetFrame != null)

{(_frame, isFrame, isCommand);

}.Sleep(1);.Info(string.Format("{0}: Поток обработки команды {1} завершен", PortName, _command.Name));

}

}

}(TimeoutException)

{.Warning(PortName + ": Время ожидания истекло!");

}

{.Warning(PortName + ": Ошибка!");

}.Sleep(ReadTimeout);

}.Info(string.Format("{0}: Поток, отвечающий за прием кадров, завершен!\n", PortName));

}

/// <summary>

/// Метод, работающий в потоке и отсылающий пакетв по очереди

/// </summary>void ThreadToSend()

{

//Выходим если порт в состоянии закрытия.(!IsOpen) return;.Info(PortName + ": Поток отвечающий за отправку - запущен.");(IsOpen)

{

_killFrameToSend = false;(_WriteFrameQueue.Count > 0 && IsOpen)

{

_killFrameToSend = false;_packet = _WriteFrameQueue[0];

{_timeout = 0;(

!_packet.isDead

&& _packet.State != enumState.Error

&& (int)_packet.TimeOutStep >= _timeout

&& IsOpen)

{(_packet.State)

{enumState.Busy:

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

}.Warning(.Format("{1}: Кадр {0}: Устройство занято обработкой данных. Ждем цикл.", _packet.Index, PortName));.Info(.Format("{2}: Кадр {0}: Ожидания подтверждения {1} msec.", _packet.Index, (int)_packet.TimeOutStep,));

_timeout = 0;;enumState.TicketReceived:

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

}.Info(string.Format("{2}: Кадр {0}: Попали в статус TicketReceived.{1} msec.", _packet.Index, (int)_packet.TimeOutStep, PortName));(_packet.State != enumState.DoneReceived)

_packet.onTicketReceived();

_timeout = (int)_packet.TimeOutStep + 10;(_packet.State != enumState.DoneReceived)

_packet.State = enumState.DoneWaiting;;enumState.DoneWaiting:

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

}.Info(string.Format("{2}: Кадр {0}: Попали в статус DoneWaiting. {1} msec.", _packet.Index, (int)_packet.TimeOutStep, PortName));

//TODO: Разкомментарить, когда найду баг, почему не проставляется статус DoneRecieved иногда при приходе "Готово".

/*if ((int)_packet.TimeOutStep == _timeout)

{

_packet.CountTryToSend += 1;(!_packet.isDead && this.IsOpen)

{(_packet.Packet, 0, _packet.Packet.Length);.WriteBytesToLog(PortName + ": Послан фрейм(retry):", _packet.Packet);.Info(string.Format("{2}: Кадр {0}: Послан ожидаем ответ от устройства.(Попытка {1})", _packet.Index,

_packet.CountTryToSend, PortName));

_timeout = 0;

_packet.onDoneWaiting();

}

}*/;enumState.DoneReceived:

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

}.Info(string.Format("Кадр {0}: Попали в статус DoneReceived.", _packet.Index));

_packet.onCompleteReceived();

_timeout = (int)_packet.TimeOutStep + 10;;enumState.Error:

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

}

_packet.onError();

_timeout = (int)_packet.TimeOutStep + 10;;enumState.Sended:

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

}((int)_packet.TimeOutStep == _timeout)

{

_packet.CountTryToSend += 1;(!_packet.isDead && this.IsOpen)

{(_packet.Packet, 0, _packet.Packet.Length);.WriteBytesToLog(PortName + ": Послан фрейм(retry):", _packet.Packet);.Info(string.Format("{2}: Кадр {0}: Послан ожидаем ответ от устройства.(Попытка {1})", _packet.Index,

_packet.CountTryToSend, PortName));

_timeout = 0;

_packet.onSended();

}

};enumState.Send:

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

}

///-------------(!CFrame.isFrame(_cacheBuffer.ToArray()))

{

_packet.CountTryToSend += 1;(!_packet.isDead && this.IsOpen)

{

_packet.onSend();(_packet.Packet, 0, _packet.Packet.Length);

_packet.State = enumState.Sended;.WriteBytesToLog(PortName + ": Послан фрейм(1):", _packet.Packet);.Info(string.Format("{2}: Кадр {0}: Послан ожидаем ответ от устройства.(Попытка {1})", _packet.Index,

_packet.CountTryToSend, PortName));

_timeout = 0;((int)_packet.TimeOutStep == 0)

{

//Говорит о том, что надо выйти из цикла

_timeout = (int)_packet.TimeOutStep + 10;

}

//_packet.onSend();

//_packet.State = enumState.Sended;

}

}

{.Info(string.Format("{1}: Кадр {0}: не послан так как буфер приема не обработан.", _packet.Index, PortName));

}

///--------------;:

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

};

}

_timeout += 10;.Info(string.Format("{1}: Ожидаем {0}, {2}", _timeout, PortName, _packet.Command.Name));

//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)

{

_killFrameToSend = false;

_packet.isDead = true;

}.Sleep(10);

}

}(TimeoutException e)

{.Error(.Format("{1}: Кадр {0}: Время ожидания на посылку кадра истекло. ", _packet.Index, PortName), e);

_packet.State = enumState.Error;

_packet.onError();

}(Exception _ex)

{

//TODO: 1+1ин раз при онлайн смене устройств обмена, сюда пришло packet = null. Проверить, отдебажить..Error(.Format("{1}: Кадр {0}: Возникла неизвестная ошибка при посылке кадра.", _packet.Index, PortName),

_ex);

_packet.State = enumState.Error;

_packet.onError();

}

/*finally

{(_WriteFrameQueue)

{(_WriteFrameQueue.Count > 0)

{.Info(string.Format("{1}: Кадр {0}: Удаляем кадр из очереди", _packet.Index, PortName));

//Гарантирует что удаляется именно тот пакет, который обрабатывали

_WriteFrameQueue.Remove(_packet);

}

}

}*/

}

//Усыпляем поток - состояние ожидания.Sleep(10);

}.Info(string.Format("{0}: Поток, отвечающий за отправку кадров, завершен!\n", PortName));

}

}

}

П1.2. Текст программы CComand.csSystem;System.Collections.Generic;System.Text;System.Threading;NamotkaLibrary.Classes;NamotkaLibrary.Protocol.Commands;NamotkaLibrary.Protocol

{delegate void CCommandErrorEventHandler(Object sender, string error);delegate void DoneAndOutEventHandler(Object sender, EventArgs e);class CCommand : ICommand

{static event CCommandErrorEventHandler onErrorReceived;virtual string Name

{

{"Нет имени";

}

}virtual void OnErrorReceivedCCommand(string error)

{(onErrorReceived != null)(this, error);

}

//Вычтвыляется если необходимо подтверждение командыbool CompleteRequired { get; set; }


//Время ожидания подтверждения командыuint CompleteRequiredTime { get; set; }_lockFrame = new object();

#region onTicketReceived() Реакция на пришежший тикет для фрейма командыvirtual void onTicketReceived()

{(Global_locks.waitcomplete)

{

//TODO: Именно тут перебивался когда-то статус DoneReceived на TicketReceived.Info(string.Format(m_Port.PortName + ": {0} 4 Выставляем статус TicketReceived", this.Name));(State != enumState.DoneReceived)= enumState.TicketReceived;

{.Info(string.Format(

"{1}: {2} : Кадр {0}: Подтвержден квитанцией",

_Frames[0].Index, m_Port.PortName, _Frames[0].Command.Name));(CompleteRequired)

{

_Frames[0].TimeOutStep = CompleteRequiredTime;

}

{.Info(string.Format("{1}: {2} : Кадр {0}: Удаляем из очереди",_Frames[0].Index, m_Port.PortName, _Frames[0].Command.Name));(_lockFrame)

{

_Frames.RemoveAt(0);_Port.RemoveTargetFrameToSend(0);

}(_Frames.Count > 0)

{(m_Port);

}

};

}(Exception _ex)

{.Error(_ex);

}

}

}

#endregion

#region onCompleteReceived()Реакция на пришедший "Готово" для фрейма командыvirtual void onCompleteReceived()

{(Global_locks.waitcomplete)

{.Info(string.Format(m_Port.PortName + ": {0} 3 Выставляем статус DoneReceived", this.Name));= enumState.DoneReceived;

{(_Frames.Count > 0)

{.Info(string.Format("{1}: {2} :Кадр {0}: Подтвержден командой готово",

_Frames[0].Index, m_Port.PortName, _Frames[0].Command.Name));(_lockFrame)

{.Info(string.Format(m_Port.PortName + ": {0} 4 Выставляем статус DoneReceived", this.Name));

_Frames[0].State = enumState.DoneReceived;.Info(string.Format(m_Port.PortName + ": Удаляем пакет {0}", _Frames[0].ToString()));

_Frames.RemoveAt(0);_Port.RemoveTargetFrameToSend(0);

}(_Frames.Count > 0)

{(m_Port);

}

};

}(Exception _ex)

{.Error(_ex);

}

}

}

#endregion Реакция на пришедший "Готово" для фрейма команды

#region onError()Реакиця на ошибку внутри фрейма командыvirtual void onError()

{.Info(string.Format("{0}: Ошибка - команда не выполнена.", m_Port.PortName));LastState = State;= enumState.Error;

{(_lockFrame)

{.Info(m_Port.PortName + ": Реакиця на ошибку внутри фрейма команды. Очистили лист CFrame 1");

_Frames.Clear();

}(_Frames.Count > 0)

{(string.Format("{0}: Ошибка команды: '{1}', статус: {2}", m_Port.PortName, _Frames[0].Command.Name, LastState.ToString(), Code[0].ToString()));new Exception(string.Format("{0}: Ошибка команды: '{1}', статус: {2}", m_Port.PortName, _Frames[0].Command.Name, LastState.ToString(), Code[0].ToString()));

}

{(string.Format("{0}: Ошибка команды: '{1}', статус: {2}", m_Port.PortName, Name, LastState.ToString(),Code[0].ToString()));new Exception(string.Format("{0}: Ошибка команды: '{1}', статус: {2}", m_Port.PortName, Name, LastState.ToString(), Code[0].ToString()));

}

}(Exception _ex)

{.Error(_ex);

}

}

#endregion

#region onSended()Реакция после отправкиvirtual void onSended()

{(_Frames.Count > 0).Info(.Format("{1}: Кадр {0}: Кадр отправлен.",

_Frames[0].Index, m_Port.PortName));

}

#endregion

#region onDoneWaiting()virtual void onDoneWaiting()

{(_Frames.Count > 0).Info(.Format("{1}: Кадр {0}: Кадр ожидает команду готово.",

_Frames[0].Index, m_Port.PortName));

}

#endregion

#region onSend()Реакция до отправкиvirtual void onSend()

{(_Frames.Count > 0).Info(.Format("{1}: Кадр {0}: Кадр готов к отправке.",

_Frames[0].Index, m_Port.PortName));

}

#endregion

//Посылка тикета в ответ на принятую команду.virtual void onCommandReceived()

{(this);.Info(string.Format("Отправили квитанцию на команду: {0}", this.Name));

}

//Посылка готово в ответ на обработанную команду.virtual void onCommandCompleted()

{

//lock (_lockFrame)

//{

// m_Port.RemoveTargetReceivedFrame(0);

//}(this);.Info(string.Format("Отправлена 'Готово' на команду: {0}", this.Name));

}

/// <summary>

/// Статический список команд и их обработчиков

/// </summary>static readonly Dictionary<enumCommand, Type> _CommandList

= new Dictionary<enumCommand, Type>();

/// <summary>

/// Действие, которое выполняет комманда

/// </summary>enumAction _Action = enumAction.Unknown;

/// <summary>

/// Представление тела коммадны

/// </summary>byte[] _Body;

/// <summary>

/// Код команды (смотри документацию)

/// </summary>byte[] _Code;

/// <summary>

/// Блок данных команды

/// </summary>byte[] _Data;List<CFrame> _Frames;enumDevices _fromDevice;byte _MaxTryToSend;

/// <summary>

/// Состояние команды в текущйи момент

/// </summary>enumState _State = enumState.Initialize;UInt32 _TimeOutToSend;enumDevices _toDevice;CCommand()

{= false;= 0;

}

/// <summary>

/// Конструктор для экземпляра команды

/// </summary>

/// <param name="indexCommand"></param>CCommand(enumCommand indexCommand)

{= false;= 0;(indexCommand != enumCommand.Ticket)

{

_Code = new byte[1];[0] = (byte) indexCommand;= null;

}

}bool AnyTargetDevice { get; set; }UInt32 TimeOutToSend

{{ _TimeOutToSend = value; }{ return _TimeOutToSend; }

}byte MaxTryToSend

{{ return _MaxTryToSend; }{ _MaxTryToSend = value; }

}enumDevices toDevice

{{ return _toDevice; }{ _toDevice = value; }

}enumDevices fromDevice

{{ return _fromDevice; }{ _fromDevice = value; }

}byte[] Data

{{ return _Data; }

{

_Data = value;

_Body = null;

}

}byte[] Body

{

{(_Body == null)

{_length = (_Code != null ? _Code.Length : 0) + (_Data != null ? _Data.Length : 0);(_length > 0)

{

_Body = new byte[_length];

_Body[0] = _Code[0];(_Data != null)(byte i = 0; i < (byte) _Data.Length; i++)

_Body[i + 1] = _Data[i];

}

}_Body;

}

}object[] Params { get; set; }

#region ICommand MembersCFrame Ticket { get; set; }List<CFrame> Frames

{{ return _Frames; }{ _Frames = value; }

}CRS232Port m_Port { get; set; }enumState State

{{ return _State; }{ _State = value; }

}enumAction Action

{{ return _Action; }{ _Action = value; }

}byte[] Code

{{ return _Code; }

{(_Code == null)

_Code = new byte[1];

_Code = value;

}

}

/// <summary>

/// Подготовка команды на осное полученого фрейма

/// </summary>

/// <param name="_Frame"></param>

/// <param name="_Command"></param>virtual bool Prepare(CFrame _Frame, byte[] _Command)

{true;

}

/// <summary>

/// Подготовка команды

/// </summary>

/// <param name="toDevice">к какому устройству</param>

/// <param name="fromDevice">от какого устройства</param>

/// <returns></returns>virtual bool Prepare(enumDevices toDevice, enumDevices fromDevice)

{

_toDevice = toDevice;

_fromDevice = fromDevice;Prepare();

}

/// <summary>

/// Запуск комманды на выполнение

/// </summary>virtual bool Execute()

{.Info(string.Format("{0}: {1}:Base Execute.", this.m_Port.PortName, this.Name));true;

}

/// <summary>

/// Подготовка команды

/// в зависемости от вбранного действия и состояния

/// Подготовка собирает команду и разбивает ее на фреймы.

/// </summary>virtual bool Prepare()

{true;

}

/// <summary>

/// Посылка подготовленой команды

/// Посылка может осуществляться несколькими фреймами

/// </summary>

/// <returns></returns>virtual bool Send(CRS232Port _Port)

{(_Frames.Count > 0 && _Port.IsOpen)

{

_Frames[0].Index = _Port.IndexFrame;

_Port.UpdateIndex();

_Frames[0].State = enumState.Send;_Port = _Port;_Port.Send(_Frames[0]);true;

}false;

}

#endregionstatic void initialize()

{

_CommandList.Add(enumCommand.Empty, typeof (cmdEmpty));

_CommandList.Add(enumCommand.WriteROM, typeof (cmdWriteROM));

_CommandList.Add(enumCommand.ProgramMode, typeof (cmdProgramMode));

_CommandList.Add(enumCommand.EndCycle, typeof (cmdTicket));

_CommandList.Add(enumCommand.ClearROM, typeof (cmdClearROM));

_CommandList.Add(enumCommand.CheckROM, typeof (cmdCheckROM));

_CommandList.Add(enumCommand.Complete, typeof (cmdComplete));

_CommandList.Add(enumCommand.Ticket, typeof (cmdTicket));

_CommandList.Add(enumCommand.Data, typeof (cmdData));

_CommandList.Add(enumCommand.DataEnd, typeof(cmdDataEnd));

_CommandList.Add(enumCommand.Message, typeof (cmdMessage));

_CommandList.Add(enumCommand.Version, typeof (cmdVersion));

_CommandList.Add(enumCommand.Testing, typeof (cmdTesting));

_CommandList.Add(enumCommand.Unknown, typeof (cmdUnknown));

_CommandList.Add(enumCommand.FileStart, typeof(cmdFileStart));

_CommandList.Add(enumCommand.FileHeader, typeof(cmdFileHeader));

_CommandList.Add(enumCommand.SessionResult, typeof(cmdSessionResult));

_CommandList.Add(enumCommand.StartSession, typeof(cmdStartSession));

_CommandList.Add(enumCommand.WriteFile, typeof(cmdWriteFile));

_CommandList.Add(enumCommand.WriteFileSend, typeof(cmdWriteFileSend));

_CommandList.Add(enumCommand.FormatFlash, typeof(cmdFormatFlash));

_CommandList.Add(enumCommand.ReadFile, typeof(cmdReadFile));

_CommandList.Add(enumCommand.ReadFileRecieve, typeof(cmdReadFileRecieve));

_CommandList.Add(enumCommand.TimeInstall, typeof(cmdTime));

_CommandList.Add(enumCommand.StartMode, typeof(cmdStartMode));

_CommandList.Add(enumCommand.ModeControl, typeof(cmdModeControl));

_CommandList.Add(enumCommand.DirectoryRequest, typeof(cmdDirectoryRequest));

_CommandList.Add(enumCommand.Control, typeof(cmdControl));

_CommandList.Add(enumCommand.Crash, typeof(cmdCrash));

_CommandList.Add(enumCommand.DataReceived, typeof(cmdDataReceived));

_CommandList.Add(enumCommand.TurnOff, typeof(cmdTurnOff));

_CommandList.Add(enumCommand.DKMChar, typeof(cmdDKMChar));

_CommandList.Add(enumCommand.MSK128Power, typeof(cmdMSK128Power));

_CommandList.Add(enumCommand.ModeInfo, typeof(cmdModeInfo));

_CommandList.Add(enumCommand.ReTune, typeof(cmdReTune));

_CommandList.Add(enumCommand.C1TCHR, typeof(cmdC1TCHR));

_CommandList.Add(enumCommand.GetCoord, typeof(cmdCoord));

_CommandList.Add(enumCommand.RecVoice, typeof(cmdRecVoice));

_CommandList.Add(enumCommand.RecLengthReq, typeof(cmdRecLengthReq));

_CommandList.Add(enumCommand.RecLength, typeof(cmdRecLength));

_CommandList.Add(enumCommand.CallRecieve, typeof(cmdCallRecieve));

_CommandList.Add(enumCommand.CallSend, typeof(cmdCallSend));

_CommandList.Add(enumCommand.TangetKey, typeof(cmdTangetKey));

_CommandList.Add(enumCommand.WriteProtocol, typeof(cmdWriteProtocol));

_CommandList.Add(enumCommand.PlayVoice, typeof(cmdPlayVoice));

_CommandList.Add(enumCommand.Telemet, typeof(cmdTelemet));

_CommandList.Add(enumCommand.Bluetooth, typeof(cmdBluetooth));

}

/// <summary>

/// Создает команду по ее номеру

/// </summary>

/// <param name="_indexCommand"></param>

/// <returns></returns>static CCommand GetCommand(enumCommand _indexCommand)

{(_CommandList.ContainsKey(_indexCommand))

{t = _CommandList[_indexCommand];(CCommand) Activator.CreateInstance(t);

}(onErrorReceived != null)(null, string.Format("Команда с индексом {0} не найдена!", _indexCommand.ToString())); //ъотели заменить на следующую строку

//OnErrorReceivedCCommand(string.Format("Команда с индексом {0} не найдена!", _indexCommand.ToString()));new CException("Команда не найдена!");

}

/// <summary>

/// получаем данные с определенного байта и определенное количество

/// </summary>

/// <param name="body"></param>

/// <param name="from"></param>

/// <param name="count"></param>

/// <returns></returns>static byte[] GetData(byte[] body, int from, int count)

{(body.Length < from + count)

{new byte[0];

}[] _body = new byte[count];(byte i = 0; i < count; i++)

_body[i] = body[i+from];_body;

}

/// <summary>

/// Посылка подготовленой команды

/// Посылка может осуществляться несколькими фреймами

/// </summary>

/// <returns></returns>virtual bool Send(CRS232Port _Port, byte? index)

{(_Frames.Count > 0 && _Port.IsOpen)

{(index != null)

{

_Frames[0].Index = index;

}

{

_Frames[0].Index = _Port.IndexFrame;

_Port.UpdateIndex();

}

_Frames[0].State = enumState.Send;_Port = _Port;_Port.Send(_Frames[0]);true;

}false;

}static bool sendTicket(CCommand _command)

{.Info(_command.m_Port.PortName + ": Посылка тикета для команды " + _command.Name);sendTicket(_command.m_Port, _command._Frames[0].FromDevice, _command._Frames[0].ToDevice, _command._Frames[0].Index, _command);

}static bool sendTicket(CRS232Port _port, enumDevices _to, enumDevices _from, byte? _Index, CCommand _command)

{

{_packetInQueue = _port.GetCurrentFrameToSend();(_packetInQueue == null)

{.Info(_port.PortName + ": Не найден кадр на который отправляем подтверждение.");

//return false;

}ticket = CCommand.GetCommand(enumCommand.Ticket);.TimeOutToSend = 0; //не ждать ответа вообще..MaxTryToSend = 0;.CompleteRequired = false;.CompleteRequiredTime = 0;.Action = enumAction.Send;.Send(_port, _to, _from, _Index, ticket);

}(Exception _ex)

{.Error(_ex);

}true;

}static bool sendComplete(CCommand _command)

{.Info(_command.m_Port.PortName + ": Посылка готово для команды " + _command.Name);sendComplete(_command.m_Port, _command.fromDevice, _command.toDevice, null);

}static bool sendComplete(CRS232Port _port, enumDevices _to, enumDevices _from, byte? _Index)

{cmdComplete = (cmdComplete)CCommand.GetCommand(enumCommand.Complete);.Action = enumAction.Send;.State = enumState.Initialize;.TimeOutToSend = 300;.MaxTryToSend = 3;.CompleteRequired = false;.CompleteRequiredTime = 0;.Data = new byte[3];.Data[0] = 0;.Data[1] = 0;.Data[2] = 0;

_Index++;.Send(_port, _to, _from, _Index, cmdComplete);

//ChangeStatus("Посылаем команду 'Готово', в ответ на команду 'Данные'.");_wait = true;

{(_wait)

{(cmdComplete.State)

{enumState.TicketReceived:

//ChangeStatus.CurrentStatus = "Получена квитанция на команду 'Готово'.";

_wait = false;;enumState.Error:

//ChangeStatus.CurrentStatus = "Ошибка: На команду 'Готово' не пришла квитанция.";

//TODO: Сделать обработку этого места и вывод события!!!! Иначе тут валится!.onError();(onErrorReceived != null)(null, string.Format("Ошибка: На команду {0}, {1}, не пришла квитанция.", cmdComplete.Frames[0].Index.ToString(), cmdComplete.Name)); // хотели заменить на следующую строку

//OnErrorReceivedCCommand(string.Format("Ошибка: На команду {0}, {1}, не пришла квитанция.", _Index.ToString(), cmdComplete.Name));new Exception(string.Format("Ошибка: На команду {0}, {1}, не пришла квитанция.", cmdComplete.Frames[0].Index.ToString(), cmdComplete.Name));;:.Threading.Thread.Sleep(1);;

}

}

}(Exception _ex)

{.Error(_ex);

}true;

}

}

}

ПРИЛОЖЕНИЕ 2


РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММ


Интерфейс ввода пароля

Рис.П.2.1


Ошибка ввода пароля

Рис.П.2.2



Сообщение при трехкратном ошибочном вводе пароля

Рис.П.2.3


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


Режим ТЛФ

Рис.П.2.4


Режим ТЛГ

Рис.П.2.5


Режим УКВ

Рис.П.2.6


Режим Сервис

Рис.П.2.7


Режим Глонасс

Рис.П.2.8


Установка частот

Рис.П.2.9


ПРИЛОЖЕНИЕ 3


РУКОВОДСТВО ОПЕРАТОРА

П. 3.1. Назначение программы

Программа предназначена для автоматизации работы оператора радиостанции.

Программа предназначена для выполнения следующих функций:

Запуск и настройка режимов работы радиостанции;

Передача и получение произвольных данных размером не более 32кб;

Получение координат в метрах или градусах, при подключении к радиостанции модуля GPS/Глонасс;

П.3.2. Условия применения программы

Требования к техническому обеспечению рабочего места пользователя системы:

)Изделие Намотка - КС

)ПК со следующими минимальными характеристиками:

а) процессор с частотой 1 ГГц и выше;

б) объем ОЗУ 512 МБ;

в) свободное пространство на жестком диске не менее 100 МБ;

г) видеокарта обеспечивающая разрешение не хуже 800x600x16;

д) наличие последовательного порта с интерфейсом RS-232;

е) Монитор;

ж) клавиатура;

з) мышь.

П.3.3. Пуск программы

Запуск программы происходит при запуске файла SPOPO.EXE.

П.3.4. Команды оператора

Для запуска программы необходимо ввести пароль (форма ввода пароля представлена на рис. П.3.1) после чего будет доступна для работы основная форма программы(основная форма программы представлена на рис. П.3.3). Если отсутствует подключение радиостанции к ПК, то возможно осуществлять работу в автономном режиме.


Форма ввода пароля

Рис.П.3.1


Для начала работы необходимо выбрать одну из вкладок, и в выбранной вкладке произвести настройку режима в соответствии с необходимыми условиями.

Частоты приема/передачи для КВ диапазона вводятся с шагом 0,1 кГц в диапазоне от 2 до 29999,9 кГц. В противном случае выводиться предупреждающая надпись и предлагается правильно повторить ввод частот.

Частоты приема/передачи для УКВ диапазона вводятся с шагом 12,5 КГц в диапазоне 52-82 МГц и 100-174 МГц. В противном случае выводиться предупреждающая надпись и предлагается правильно повторить ввод частот.

При выборе «ЗПЧ» окна ПРМ и ПРД становятся неактивными. Предлагается ввести номер ЗПЧ в диапазоне 1-64 как показано на рис. П.3.2. При нажатии кнопки «Установить» происходит настройка приемо-передатчика на введенные значения частот.

Установка частот ЗПЧ

Рис.П.3.2


Основная форма программы

Рис.П.3.3


Для вывода координат радиостанции необходимо нажать кнопку «Запрос координат» на вкладке Глонасс(вкладка Глонасс показана на рис.П.3.4).


Вкладка Глонасс

Рис.П.3.4


П.3.5. Сообщения оператору

Сообщения, выдаваемые при работе программы, и необходимая реакция на них описана в таблице П.3.1.


Таблица П.3.1

Сообщения оператору

СообщениеДействиеУстройство не подключеноПроверить подключение устройстваУстройство не опознаноПроверить модель устройства в соответствии с требованиямиВведен неверный парольВвести пароль сноваПароль введен неверно, войти со стандартным паролемВойти с верным паролем, либо войти в режим «по умолчанию»


ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к выпускной квалификационной работе на тему: «АРМ оператора радиостанции»

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ