![](/_landing/img/webp/top-img2.webp)
на первый
заказ
Решение задач на тему: Целью создания системы является автоматизация работы с радиостанцией при подключении её к
Купить за 100 руб.Введение
Наше время - это время простого общения через интернет. Нажимаешь на кнопку, и Ваше сообщение отправлено без малейшего звука. Пара нажатий клавиш на сотовом телефоне и вы говорите с человеком на другой стороне земли. Именно поэтому привлекательность человеческого общения через связь на коротких волнах сегодня велика как никогда.Но что делать, если вы отправились в поход в горы или любую другую, далёкую от цивилизации местность, где сотовая связь не имеет доступа и вы отрезаны от внешнего мира? Даже спутниковая связь не всегда позволяет осуществить звонок. В подобном случае связь с помощью коротковолновой радиостанции просто незаменима.
Использование тяжелых стационарных радиостанций высокой мощности имеет большое значение для различных спецслужб и военных. Для них качественная и быстрая связь имеет огромное значение. Поэтому современный радист должен с легкостью управляться со всем комплексом различной радиоаппаратуры, а объединение всех её функций в одной программе на компьютере должно значительно упростить работу.
Оглавление
- Введение- Разработка арм оператора радиостанции
- Обоснование целесообразности разработки системы
- Назначение объекта автоматизации
- Обоснование цели создания системы
- Обоснование состава автоматизируемых задач
- Аналитический обзор
- Основные требования к системе
- Цель создания системы и критерии эффективности её функционирования
- Функциональное назначение системы
- Требование к функциональной структуре системы
- Состав типовых проектных решений и пакетов прикладных программ, применяемых в системе
- Требования к техническому обеспечению
- Требования к информационному обеспечению
- Требования к программному обеспечению
- Перспективность системы, возможность ее развития
- Основные технические решения проекта системы
- Описание системы программного обеспечения
- Разработка арм оператора радиостанции
- Описание постановки задачи
- Характеристика задачи
- Входная информация
- Выходная информация
- Описание алгоритма отправки команды
- Назначение и характеристика алгоритма
- Используемая информация
- Результаты решения
- Алгоритм решения
- Описание алгоритма защиты доступа к программе
- Назначение и характеристика алгоритма
- Используемая информация
- Результаты решения
- Алгоритм решения
- Описание алгоритма вывода координат
- Назначение и характеристика алгоритма
- Используемая информация
- Результаты решения
- Алгоритм решения
- Описание программы формирования команды
- Функциональное назначение
- Описание информации
- Используемые подпрограммы
- Описание логики
- Описание контрольного примера
- Назначение
- Исходные данные
- Результаты испытания программы ЗАКЛЮЧЕНИЕ
- Список литературы
- Приложение 1 тексты основных алгаритмов
- Приложение 2 результаты работы программ
- Приложение 3 руководство оператора
Список литературы
1. Герберт Шилдт. С# Полное руководство. М.: изд-во Издательский дом "Вильямс", 2010г. - 992с.2. Интернет-ресурс. Последовательный интерфейс RS-232: <http://www.gaw.ru/>
. Интернет-ресурс. Работа с RS-232 портом в С#: <http://www.vr-online.ru/>
. Сенилов М. А., Архипов И. О., Соболева В.П. Методические указания по выполнению выпускной работы бакалавра. Направление 230100.62 "Информатика и вычислительная техника" для студентов кафедры "Программное обеспечение" - Ижевск: Издательство ИжГТУ, 2010г. - 20с.
. Соболева В.П. Методические указания по оформлению курсовых и дипломных работ. - Ижевск: Изд-во ИжГТУ, 2008.- 25с.
. ГОСТ 19.404-79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению.
7. ГОСТ 19.505-79 ЕСПД. Руководство оператора. Требования к содержанию и оформлению.
8. ГОСТ 19.201-78 ЕСПД. Техническое задание. Требования к содержанию и оформлению.
. ГОСТ 19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.
ПРИЛОЖЕНИЕ 1
Тексты ОСНОВНЫХ АЛГАРИТМОВ
П1.1. Текст программы CRS232Port.сs:
/// Очередь на прием кадров
/// Очредь на посылку кадров
/// Класс конструктор для инициализации порта
/// <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)
_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());
///Инициализируем потоки на примем и итправку кадров();
//Сделано для того, чтобы поток на прием успел подгрузиться раньше отправки. (Для слабых машин)..Threading.Thread.Sleep(300);
/// Возвращает значение, жив ли поток на отправку.
/////Временный метод
/// Включает DTR на время time
/// <param name="time">время в мс</param>void DTREnable(int time)
/// Закрываем порт
/// Посылаем фрейм
/// Метод, удаляющий указанный кадр из очереди на отправку
/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void RemoveTargetFrameToSend(int _PacketNumber)
{.Info(string.Format(PortName + ": Удаляем пакет {1}, его номер в очереди: {0}", _PacketNumber.ToString(),_WriteFrameQueue[_PacketNumber].ToString()));
{new Exception(string.Format("Пакета с выбранным номером {0} не существует в очереди.", _PacketNumber.ToString()));
/// Метод, удаляющий все кадры из очереди на отправку
/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void ClearWriteFrameQueue()
_WriteFrameQueue.Clear();.Info(PortName + ": Очистили очередь на отправку 1");
/// Метод, прерывающий процесс отправки текущего кадра (Выставляет флаг, который делает пакет, крутящийся в цикле, мертвым)
/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void KillFrameToSend()
_killFrameToSend = true;.Info(PortName + ":Убили текущий пакет на отправку");
/// Метод, удаляющий всю информацию из буффера приема
/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void ClearReadFrameQueue()
_cacheBuffer.Clear();.Info(PortName + ": Очистили буффер приема 2");
/// Метод, удаляющий все кадры из очереди на отправку и всю информацию из буффера приема
/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>void ClearAllFrameQueues()
_WriteFrameQueue.Clear();.Info(PortName + ": Очистили очередь на отправку 3" );
_cacheBuffer.Clear();.Info(PortName + ": Очистили буффер приема 3");
/// Метод, удаляющий указанный кадр из очереди принятых кадров
/// <param name="_PacketNumber">Номер пакета из списка, который нужно удалить</param>
/// Возвращает CFrame стоящий на посылке.
/// Удаляет CFrame стоящий на посылке.
/// Метод вызыватся, если порт не удалось настроить...
/// Признак того, что надо менять параметры работы порта
/// Метод который вызывается когда произошла ошибка при получении данных
//Выходим если порт в состоянии закрытия..Info(е.ToString());
/// Метод для чтения данных с порта
{.Info(string.Format("{0}: {1} Попали в execute пришедшей команды", PortName, _command.Name));
}((_command.Name != "ПРМ") && (_command.Name != "ПРД") && (_command.Name != "Запрос телеметрии")) _command.onCommandCompleted();.Info(string.Format("{0}: Завершение минипотока обработки команды {1}", PortName, _command.Name));
/// Метод для чтения данных с порта
//Выходим если порт в состоянии закрытия.(!IsOpen) return;.Info(PortName + ": Поток отвечающий за прием - запущен.");(IsOpen)
{.WriteBytesToLog(PortName + " Ошибка в буфере", _cacheBuffer.ToArray());(_cacheBuffer.IndexOf(CFrame.VersionFrame) < 0)
//В буфере по любому должен оставаться идентификатор пакета
//если его нет - то буфер 100% с ошибкой.Info(PortName + ": Очистили буффер приема 4");
}.WriteBytesToLog(PortName + " Исправленный буфер", _cacheBuffer.ToArray());
_cacheBuffer.RemoveRange(0, _frame.Length);.WriteBytesToLog(PortName + ": Выделеный фрейм из буфера:", _frame);isFrame = false;isCommand = false;_Frame = null;_command = null;
_ThreadToCommand.Start((_command));.Info(string.Format("{0}: Запущен минипоток обработки команды {1}", PortName, _command.Name));= true;(_command);
{.Info(PortName + " Пришедший кадр не для меня!");
{.Error(PortName + " Ошибка формирования кадра", innerException);
//Отправляем квитанцию только если пришедший кадр для меняticket = CCommand.GetCommand(enumCommand.Ticket);.TimeOutToSend = 0; //не ждать ответа вообще..Action = enumAction.Send;.Send(this, _Frame.FromDevice, _Frame.ToDevice, _Frame.Index, ticket);
}.Sleep(1);.Info(string.Format("{0}: Поток обработки команды {1} завершен", PortName, _command.Name));
{.Warning(PortName + ": Время ожидания истекло!");
{.Warning(PortName + ": Ошибка!");
}.Info(string.Format("{0}: Поток, отвечающий за прием кадров, завершен!\n", PortName));
/// Метод, работающий в потоке и отсылающий пакетв по очереди
//Выходим если порт в состоянии закрытия.(!IsOpen) return;.Info(PortName + ": Поток отвечающий за отправку - запущен.");(IsOpen)
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
}.Warning(.Format("{1}: Кадр {0}: Устройство занято обработкой данных. Ждем цикл.", _packet.Index, PortName));.Info(.Format("{2}: Кадр {0}: Ожидания подтверждения {1} msec.", _packet.Index, (int)_packet.TimeOutStep,));
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
}.Info(string.Format("{2}: Кадр {0}: Попали в статус TicketReceived.{1} msec.", _packet.Index, (int)_packet.TimeOutStep, PortName));(_packet.State != enumState.DoneReceived)
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
}.Info(string.Format("{2}: Кадр {0}: Попали в статус DoneWaiting. {1} msec.", _packet.Index, (int)_packet.TimeOutStep, PortName));
//TODO: Разкомментарить, когда найду баг, почему не проставляется статус DoneRecieved иногда при приходе "Готово".
{(_packet.Packet, 0, _packet.Packet.Length);.WriteBytesToLog(PortName + ": Послан фрейм(retry):", _packet.Packet);.Info(string.Format("{2}: Кадр {0}: Послан ожидаем ответ от устройства.(Попытка {1})", _packet.Index,
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
}.Info(string.Format("Кадр {0}: Попали в статус DoneReceived.", _packet.Index));
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
{(_packet.Packet, 0, _packet.Packet.Length);.WriteBytesToLog(PortName + ": Послан фрейм(retry):", _packet.Packet);.Info(string.Format("{2}: Кадр {0}: Послан ожидаем ответ от устройства.(Попытка {1})", _packet.Index,
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
_packet.State = enumState.Sended;.WriteBytesToLog(PortName + ": Послан фрейм(1):", _packet.Packet);.Info(string.Format("{2}: Кадр {0}: Послан ожидаем ответ от устройства.(Попытка {1})", _packet.Index,
//Говорит о том, что надо выйти из цикла
{.Info(string.Format("{1}: Кадр {0}: не послан так как буфер приема не обработан.", _packet.Index, PortName));
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
_timeout += 10;.Info(string.Format("{1}: Ожидаем {0}, {2}", _timeout, PortName, _packet.Command.Name));
//Проверяем, следует ли прервать отправку.(_killFrameToSend == true)
{.Error(.Format("{1}: Кадр {0}: Время ожидания на посылку кадра истекло. ", _packet.Index, PortName), е);
//TODO: 1+1ин раз при онлайн смене устройств обмена, сюда пришло packet = null. Проверить, отдебажить..Error(.Format("{1}: Кадр {0}: Возникла неизвестная ошибка при посылке кадра.", _packet.Index, PortName),
{.Info(string.Format("{1}: Кадр {0}: Удаляем кадр из очереди", _packet.Index, PortName));
//Гарантирует что удаляется именно тот пакет, который обрабатывали
//Усыпляем поток - состояние ожидания.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
{"Нет имени";
//Вычтвыляется если необходимо подтверждение командыbool CompleteRequired { get; set; }
//Время ожидания подтверждения командыuint CompleteRequiredTime { get; set; }_lockFrame = new object();
#region onTicketReceived() Реакция на пришежший тикет для фрейма командыvirtual void onTicketReceived()
//TODO: Именно тут перебивался когда-то статус DoneReceived на TicketReceived.Info(string.Format(m_Port.PortName + ": {0} 4 Выставляем статус TicketReceived", this.Name));(State != enumState.DoneReceived)= enumState.TicketReceived;
"{1}: {2} : Кадр {0}: Подтвержден квитанцией",
{.Info(string.Format("{1}: {2} : Кадр {0}: Удаляем из очереди",_Frames[0].Index, m_Port.PortName, _Frames[0].Command.Name));(_lockFrame)
#region onCompleteReceived()Реакция на пришедший "Готово" для фрейма командыvirtual void onCompleteReceived()
{.Info(string.Format(m_Port.PortName + ": {0} 3 Выставляем статус DoneReceived", this.Name));= enumState.DoneReceived;
{.Info(string.Format("{1}: {2} :Кадр {0}: Подтвержден командой готово",
{.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()));
#endregion Реакция на пришедший "Готово" для фрейма команды
#region onError()Реакиця на ошибку внутри фрейма командыvirtual void onError()
{.Info(string.Format("{0}: Ошибка - команда не выполнена.", m_Port.PortName));LastState = State;= enumState.Error;
{.Info(m_Port.PortName + ": Реакиця на ошибку внутри фрейма команды. Очистили лист CFrame 1");
{(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()));
#region onSended()Реакция после отправкиvirtual void onSended()
{(_Frames.Count > 0).Info(.Format("{1}: Кадр {0}: Кадр отправлен.",
{(_Frames.Count > 0).Info(.Format("{1}: Кадр {0}: Кадр ожидает команду готово.",
#region onSend()Реакция до отправкиvirtual void onSend()
{(_Frames.Count > 0).Info(.Format("{1}: Кадр {0}: Кадр готов к отправке.",
//Посылка тикета в ответ на принятую команду.virtual void onCommandReceived()
{(this);.Info(string.Format("Отправили квитанцию на команду: {0}", this.Name));
//Посылка готово в ответ на обработанную команду.virtual void onCommandCompleted()
//}(this);.Info(string.Format("Отправлена 'Готово' на команду: {0}", this.Name));
/// Статический список команд и их обработчиков
/// Действие, которое выполняет комманда
/// Представление тела коммадны
/// Код команды (смотри документацию)
/// Блок данных команды
/// Состояние команды в текущйи момент
/// Конструктор для экземпляра команды
/// Подготовка команды на осное полученого фрейма
/// Подготовка команды
/// <param name="toDevice">к какому устройству</param>
/// <param name="fromDevice">от какого устройства</param>
/// Запуск комманды на выполнение
/// Подготовка команды
/// в зависемости от вбранного действия и состояния
/// Подготовка собирает команду и разбивает ее на фреймы.
/// Посылка подготовленой команды
/// Посылка может осуществляться несколькими фреймами
/// Создает команду по ее номеру
}(onErrorReceived != null)(null, string.Format("Команда с индексом {0} не найдена!", _indexCommand.ToString())); //ъотели заменить на следующую строку
//OnErrorReceivedCCommand(string.Format("Команда с индексом {0} не найдена!", _indexCommand.ToString()));new CException("Команда не найдена!");
/// получаем данные с определенного байта и определенное количество
/// Посылка подготовленой команды
/// Посылка может осуществляться несколькими фреймами
{.Info(_command.m_Port.PortName + ": Посылка тикета для команды " + _command.Name);sendTicket(_command.m_Port, _command._Frames[0].FromDevice, _command._Frames[0].ToDevice, _command._Frames[0].Index, _command);
{.Info(_port.PortName + ": Не найден кадр на который отправляем подтверждение.");
}ticket = CCommand.GetCommand(enumCommand.Ticket);.TimeOutToSend = 0; //не ждать ответа вообще..MaxTryToSend = 0;.CompleteRequired = false;.CompleteRequiredTime = 0;.Action = enumAction.Send;.Send(_port, _to, _from, _Index, ticket);
{.Info(_command.m_Port.PortName + ": Посылка готово для команды " + _command.Name);sendComplete(_command.m_Port, _command.fromDevice, _command.toDevice, null);
//ChangeStatus("Посылаем команду 'Готово', в ответ на команду 'Данные'.");_wait = true;
//ChangeStatus.CurrentStatus = "Получена квитанция на команду 'Готово'.";
//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);;
ПРИЛОЖЕНИЕ 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
Сообщения оператору
Сообщение
Действие
Устройство не подключено
Проверить подключение устройства
Устройство не опознано
Проверить модель устройства в соответствии с требованиями
Введен неверный пароль
Ввести пароль снова
Пароль введен неверно, войти со стандартным паролем
Войти с верным паролем, либо войти в режим "по умолчанию"
или зарегистрироваться
в сервисе
удобным
способом
вы получите ссылку
на скачивание
к нам за прошлый год