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

Высокоуровневый дизайн

Разбить на страницы
Показывать лекцию целиком

Назначение

Данный документ описывает внутреннюю структуру, взаимодействие с окружением и внешние интерфейсы приложения. Приводится описание классов, их взаимодействие, а также описание их внешних и внутренних интерфейсов.

Определения и принятые сокращения

В настоящем документе приняты следующие определения и сокращения:

СокращениеОпределение
FS Документ cодержит технические требования, предъявляемые к функционированию программного продукта
HLD High Level Design. Содержит описание модульной структуры проекта и взаимодействия его модулей
Проект Проект симулятора морского боя

Слово "должен" определяет необходимое требование к продукту. Слова "может", "предполагает", "способен" определяют направление работ, которое подлежит дальнейшему уточнению.

Описание структуры проекта

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

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

Методы внешнего модуля Axle

//Получение сообщения от терминала оси

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) Окружение системы

Методы внешнего модуля Bearing

//Получение сообщения от терминала подшипника

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)

Методы внешнего модуля Store

//Получение сообщения от 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)

ОПИСАНИЕ КЛАССОВ

Класс TBearingParam

// Класс параметров подшипника
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()
}

Класс реализует набор параметров подшипника.

Класс TTerminalBearing

// Класс терминала подшипника
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);
  • Если получены другие значения статуса терминала, то в журнал сообщений добавляется запись в соответствии с FS пункт 1.а.iv.

    Класс TAxleParam

    // Класс параметров оси
    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;    //Номер группы передний
    }

    Класс реализует набор параметров оси.

    Класс TTerminalAxle

    // Класс терминала оси
    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).
  • Если получены другие значения статуса терминала, то в журнал сообщений добавляется запись в соответствии с FS пункт 2.

    Класс TCommand

    // Класс команды
    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, если он является допустимым кодом. В противном случае возвращается сообщение "ОШИБКА: Неверный код команды". Может применяться в любой момент.
  • Для выполнения конструктора не требуется никаких предварительных условий.

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

    Класс TСomm andQueue

    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)
    }

    Класс TStore

    Класс реализует терминал склада.

    Операции:

  • Метод GetStatus() вызывает функцию внешнего модуля IStore.GetStoreStat(...) и в случае, если она вернула 0, GetStatus() возвращает значение статуса склада, в противном случае возвращается -1.
  • Метод AddBearingAxle() добавляет запись об обслуженной оси в базу данных на основе переданной в качестве параметра команды.
  • Метод AddBearing() добавляет запись о принятом подшипнике в базу данных на основе переданной в качестве параметра команды.
  • Метод RemoveBearing() удаляет запись о выданном подшипнике из базы данных на основе переданной в качестве параметра команды.
  • Метод MarkCellBad(...) помечает ячейку как проблемную, порядковый номер ячейки передается как параметр.
  • Метод GetMessage() вызывает функцию внешнего модуля IStore.GetStoreMessage(...) и возвращает код сообщения склада
  • Конструктор TStore() читает из конфигурационного файла имя сервера SQL , имя пользователя, пароль и инициализирует все поля типа SqlConnection.
  • Метод Process() вызывает метод GetStatus(). В зависимости от полученного статуса склада он производит следующие действия:
  • Статус = 32. Добавляется сообщение в журнал и вызывается метод обработки ситуации прихода подшипника - TerminalBearing.Process().
  • Статус = 16. Добавляется сообщение в журнал и вызывается метод постановки команды "Положить в резерв" в очередь CommandQueue.AddCommand().
  • Статус = 8. Добавляется сообщение в журнал.
  • Статус = 4. Добавляется сообщение в журнал и вызывается метод постановки команды "Произвести зануление" в очередь CommandQueue.AddCommand().
  • Статус = 0. Добавляется сообщение в журнал.
  • При любом другом статусе в журнал добавляется сообщение об ошибке.
  • Метод ProcessMessage() вызывает метод GetMessage() и в зависимости от полученного результата выполняет следующие действия:
  • Полученный результат - -1. Добавляется сообщение в журнал. Предпринимается повторная попытка получить сообщение, после второй неудачной попытки происходит выход из приложения.
  • Полученный результат - 0. Добавляется сообщение в журнал. Продолжается опрос (вызов метода GetMessage() ).
  • Полученный результат -1. Добавляется сообщение в журнал. Производит обновление базы данных по выданному или принятому подшипнику и удаляет команду из очереди.
  • Полученный результат -2. Добавляется сообщение в журнал. Пытается выполнить команду повторно, после второй неудачной попытки удаляет команду из очереди.
  • Полученный результат -3. Добавляется сообщение в журнал. Пытается выполнить команду повторно, после второй неудачной попытки удаляет команду из очереди.
  • Операция 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)
    }

    Класс TLog

    Класс реализует журнал сообщений системы.

    Операции:

  • Метод 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()
    }

    Класс TModel

    Класс реализует журнал сообщений системы.

    Операции:

  • Метод QueryThreadExecute() реализует поток опроса. Здесь последовательно вызываются методы TStore.Process() и TTerminalAxle.Process().
  • Метод CommandThreadExecute() реализует поток выполнения команд. Здесь вызывается метод TcommandQueue.ProcessCommand().
  • ОПИСАНИЕ ВЗАИМОСВЯЗЕЙ КЛАССОВ

    Взаимосвязи классов

    Общая диаграмма классов, используемых в системе

    Система должна быть реализована в виде набора классов, представленного на рис. 14.3.

    (рис 14.3) Диаграмма классов

    Описание интерфейсного взаимодействия

    Общедоступные интерфейсы классов (подробное описание приведенных методов изложено в п. 2):

    TStore

    // Запрашивает и обрабатывает статус склада
    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)

    TTerminalBearing

    // Конструктор
    public TTerminalBearing()
    // Запрашивает и обрабатывает статус терминала
    public void Process()

    TTerminalAxle

    // Конструктор
    public TTerminalAxle()
    // Запрашивает и обрабатывает статус терминала
    public void Process()

    TCommandQueue

    // Конструктор
    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()

    TBearingParam

    // Конструктор
    public TBearingParam()

    TAxleParam

    // Конструктор
    public TAxleParam()

    TModel

    // Конструктор
    public TModel()
    // Метод, реализующий поток опроса
    public void QueryThreadExecute()
    // Метод, реализующий поток выполнения команд
    public void CommandThreadExecute()

    TCommand

    // Возвращает полное название команды
    public string GetFullName()

    TLog

    // Добавляет запись в журнал сообщений системы
    static public void AddToLog(string LogMessage)

    TMainForm

    // Конструктор
    public MainForm
    Страницы:

    Назначение

    Данный документ описывает внутреннюю структуру, взаимодействие с окружением и внешние интерфейсы приложения. Приводится описание классов, их взаимодействие, а также описание их внешних и внутренних интерфейсов.

    Определения и принятые сокращения

    В настоящем документе приняты следующие определения и сокращения:

    СокращениеОпределение
    FS Документ cодержит технические требования, предъявляемые к функционированию программного продукта
    HLD High Level Design. Содержит описание модульной структуры проекта и взаимодействия его модулей
    Проект Проект симулятора морского боя

    Слово "должен" определяет необходимое требование к продукту. Слова "может", "предполагает", "способен" определяют направление работ, которое подлежит дальнейшему уточнению.

    Описание структуры проекта

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

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

    Методы внешнего модуля Axle

    //Получение сообщения от терминала оси

    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) Окружение системы

    Методы внешнего модуля Bearing

    //Получение сообщения от терминала подшипника

    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)

    Методы внешнего модуля Store

    //Получение сообщения от 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)

    ОПИСАНИЕ КЛАССОВ

    Класс TBearingParam

    // Класс параметров подшипника
    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()
    }

    Класс реализует набор параметров подшипника.

    Класс TTerminalBearing

    // Класс терминала подшипника
    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);
  • Если получены другие значения статуса терминала, то в журнал сообщений добавляется запись в соответствии с FS пункт 1.а.iv.

    Класс TAxleParam

    // Класс параметров оси
    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;    //Номер группы передний
    }

    Класс реализует набор параметров оси.

    Класс TTerminalAxle

    // Класс терминала оси
    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).
  • Если получены другие значения статуса терминала, то в журнал сообщений добавляется запись в соответствии с FS пункт 2.

    Класс TCommand

    // Класс команды
    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, если он является допустимым кодом. В противном случае возвращается сообщение "ОШИБКА: Неверный код команды". Может применяться в любой момент.
  • Для выполнения конструктора не требуется никаких предварительных условий.

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

    Класс TСomm andQueue

    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)
    }

    Класс TStore

    Класс реализует терминал склада.

    Операции:

  • Метод GetStatus() вызывает функцию внешнего модуля IStore.GetStoreStat(...) и в случае, если она вернула 0, GetStatus() возвращает значение статуса склада, в противном случае возвращается -1.
  • Метод AddBearingAxle() добавляет запись об обслуженной оси в базу данных на основе переданной в качестве параметра команды.
  • Метод AddBearing() добавляет запись о принятом подшипнике в базу данных на основе переданной в качестве параметра команды.
  • Метод RemoveBearing() удаляет запись о выданном подшипнике из базы данных на основе переданной в качестве параметра команды.
  • Метод MarkCellBad(...) помечает ячейку как проблемную, порядковый номер ячейки передается как параметр.
  • Метод GetMessage() вызывает функцию внешнего модуля IStore.GetStoreMessage(...) и возвращает код сообщения склада
  • Конструктор TStore() читает из конфигурационного файла имя сервера SQL , имя пользователя, пароль и инициализирует все поля типа SqlConnection.
  • Метод Process() вызывает метод GetStatus(). В зависимости от полученного статуса склада он производит следующие действия:
  • Статус = 32. Добавляется сообщение в журнал и вызывается метод обработки ситуации прихода подшипника - TerminalBearing.Process().
  • Статус = 16. Добавляется сообщение в журнал и вызывается метод постановки команды "Положить в резерв" в очередь CommandQueue.AddCommand().
  • Статус = 8. Добавляется сообщение в журнал.
  • Статус = 4. Добавляется сообщение в журнал и вызывается метод постановки команды "Произвести зануление" в очередь CommandQueue.AddCommand().
  • Статус = 0. Добавляется сообщение в журнал.
  • При любом другом статусе в журнал добавляется сообщение об ошибке.
  • Метод ProcessMessage() вызывает метод GetMessage() и в зависимости от полученного результата выполняет следующие действия:
  • Полученный результат - -1. Добавляется сообщение в журнал. Предпринимается повторная попытка получить сообщение, после второй неудачной попытки происходит выход из приложения.
  • Полученный результат - 0. Добавляется сообщение в журнал. Продолжается опрос (вызов метода GetMessage() ).
  • Полученный результат -1. Добавляется сообщение в журнал. Производит обновление базы данных по выданному или принятому подшипнику и удаляет команду из очереди.
  • Полученный результат -2. Добавляется сообщение в журнал. Пытается выполнить команду повторно, после второй неудачной попытки удаляет команду из очереди.
  • Полученный результат -3. Добавляется сообщение в журнал. Пытается выполнить команду повторно, после второй неудачной попытки удаляет команду из очереди.
  • Операция 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)
    }

    Класс TLog

    Класс реализует журнал сообщений системы.

    Операции:

  • Метод 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()
    }

    Класс TModel

    Класс реализует журнал сообщений системы.

    Операции:

  • Метод QueryThreadExecute() реализует поток опроса. Здесь последовательно вызываются методы TStore.Process() и TTerminalAxle.Process().
  • Метод CommandThreadExecute() реализует поток выполнения команд. Здесь вызывается метод TcommandQueue.ProcessCommand().
  • ОПИСАНИЕ ВЗАИМОСВЯЗЕЙ КЛАССОВ

    Взаимосвязи классов

    Общая диаграмма классов, используемых в системе

    Система должна быть реализована в виде набора классов, представленного на рис. 14.3.

    (рис 14.3) Диаграмма классов

    Описание интерфейсного взаимодействия

    Общедоступные интерфейсы классов (подробное описание приведенных методов изложено в п. 2):

    TStore

    // Запрашивает и обрабатывает статус склада
    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)

    TTerminalBearing

    // Конструктор
    public TTerminalBearing()
    // Запрашивает и обрабатывает статус терминала
    public void Process()

    TTerminalAxle

    // Конструктор
    public TTerminalAxle()
    // Запрашивает и обрабатывает статус терминала
    public void Process()

    TCommandQueue

    // Конструктор
    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()

    TBearingParam

    // Конструктор
    public TBearingParam()

    TAxleParam

    // Конструктор
    public TAxleParam()

    TModel

    // Конструктор
    public TModel()
    // Метод, реализующий поток опроса
    public void QueryThreadExecute()
    // Метод, реализующий поток выполнения команд
    public void CommandThreadExecute()

    TCommand

    // Возвращает полное название команды
    public string GetFullName()

    TLog

    // Добавляет запись в журнал сообщений системы
    static public void AddToLog(string LogMessage)

    TMainForm

    // Конструктор
    public MainForm
    Вернуться к учебному плану