Данный документ описывает внутреннюю структуру, взаимодействие с окружением и внешние интерфейсы приложения. Приводится описание классов, их взаимодействие, а также описание их внешних и внутренних интерфейсов.
В настоящем документе приняты следующие определения и сокращения:
| Сокращение | Определение |
|---|---|
| FS | Документ cодержит технические требования, предъявляемые к функционированию программного продукта |
| HLD | High Level Design. Содержит описание модульной структуры проекта и взаимодействия его модулей |
| Проект | Проект симулятора морского боя |
Слово "должен" определяет необходимое требование к продукту. Слова "может", "предполагает", "способен" определяют направление работ, которое подлежит дальнейшему уточнению.
Пользовательский уровень представления системы изображен на рис. 14.1. Детальное описание пользовательского уровня приведено в FS. Представление тестируемой системы с точки зрения окружения приведено на рис. 14.2.
Взаимодействие системы со складом и терминалами должно осуществляться посредством вызова методов модулей системы.
//Получение сообщения от терминала оси
static public int GetAxlePar(out string NameMaster, out string Factory, out string Number, out byte ShiftNum, out int Side, out float FrontDiam, out float BackDiam)
(рис 14.1) Use case-диаграмма
(рис 14.2) Окружение системы
//Получение сообщения от терминала подшипника
static public int GetRollerPar(out string NameMaster, out string Factory, out string Number, out int ShiftNum, out int Group, out int SepType, out float AShift)
//Получение сообщения от CКЛАДА
static public long GetStoreMessage()
//Получение статуса СКЛАДА
static public int GetStoreStat(out long mParametr)
//Посылка команды СКЛАДУ
static public int SendStoreCom (int com, int s1, int y1, int x1, int s2, int y2, int x2)
// Класс параметров подшипника
public class TBearingParam
{
public string Number; // Номер подшипника
public int ShiftNum; // Номер рабочей смены
public DateTime OutDateTime;
// Дата и время выдачи подшипника
public DateTime InDateTime;
// Дата и время поступления подшипника
public string Factory; // Название депо
public string NameMaster;// ФИО мастера
public int GroupNum; // Номер группы подшипника
public int SepType; // Тип сепаратора подшипника
public float AShift; // Осевой сдвиг
public int Position;
// Позиция на оси (0 - на заднем кольце (Back),
// 1 - на переднем кольце (Front))
// Конструктор
public TBearingParam()
}
Класс реализует набор параметров подшипника.
// Класс терминала подшипника
public class TTerminalBearing
{
private TBearingParam BearingParam;//Структура параметров
//подшипника
public TCommandQueue CommandQueue; //Ссылка на очередь
//команд
public bool IsQuery; //Флаг, разрешающий
//опрос терминала
// Конструктор
public TTerminalBearing()
// Опрашивает терминал
private long QueryTerminal()
// Запрашивает и обрабатывает статус терминала
public void Process()
}
Класс используется для взаимодействия с терминалом подшипника. Операции:
TTerminalBearing() инициализирует поле BearingParam и устанавливает значение флага IsQuery в true.QueryTerminal() вызывает функцию внешнего модуля IBearing.GetRollerPar(...), присваивает возвращенные значения
полю BearingParam и возвращает значение Process() вызывает метод QueryTerminal(). Если статус
терминала равен 0 (это означает, что параметры подшипника были
успешно возвращены), то на первое место в очередь команд
добавляется команда GetR - получить из входной ячейки:CommandQueue.AddCommand(TCommand.GetR,-1,0,-1, this.BearingParam, null,0);
Если получены другие значения
// Класс параметров оси
public class TAxleParam
{
public byte ShiftNum; //Номер рабочей смены
public string NameMaster; //ФИО мастера
public string Factory; //Название депо
public string Number; //Номер оси
public int Side; //Сторона оси 0 - правая,
//1 - левая
public float BackDiam; //Номер группы задний
public float FrontDiam; //Номер группы передний
}
Класс реализует набор параметров оси.
// Класс терминала оси
public class TTerminalAxle
{
private TAxleParam AxleParam; //Структура параметров
//подшипника
public TStore Store; //Ссылка на склад
//Опрашивает терминал
private long QueryTerminal()
//Конструктор
public TTerminalAxle()
//Запрашивает и обрабатывает статус терминала
public void Process()
}
Класс используется для взаимодействия с терминалом оси. Операции:
TTerminalAxle() инициализирует поле AxleParam.QueryTerminal() вызывает функцию внешнего модуля IAxle.GetAxlePar(...), присваивает возвращенные значения полю AxleParam и возвращает значение Process() вызывает метод QueryTerminal(). Если статус
терминала равен 0 (это означает что параметры оси были успешно
возвращены), то вызывается метод Store.FindBearingInStore(...),
подбирающий подшипники для данной оси. В зависимости от
результатов подбора в журнал выводится сообщение (FS пункт 2).Если получены другие значения
// Класс команды
public class TCommand
{
public const short GetR = 1; //Получить из входной
//ячейки
public const short SendR = 2; //Отправить из ячейки в
//выходную ячейку
public const short MoveR = 3; //Переложить из ячейки
//в ячейку
public const short PutR = 4; //Положить в резерв
public const short PutR1 = 5; //Положить при выдаче
public const short SetN = 6; //Произвести зануление
public const short CheckR = 9;//Проверить ячейку на
//занятость
public const short PRoll = 10;//Получить параметры
//подшипника
public const short Term = 20; //Завершение команд выдачи
public int NameCommand; //Название команды
public int NRetry; //Число попыток выполнения команды
public int CellSource; //Порядковый номер исходной ячейки
public int CellTarget; //Порядковый номер
//результирующей ячейки
public int TagSt; //Сторона результирующей ячейки
public int TagCol; //Колонка результирующей ячейки
public int TagRow; //Ряд результирующей ячейки
public int SourseSt; //Сторона исходной ячейки
public int SourseCol; //Колонка исходной ячейки
public int SourseRow; //Ряд исходной ячейки
public TBearingParam PR; //Структура характеристик
//подшипника
public TAxleParam PA; //Структура характеристик оси
public string GetFullName()
}
Класс реализует команду складу. Команда складу описывает:
Код и название команды используются внутри системы и при взаимодействии со складом, а полное название команды используется при добавлении в журнал сообщений записей о работе системы.
Класс содержит описание всех допустимых команд (табл. 14.1).
| № | Код | Название | Полное название |
|---|---|---|---|
| 1 | 1 | GetR |
Получить из входной ячейки |
| 2 | 2 | SendR |
Отправить из ячейки в выходную ячейку |
| 3 | 4 | PutR |
Положить в резерв |
| 4 | 6 | SetN |
Произвести зануление |
| 5 | 20 | Term |
Завершение команд выдачи |
Операции:
GetFullName() возвращает полное название команды,
соответствующее коду команды (табл. 14.1), указанному в поле
NameCommand, если он является допустимым кодом. В
противном случае возвращается сообщение "ОШИБКА:
Неверный код команды". Может применяться в любой момент.Для выполнения конструктора не требуется никаких предварительных условий.
Для выполнения деструктора не требуется никаких предварительных условий.
public class TCommandQueue : System.Windows.Forms.ListBox
{
private TTerminalBearing TerminalBearing;
//Терминал подшипника
private TStore Store; //Склад
// Конструктор
public TCommandQueue(TStore store, // Ссылка на экземпляр
//TStore
TTerminalBearing terminalBearing) // Ссылка на экземпляр
//TTerminalBearing
// Добавляет команду в очередь команд на указанную позицию
public void AddCommand(int NameCommand, // Код команды
int CntRoll, // Номер выдаваемого подшипника
int CellSourse, // Порядковый номер исходной ячейки
int CellTarget, // Порядковый номер результирующей
// ячейки
TBearingParam PR, // Параметры подшипника
TAxleParam PA, // Параметры оси
int Position) // Позиция в очереди
// Удаляет команду из очереди
public void DeleteCommand(int Position)
// Выполняет первую команду в очереди
public void ProcessCommand()
// Отправляет команду складу
private int SendCommand()
}
Класс реализует очередь FIFO объектов типа TCommand. Наследуется
от System.Windows.Forms.ListBox библиотеки .NET. Количество команд в
очереди не ограничено. Имеет ссылки на экземпляры классов TTerminalBearing и TStore.
Операции:
TCommandQueue(...) создает экземпляр класса и
инициализирует поля TerminalBearing и Store с помощью
передаваемых указателей. Передаваемые указатели должны
указывать на существующие объекты, внутри конструктора такой
проверки не происходит.AddCommand(...) создает объект типа TCommand,
присваивает ему переданные параметры и добавляет в очередь
команд на указанную позицию. При добавлении команды GetR
(см. табл. 14.1 "Список команд складу") должен быть запрещен
опрос терминала подшипника, т.е. полю TerminalBearing.IsQuery должно быть присвоено значение false. Позиции в очереди нумеруются, начиная с 0. Значение
позиции в очереди = -1 означает, что команда будет добавлена в
конец очереди. Можно также явно задавать позицию, на которую
следует добавить команду.DeleteCommand(...) удаляет команду из очереди на
указанной позиции. При удалении команды GetR (см. табл. 14.1
"Список команд складу") должен быть разрешен опрос терминала
подшипника, т.е. полю TerminalBearing.IsQuery должно быть
присвоено значение true.ProcessCommand() при наличии команд в очереди
посылает первую команду из очереди складу при помощи метода SendCommand(). В зависимости от возвращенного этим методом
значения - статуса команды - должны быть предприняты
следующие действия, описанные в FS, глава 3 "Специфические
требования", пункт 3.SendCommand() посылает первую в очереди команду
(с индексом 0) складу с помощью функции IStore.SendStoreCom()
из Store.dll и возвращает код ответа склада. Перед отправкой
команды устанавливаются следующие ее поля:GetR "Получить из входной ячейки" координаты
ячейки источника - ( SourseSt = 0, SourseCol = 0, SourseRow =0 ),
а координаты результирующей ячейки возвращает метод TStore.FindFreeCell() с параметром, определяющим зону склада,
для поиска установленным в true (поиск в рабочей зоне склада).SendR "Отправить из ячейки в выходную ячейку"
координаты результирующей ячейки - ( TagSt = 9, TagCol =
9, TagRow = 9 ), а координаты ячейки источника возвращает
метод TStore.GetCoord() на основе значения поля CellSourse посылаемой команды.PutR "Положить в резерв" координаты ячейки
источника - ( SourseSt = -1, SourseCol = -1, SourseRow = -1 ),
а координаты результирующей ячейки возвращает метод TStore.FindFreeCell() с параметром, определяющим зону
склада для поиска установленным в false (поиск в резервной
зоне склада).Для выполнения деструктора не требуется никаких предварительных условий.
public class TStore
{
public TTerminalBearing TerminalBearing; //Ссылка на
//терминал подшипника
public TCommandQueue CommandQueue; //Ссылка на очередь
//команд
private static string ConnectionString; //Строка
//подключения к серверу БД
private SqlConnection connFindFreeCell;
private SqlConnection connFindBearing;
private SqlConnection connAddBearing;
private SqlConnection connMarkFree;
private SqlConnection connRemoveBearing;
private SqlConnection connGetCoord;
// Возвращает статус склада
private long GetStatus()
// Добавляет запись об обслуженной ОСИ в базу данных
private bool AddBearingAxle(TCommand Command)
// Добавляет запись о подшипнике в базу данных
private bool AddBearing(TCommand Command)
// Удаляет запись о подшипнике из базы данных
private bool RemoveBearing(TCommand Command)
// Помечает ячейку как проблемную
private bool MarkCellBad(int Cell)
// Возвращает сообщение склада о выполнении команды
private long GetMessage()
// Конструктор
public TStore()
// Запрашивает и обрабатывает статус склада
public void Process()
// Запрашивает и обрабатывает сообщение склада
public void ProcessMessage()
// Находит свободную ячейку
public bool FindFreeCell(ref int CNum, ref int TagSt,
ref int TagRow, ref int TagCol, bool IsReserve)
// Возвращает координаты ячейки по номеру
public bool GetCoord(int CNum, ref int Side,
ref int Row, ref int Col)
//Находит подшипники в складе на основании параметров ОСИ
public bool FindBearingInStore(TAxleParam AxleParam)
}
Класс реализует терминал склада.
Операции:
GetStatus() вызывает функцию внешнего модуля IStore.GetStoreStat(...) и в случае, если она вернула 0, GetStatus() возвращает значение статуса склада, в противном
случае возвращается -1.AddBearingAxle() добавляет запись об обслуженной оси в
базу данных на основе переданной в качестве параметра команды.AddBearing() добавляет запись о принятом подшипнике в
базу данных на основе переданной в качестве параметра команды.RemoveBearing() удаляет запись о выданном подшипнике
из базы данных на основе переданной в качестве параметра
команды.MarkCellBad(...) помечает ячейку как проблемную,
порядковый номер ячейки передается как параметр.GetMessage() вызывает функцию внешнего модуля IStore.GetStoreMessage(...) и возвращает код сообщения складаTStore() читает из конфигурационного файла имя
сервера SQL , имя пользователя, пароль и инициализирует все
поля типа SqlConnection .Process() вызывает метод GetStatus(). В зависимости от
полученного статуса склада он производит следующие действия:TerminalBearing.Process().CommandQueue.AddCommand().CommandQueue.AddCommand().ProcessMessage() вызывает метод GetMessage() и в
зависимости от полученного результата выполняет следующие
действия:GetMessage() ).Операция FindFreeCell(...) ищет свободную ячейку в резервной
(параметр IsReserve установлен в true ) или рабочей (параметр IsReserve установлен в false ) области с наименьшим порядковым
номером и возвращает ее координаты: порядковый номер - CNum,
сторона - TagSt, ряд - TagRow, колонка - TagCol.
Операция GetCoord(...) возвращает для переданного порядкового
номера ячейки ( CNum ) номер строки ( Side ), колонки ( Col ) и ряда ( Row ).
public class TLog
{
static private FileStream fs =
new FileStream("system.log",
FileMode.Create,FileAccess.Write, FileShare.ReadWrite);
static private StreamWriter srLog =
new StreamWriter(fs);
// Деструктор
~ TLog()
// Добавляет запись в журнал сообщений системы
static public void AddToLog(string LogMessage)
}
Класс реализует журнал сообщений системы.
Операции:
AddToLog() сохраняет переданное ему в качестве
параметра сообщение в файл.public class TModel
{
private TLog Log; //Ссылка на журнал сообщений
private TStore Store; //Ссылка на склад
private TTerminalAxle TerminalAxle; //Ссылка на
//терминал оси
private TTerminalBearing TerminalBearing; //Ссылка на
//терминал подшипника
private TCommandQueue CommandQueue; //Ссылка на очередь
//команд
public Thread QueryThread; //Поток опроса
public Thread CommandThread; //Поток команд
public bool QueryThreadTerminated; //Флаг окончания
//работы потока опроса
public bool CommandThreadTerminated; //Флаг окончания
//работы потока команд
// Конструктор
public TModel()
// Метод, реализующий поток опроса
public void QueryThreadExecute()
// Метод, реализующий поток выполнения команд
public void CommandThreadExecute()
}
Класс реализует журнал сообщений системы.
Операции:
QueryThreadExecute() реализует поток опроса. Здесь
последовательно вызываются методы TStore.Process()
и TTerminalAxle.Process().CommandThreadExecute() реализует поток выполнения
команд. Здесь вызывается метод TcommandQueue.ProcessCommand().Система должна быть реализована в виде набора классов, представленного на рис. 14.3.
(рис 14.3) Диаграмма классов
Общедоступные интерфейсы классов (подробное описание приведенных методов изложено в п. 2):
// Запрашивает и обрабатывает статус склада public string Process() // Запрашивает и обрабатывает сообщение склада public string ProcessMessage() // Находит свободную ячейку public bool FindFreeCell(ref int CNum, ref int TagSt, ref int TagRow, ref int TagCol, bool IsReserve) // Возвращает координаты ячейки по номеру public bool GetCoord(int CNum, ref int Side, ref int Row, ref int Col) // Находит подшипники в складе на основании параметров ОСИ public bool FindBearingInStore(TAxleParam AxleParam)
// Конструктор public TTerminalBearing() // Запрашивает и обрабатывает статус терминала public void Process()
// Конструктор public TTerminalAxle() // Запрашивает и обрабатывает статус терминала public void Process()
// Конструктор public TCommandQueue(TStore store, TTerminalBearing terminalBearing) // Добавляет команду в очередь команд на указанную позицию public void AddCommand(int NameCommand, int CntRoll, int CellSourse, int CellTarget, TBearingParam PR, TAxleParam PA, int Position) // Удаляет команду из очереди public void DeleteCommand(int Position) // Выполняет первую команду в очереди public void ProcessCommand()
// Конструктор public TBearingParam()
// Конструктор public TAxleParam()
// Конструктор public TModel() // Метод, реализующий поток опроса public void QueryThreadExecute() // Метод, реализующий поток выполнения команд public void CommandThreadExecute()
// Возвращает полное название команды public string GetFullName()
// Добавляет запись в журнал сообщений системы static public void AddToLog(string LogMessage)
// Конструктор public MainForm
Данный документ описывает внутреннюю структуру, взаимодействие с окружением и внешние интерфейсы приложения. Приводится описание классов, их взаимодействие, а также описание их внешних и внутренних интерфейсов.
В настоящем документе приняты следующие определения и сокращения:
| Сокращение | Определение |
|---|---|
| FS | Документ cодержит технические требования, предъявляемые к функционированию программного продукта |
| HLD | High Level Design. Содержит описание модульной структуры проекта и взаимодействия его модулей |
| Проект | Проект симулятора морского боя |
Слово "должен" определяет необходимое требование к продукту. Слова "может", "предполагает", "способен" определяют направление работ, которое подлежит дальнейшему уточнению.
Пользовательский уровень представления системы изображен на рис. 14.1. Детальное описание пользовательского уровня приведено в FS. Представление тестируемой системы с точки зрения окружения приведено на рис. 14.2.
Взаимодействие системы со складом и терминалами должно осуществляться посредством вызова методов модулей системы.
//Получение сообщения от терминала оси
static public int GetAxlePar(out string NameMaster, out string Factory, out string Number, out byte ShiftNum, out int Side, out float FrontDiam, out float BackDiam)
(рис 14.1) Use case-диаграмма
(рис 14.2) Окружение системы
//Получение сообщения от терминала подшипника
static public int GetRollerPar(out string NameMaster, out string Factory, out string Number, out int ShiftNum, out int Group, out int SepType, out float AShift)
//Получение сообщения от CКЛАДА
static public long GetStoreMessage()
//Получение статуса СКЛАДА
static public int GetStoreStat(out long mParametr)
//Посылка команды СКЛАДУ
static public int SendStoreCom (int com, int s1, int y1, int x1, int s2, int y2, int x2)
// Класс параметров подшипника
public class TBearingParam
{
public string Number; // Номер подшипника
public int ShiftNum; // Номер рабочей смены
public DateTime OutDateTime;
// Дата и время выдачи подшипника
public DateTime InDateTime;
// Дата и время поступления подшипника
public string Factory; // Название депо
public string NameMaster;// ФИО мастера
public int GroupNum; // Номер группы подшипника
public int SepType; // Тип сепаратора подшипника
public float AShift; // Осевой сдвиг
public int Position;
// Позиция на оси (0 - на заднем кольце (Back),
// 1 - на переднем кольце (Front))
// Конструктор
public TBearingParam()
}
Класс реализует набор параметров подшипника.
// Класс терминала подшипника
public class TTerminalBearing
{
private TBearingParam BearingParam;//Структура параметров
//подшипника
public TCommandQueue CommandQueue; //Ссылка на очередь
//команд
public bool IsQuery; //Флаг, разрешающий
//опрос терминала
// Конструктор
public TTerminalBearing()
// Опрашивает терминал
private long QueryTerminal()
// Запрашивает и обрабатывает статус терминала
public void Process()
}
Класс используется для взаимодействия с терминалом подшипника. Операции:
TTerminalBearing() инициализирует поле BearingParam и устанавливает значение флага IsQuery в true.QueryTerminal() вызывает функцию внешнего модуля IBearing.GetRollerPar(...), присваивает возвращенные значения
полю BearingParam и возвращает значение Process() вызывает метод QueryTerminal(). Если статус
терминала равен 0 (это означает, что параметры подшипника были
успешно возвращены), то на первое место в очередь команд
добавляется команда GetR - получить из входной ячейки:CommandQueue.AddCommand(TCommand.GetR,-1,0,-1, this.BearingParam, null,0);
Если получены другие значения
// Класс параметров оси
public class TAxleParam
{
public byte ShiftNum; //Номер рабочей смены
public string NameMaster; //ФИО мастера
public string Factory; //Название депо
public string Number; //Номер оси
public int Side; //Сторона оси 0 - правая,
//1 - левая
public float BackDiam; //Номер группы задний
public float FrontDiam; //Номер группы передний
}
Класс реализует набор параметров оси.
// Класс терминала оси
public class TTerminalAxle
{
private TAxleParam AxleParam; //Структура параметров
//подшипника
public TStore Store; //Ссылка на склад
//Опрашивает терминал
private long QueryTerminal()
//Конструктор
public TTerminalAxle()
//Запрашивает и обрабатывает статус терминала
public void Process()
}
Класс используется для взаимодействия с терминалом оси. Операции:
TTerminalAxle() инициализирует поле AxleParam.QueryTerminal() вызывает функцию внешнего модуля IAxle.GetAxlePar(...), присваивает возвращенные значения полю AxleParam и возвращает значение Process() вызывает метод QueryTerminal(). Если статус
терминала равен 0 (это означает что параметры оси были успешно
возвращены), то вызывается метод Store.FindBearingInStore(...),
подбирающий подшипники для данной оси. В зависимости от
результатов подбора в журнал выводится сообщение (FS пункт 2).Если получены другие значения
// Класс команды
public class TCommand
{
public const short GetR = 1; //Получить из входной
//ячейки
public const short SendR = 2; //Отправить из ячейки в
//выходную ячейку
public const short MoveR = 3; //Переложить из ячейки
//в ячейку
public const short PutR = 4; //Положить в резерв
public const short PutR1 = 5; //Положить при выдаче
public const short SetN = 6; //Произвести зануление
public const short CheckR = 9;//Проверить ячейку на
//занятость
public const short PRoll = 10;//Получить параметры
//подшипника
public const short Term = 20; //Завершение команд выдачи
public int NameCommand; //Название команды
public int NRetry; //Число попыток выполнения команды
public int CellSource; //Порядковый номер исходной ячейки
public int CellTarget; //Порядковый номер
//результирующей ячейки
public int TagSt; //Сторона результирующей ячейки
public int TagCol; //Колонка результирующей ячейки
public int TagRow; //Ряд результирующей ячейки
public int SourseSt; //Сторона исходной ячейки
public int SourseCol; //Колонка исходной ячейки
public int SourseRow; //Ряд исходной ячейки
public TBearingParam PR; //Структура характеристик
//подшипника
public TAxleParam PA; //Структура характеристик оси
public string GetFullName()
}
Класс реализует команду складу. Команда складу описывает:
Код и название команды используются внутри системы и при взаимодействии со складом, а полное название команды используется при добавлении в журнал сообщений записей о работе системы.
Класс содержит описание всех допустимых команд (табл. 14.1).
| № | Код | Название | Полное название |
|---|---|---|---|
| 1 | 1 | GetR |
Получить из входной ячейки |
| 2 | 2 | SendR |
Отправить из ячейки в выходную ячейку |
| 3 | 4 | PutR |
Положить в резерв |
| 4 | 6 | SetN |
Произвести зануление |
| 5 | 20 | Term |
Завершение команд выдачи |
Операции:
GetFullName() возвращает полное название команды,
соответствующее коду команды (табл. 14.1), указанному в поле
NameCommand, если он является допустимым кодом. В
противном случае возвращается сообщение "ОШИБКА:
Неверный код команды". Может применяться в любой момент.Для выполнения конструктора не требуется никаких предварительных условий.
Для выполнения деструктора не требуется никаких предварительных условий.
public class TCommandQueue : System.Windows.Forms.ListBox
{
private TTerminalBearing TerminalBearing;
//Терминал подшипника
private TStore Store; //Склад
// Конструктор
public TCommandQueue(TStore store, // Ссылка на экземпляр
//TStore
TTerminalBearing terminalBearing) // Ссылка на экземпляр
//TTerminalBearing
// Добавляет команду в очередь команд на указанную позицию
public void AddCommand(int NameCommand, // Код команды
int CntRoll, // Номер выдаваемого подшипника
int CellSourse, // Порядковый номер исходной ячейки
int CellTarget, // Порядковый номер результирующей
// ячейки
TBearingParam PR, // Параметры подшипника
TAxleParam PA, // Параметры оси
int Position) // Позиция в очереди
// Удаляет команду из очереди
public void DeleteCommand(int Position)
// Выполняет первую команду в очереди
public void ProcessCommand()
// Отправляет команду складу
private int SendCommand()
}
Класс реализует очередь FIFO объектов типа TCommand. Наследуется
от System.Windows.Forms.ListBox библиотеки .NET. Количество команд в
очереди не ограничено. Имеет ссылки на экземпляры классов TTerminalBearing и TStore.
Операции:
TCommandQueue(...) создает экземпляр класса и
инициализирует поля TerminalBearing и Store с помощью
передаваемых указателей. Передаваемые указатели должны
указывать на существующие объекты, внутри конструктора такой
проверки не происходит.AddCommand(...) создает объект типа TCommand,
присваивает ему переданные параметры и добавляет в очередь
команд на указанную позицию. При добавлении команды GetR
(см. табл. 14.1 "Список команд складу") должен быть запрещен
опрос терминала подшипника, т.е. полю TerminalBearing.IsQuery должно быть присвоено значение false. Позиции в очереди нумеруются, начиная с 0. Значение
позиции в очереди = -1 означает, что команда будет добавлена в
конец очереди. Можно также явно задавать позицию, на которую
следует добавить команду.DeleteCommand(...) удаляет команду из очереди на
указанной позиции. При удалении команды GetR (см. табл. 14.1
"Список команд складу") должен быть разрешен опрос терминала
подшипника, т.е. полю TerminalBearing.IsQuery должно быть
присвоено значение true.ProcessCommand() при наличии команд в очереди
посылает первую команду из очереди складу при помощи метода SendCommand(). В зависимости от возвращенного этим методом
значения - статуса команды - должны быть предприняты
следующие действия, описанные в FS, глава 3 "Специфические
требования", пункт 3.SendCommand() посылает первую в очереди команду
(с индексом 0) складу с помощью функции IStore.SendStoreCom()
из Store.dll и возвращает код ответа склада. Перед отправкой
команды устанавливаются следующие ее поля:GetR "Получить из входной ячейки" координаты
ячейки источника - ( SourseSt = 0, SourseCol = 0, SourseRow =0 ),
а координаты результирующей ячейки возвращает метод TStore.FindFreeCell() с параметром, определяющим зону склада,
для поиска установленным в true (поиск в рабочей зоне склада).SendR "Отправить из ячейки в выходную ячейку"
координаты результирующей ячейки - ( TagSt = 9, TagCol =
9, TagRow = 9 ), а координаты ячейки источника возвращает
метод TStore.GetCoord() на основе значения поля CellSourse посылаемой команды.PutR "Положить в резерв" координаты ячейки
источника - ( SourseSt = -1, SourseCol = -1, SourseRow = -1 ),
а координаты результирующей ячейки возвращает метод TStore.FindFreeCell() с параметром, определяющим зону
склада для поиска установленным в false (поиск в резервной
зоне склада).Для выполнения деструктора не требуется никаких предварительных условий.
public class TStore
{
public TTerminalBearing TerminalBearing; //Ссылка на
//терминал подшипника
public TCommandQueue CommandQueue; //Ссылка на очередь
//команд
private static string ConnectionString; //Строка
//подключения к серверу БД
private SqlConnection connFindFreeCell;
private SqlConnection connFindBearing;
private SqlConnection connAddBearing;
private SqlConnection connMarkFree;
private SqlConnection connRemoveBearing;
private SqlConnection connGetCoord;
// Возвращает статус склада
private long GetStatus()
// Добавляет запись об обслуженной ОСИ в базу данных
private bool AddBearingAxle(TCommand Command)
// Добавляет запись о подшипнике в базу данных
private bool AddBearing(TCommand Command)
// Удаляет запись о подшипнике из базы данных
private bool RemoveBearing(TCommand Command)
// Помечает ячейку как проблемную
private bool MarkCellBad(int Cell)
// Возвращает сообщение склада о выполнении команды
private long GetMessage()
// Конструктор
public TStore()
// Запрашивает и обрабатывает статус склада
public void Process()
// Запрашивает и обрабатывает сообщение склада
public void ProcessMessage()
// Находит свободную ячейку
public bool FindFreeCell(ref int CNum, ref int TagSt,
ref int TagRow, ref int TagCol, bool IsReserve)
// Возвращает координаты ячейки по номеру
public bool GetCoord(int CNum, ref int Side,
ref int Row, ref int Col)
//Находит подшипники в складе на основании параметров ОСИ
public bool FindBearingInStore(TAxleParam AxleParam)
}
Класс реализует терминал склада.
Операции:
GetStatus() вызывает функцию внешнего модуля IStore.GetStoreStat(...) и в случае, если она вернула 0, GetStatus() возвращает значение статуса склада, в противном
случае возвращается -1.AddBearingAxle() добавляет запись об обслуженной оси в
базу данных на основе переданной в качестве параметра команды.AddBearing() добавляет запись о принятом подшипнике в
базу данных на основе переданной в качестве параметра команды.RemoveBearing() удаляет запись о выданном подшипнике
из базы данных на основе переданной в качестве параметра
команды.MarkCellBad(...) помечает ячейку как проблемную,
порядковый номер ячейки передается как параметр.GetMessage() вызывает функцию внешнего модуля IStore.GetStoreMessage(...) и возвращает код сообщения складаTStore() читает из конфигурационного файла имя
сервера SQL , имя пользователя, пароль и инициализирует все
поля типа SqlConnection .Process() вызывает метод GetStatus(). В зависимости от
полученного статуса склада он производит следующие действия:TerminalBearing.Process().CommandQueue.AddCommand().CommandQueue.AddCommand().ProcessMessage() вызывает метод GetMessage() и в
зависимости от полученного результата выполняет следующие
действия:GetMessage() ).Операция FindFreeCell(...) ищет свободную ячейку в резервной
(параметр IsReserve установлен в true ) или рабочей (параметр IsReserve установлен в false ) области с наименьшим порядковым
номером и возвращает ее координаты: порядковый номер - CNum,
сторона - TagSt, ряд - TagRow, колонка - TagCol.
Операция GetCoord(...) возвращает для переданного порядкового
номера ячейки ( CNum ) номер строки ( Side ), колонки ( Col ) и ряда ( Row ).
public class TLog
{
static private FileStream fs =
new FileStream("system.log",
FileMode.Create,FileAccess.Write, FileShare.ReadWrite);
static private StreamWriter srLog =
new StreamWriter(fs);
// Деструктор
~ TLog()
// Добавляет запись в журнал сообщений системы
static public void AddToLog(string LogMessage)
}
Класс реализует журнал сообщений системы.
Операции:
AddToLog() сохраняет переданное ему в качестве
параметра сообщение в файл.public class TModel
{
private TLog Log; //Ссылка на журнал сообщений
private TStore Store; //Ссылка на склад
private TTerminalAxle TerminalAxle; //Ссылка на
//терминал оси
private TTerminalBearing TerminalBearing; //Ссылка на
//терминал подшипника
private TCommandQueue CommandQueue; //Ссылка на очередь
//команд
public Thread QueryThread; //Поток опроса
public Thread CommandThread; //Поток команд
public bool QueryThreadTerminated; //Флаг окончания
//работы потока опроса
public bool CommandThreadTerminated; //Флаг окончания
//работы потока команд
// Конструктор
public TModel()
// Метод, реализующий поток опроса
public void QueryThreadExecute()
// Метод, реализующий поток выполнения команд
public void CommandThreadExecute()
}
Класс реализует журнал сообщений системы.
Операции:
QueryThreadExecute() реализует поток опроса. Здесь
последовательно вызываются методы TStore.Process()
и TTerminalAxle.Process().CommandThreadExecute() реализует поток выполнения
команд. Здесь вызывается метод TcommandQueue.ProcessCommand().Система должна быть реализована в виде набора классов, представленного на рис. 14.3.
(рис 14.3) Диаграмма классов
Общедоступные интерфейсы классов (подробное описание приведенных методов изложено в п. 2):
// Запрашивает и обрабатывает статус склада public string Process() // Запрашивает и обрабатывает сообщение склада public string ProcessMessage() // Находит свободную ячейку public bool FindFreeCell(ref int CNum, ref int TagSt, ref int TagRow, ref int TagCol, bool IsReserve) // Возвращает координаты ячейки по номеру public bool GetCoord(int CNum, ref int Side, ref int Row, ref int Col) // Находит подшипники в складе на основании параметров ОСИ public bool FindBearingInStore(TAxleParam AxleParam)
// Конструктор public TTerminalBearing() // Запрашивает и обрабатывает статус терминала public void Process()
// Конструктор public TTerminalAxle() // Запрашивает и обрабатывает статус терминала public void Process()
// Конструктор public TCommandQueue(TStore store, TTerminalBearing terminalBearing) // Добавляет команду в очередь команд на указанную позицию public void AddCommand(int NameCommand, int CntRoll, int CellSourse, int CellTarget, TBearingParam PR, TAxleParam PA, int Position) // Удаляет команду из очереди public void DeleteCommand(int Position) // Выполняет первую команду в очереди public void ProcessCommand()
// Конструктор public TBearingParam()
// Конструктор public TAxleParam()
// Конструктор public TModel() // Метод, реализующий поток опроса public void QueryThreadExecute() // Метод, реализующий поток выполнения команд public void CommandThreadExecute()
// Возвращает полное название команды public string GetFullName()
// Добавляет запись в журнал сообщений системы static public void AddToLog(string LogMessage)
// Конструктор public MainForm
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.