44416

Разработка специального ПО системы нештатных ситуаций тренажера «ФГБ» средствами тренажерной распределенной исполнительной оболочки (ТРИО)

Курсовая

Информатика, кибернетика и программирование

Тренажер CМ представляет собой комплекс вычислительной и телевизионной техники в значительной мере чувствительной к колебаниям и провалам сетевого напряжения, уровням кратковременных и длительных помех, перерывам в электропитании. СЭП предназначена для преобразования и распределения электрической энергии к токоприемникам...

Русский

2013-11-12

1.26 MB

0 чел.


Содержание

  1.  Введение 3
  2.  Теоретическая часть 10
  3.  Практическая часть 12
  4.  Заключение 28
  5.  Список используемой литературы 29
  6.  Приложения 30


1.Введение

Комплексный тренажер ФГБ предназначен для подготовки экипажей по программе МКС на базе РГНИИЦПК им. Ю.А. Гагарина как в режиме автономной работы тренажера, так в составе комплекса тренажеров Российского  сегмента (РС) МКС.

Состав тренажера

  •  Рабочее место оператора (РМО).
  •  Рабочее место инструктора (РМИ).
  •  Система электропитания (СЭП).
  •  Вычислительная система (ВС).
  •  Система моделирования объекта (СМО).
  •  Система управления тренировкой (СУТ).
  •  Устройства сопряжения с объектом (УСО).
  •  Система имитации связи «Борт-Земля» (СИСБЗ).

РМО представляет собой макет служебного модуля РС МКС с размещенным в нем оборудованием тренажерного исполнения.

РМИ представлено в виде ПКУ ФГБ и функционально обеспечивает три рабочих места инструктора с информационным полем коллективного пользования.

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

- управление режимами тренировки;

  •  оперативный контроль действий обучаемых по состоянию моделируемых систем и бортового оборудования;
  •  ввод команд и нештатных ситуаций (НшС) в соответствии с программой тренировки.

Пульт контроля и управления тренажера ФГБ




Вычислительная система обеспечивает выполнение следующих функциональных задач в реальном масштабе времени:

- математическое моделирование работы части бортовых систем СМ;

- сопряжение тренажёра с другими тренажерами МКС, включая тренажёр (имитатор) американского сегмента (AST);

- сопряжение и организация взаимодействия подсистем тренажёра с моделью бортовой вычислительной системы;

- управление средствами ввода-вывода информации на модули сопряжения подсистем тренажёра с аппаратурой.

Структура вычислительной системы комплекса тренажеров РС МКС приведена на рисунке.

Система управления тренировкой (СУТ) предназначена для управления процессом тренировки экипажа,  контроля текущего состояния технических и программных средств тренажера и обеспечивает необходимый для этого информационный интерфейс инструктора и инженеров тренажера.

СУТ обеспечивает решение следующих задач:

  •  ввод начальных исходных данных для тренировки;
  •  управление моделируемыми системами ФГБ;
  •  контроль состояния бортовых систем, бортового оборудования и научной аппаратуры в макете;
  •  контроль за действиями операторов в РМО тренажёра в процессе тренировки;
  •  отображение на мониторах, установленных на ПКУ, сюжетов, наблюдаемых экипажем в оптических и телевизионных средствах наблюдения;
  •  ввод нештатных ситуаций;
  •  ввод команд управления тренировкой и тренажёром;
  •  отображение на видеомониторах, установленных на ПКУ, сюжетов, наблюдаемых нештатными телекамерами макета;
  •  отображение на экранах дисплеев информации о протекании динамических режимов;
  •  отображение на видеомониторах ПКУ моделируемых сигналов бортовой телевизионной системы;
  •  включение-выключение пультов, светильников и телекамер в макете, управление выбором наблюдаемого сюжета на мониторах, управление работой нештатных телекамер наблюдения, отключение аварийных звуковых сигналов в макете и на ПКУ;
  •  ведение переговоров с находящимся в макете экипажем при помощи имитатора радиосвязи.
  •  дальнейшую интеграцию в состав комплекса тренажеров Российского сегмента (КТРС) МКС.

Комплекс УСО тренажера ФГБ предназначен для физического, логического и информационного сопряжения вычислительной системы (ВС) тренажера с оборудованием макета модуля ФГБ РС МКС

Тренажер CМ представляет собой  комплекс вычислительной и телевизионной техники в значительной мере чувствительной к колебаниям и провалам сетевого напряжения, уровням кратковременных и длительных помех, перерывам в электропитании. СЭП предназначена для преобразования и распределения электрической энергии к токоприемникам, обеспечения безопасности обслуживающего персонала и пользователей от воздействия электрического тока при эксплуатации, обслуживании и ремонте в соответствии с ГОСТ 12.1.030-81, ГОСТ В 20.39.107-84, ГОСТ РВ.20.39.308-98.

СИСБЗ предназначена для имитации связи "Борт-Земля" в соответствии со штатной логикой  как в автономной, так и в комплексной работе с тренажером ФГБ.

СМО тренажёра ФГБ предназначено моделирования процесса функционирования задействованных в контуре управления бортовых систем:

- система внутреннего освещения (СВнО);

- система электроснабжения (СЭС);

- бортовая вычислительная система (БВС);

- система стыковки и внутреннего перехода (ССВП);

- система обеспечения терморегулирования (СОТР);

- система управления бортовой аппаратурой (СУБА);

- система жизнеобеспечения (СЖО);

- система телефонно-телеграфной связи (СТТС).


2. Теоретическая часть

Структура разработанной бортовой системы «Система разработки нештатных ситуаций» следующая:

- расчетный модуль (стандартная модель) «Savelev»;

- расчетный модуль (модель нестандартного абонента) «Savelev_NA»;

- интерфейсный (формат) прикладной модуль «FSavelev»;

- нестандартный абонент – приложение «Project 1».

Межмодульные связи (протокол обмена) в общем виде представлен на рисунке 3.

Рисунок 4 – Протокол обмена

Межмодульные связи (протокол обмена) системы внутреннего освещения ФГБ представлены на рисунке 4.

Рисунок 5 – Протокол обмена системы внутреннего освещения ФГБ


3. Практическая часть

3.1 Описание программы Savelev

Аннотация

Описана программа интерфейса системы нештатных ситуаций тренажера «ФГБ». Приведены общие сведения о программе, её функциональное назначение, логическая структура, способ применения. Указаны использованные технические средства.

3.1.1Общие сведения

Название программы.

Система нештатных ситуаций тренажера «ФГБ».

Обозначение программы.

Программа Savelev содержится в файле динамически загружаемой библиотеки Savelev.dll, содержащейся в подкаталоге \DFCTSIMS\Sample\DLL.

Состав исходных файлов по модели:

Savelev.bpf – файл проекта;

Savelev.bpr– файл установок опций проекта;

Savelev.mak – обработчик сценария трансляции;

Savelev.CPP – файл реализации модели Savelev (листинг программы в Приложении А);

Savelev.H – заголовочный файл модели Savelev;

Savelev.res – файл ресурсов проекта.

Исходные файлы модели Savelev  расположены в подкаталоге:

/DFCTSIMS/ Sample /SRC/MODELS / Savelev.

Программное обеспечение (ПО), необходимое для функционирования программы.

Savelev является составной частью специального математического обеспечения тренажера «ФГБ». Для ее функционирования необходимо следующее ПО:

- рабочего места инструктора тренажера «ФГБ» (загрузочный файл – Sample.cmd).

Языки программирования, на которых написана программа.

Для реализации моделей применялся язык программирования C++.

Среда разработки – Borland  C++Builder 6.

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

Модель системы нештатных ситуаций тренажера «ФГБ» должна обеспечивать:

- контроль состояния ФГБ с помощью соответствующего интерфейса (формата);

 3.1.3 Описание логической структуры

Используемые методы.

Для реализации модели Savelev был применен следующий метод.

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

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

Структура программы Savelev является общей и содержит модули: Init, Set, Run, CommandRouter.  Вызов модулей осуществляется системными командами общего математического обеспечения (ОМО) ТРИО.

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

Установка начальных значений переменных состояния объекта для процесса моделирования производится в модуле Set. Вызов этого модуля производится при отработке системной команды «Отработка начальных условий».

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

Связи с программами.

Связь программы с другими программами осуществляется через:

  •  выходные переменные;
  •  обрабатываемые команды.

Обмен переменными и командами между программами осуществляется средствами ОМО.

Управление Savelev может осуществляться

- из формата FSavelev.

Работа должна контролироваться:

- на формате FSavelev.

3.1.4 Используемые технические средства

ПО рабочего места инструктора (инженера) размешается на персональном компьютере типа IBM PC или совместимом, оснащенном операционной системой Windows NT/98/2000/XP и имеющем характеристики не хуже:

оперативная память: не менее 64 Мб для Windows NT/98 и 256 МБ для Windows 2000/XP;

свободное пространство на диске для автономной работы заранее подготовленного исполняемого модуля около 8,5 Мб;

свободное пространство на диске для получения исполняемого модуля из исходных текстов – не менее 19 Мб;

свободное пространство на диске для работы в составе тренажерного комплекса – не менее 50 Мб.

3.1.5 Вызов и загрузка

Файл модели Savelev.dll  не является исполняемым, он предназначен для использования общим математическим обеспечением (ОМО) тренажера «ФГБ».

Для использования модели Savelev содержащая её библиотека Savelev.dll должна быть помещена в каталог D:\DFCTSIMS\Sample\DLL и в конфигурационном файле s1b0n.cfg, расположенном в каталоге \DFCTSIMS\ Sample, должна присутствовать секция, включающая эту модель в конфигурацию СМО тренажера «ФГБ».

3.1.6 Выходные данные

Таблица 1. Перечень выходных переменных программы Savelev

Наименование переменной

Обозначение в  программе

Тип

Начальное значение

ПРД1 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРД2 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРД1 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРД2 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ1 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ2 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ1 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ2 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

МБС (1 - активна, 0 – не активна)

Р2

long

0

Аккустика (1 - активна, 0 – не активна)

Р2

long

0

Связь при выходе (1 - активна, 0 – не активна)

Р2

long

0


3.2 Описание программы
FSavelev

Аннотация

Описана программа интерфейса (формата) системы нештатных ситуаций тренажера «ФГБ». Приведены общие сведения о программе, её функциональное назначение, логическая структура, способ применения. Указаны использованные технические средства.

3.2.1Общие сведения

Название программы.

Интерфейс системы нештатных ситуаций тренажера «ФГБ».

Обозначение программы.

Программа FSavelev содержится в файле динамически загружаемой библиотеки FSavelev.dll, содержащейся в подкаталоге \DFCTSIMS\Sample\DLL.

Состав исходных файлов по формату F_Lubenchenko_M:

FSavelev.bpf– исходный файл проекта;

FSavelev.bpr– исходный файл установок опций проекта;

FSavelev.mak  - обработчик сценария трансляции проекта;

FSavelev.RES - файл ресурсов проекта;

FSavelev.CPP - головной файл проекта;

FSavelev.CPP - файл реализации модуля FSavelev;

FSavelev.DFM - файл формы модуля FSavelev;

FSavelev.H - заголовочный файл формы FSavelev.

Исходные файлы модели FSavelev расположены в подкаталоге:

/DFCTSIMS/Sample/SRC /FORMATS/Command/FSavelev.

Программное обеспечение (ПО), необходимое для функционирования программы.

FSavelev является составной частью специального математического обеспечения тренажера «ФГБ». Для ее функционирования необходимо следующее ПО:

- рабочего места инструктора тренажера «FGB» (загрузочный файл – Sample.cmd);

- модель системы внутреннего освещения ФГБ (Savelev.dll)

Языки программирования, на которых написана программа.

Для реализации моделей применялся язык программирования C++.

Среда разработки – Borland  C++Builder 6. (Листинг приведен в приложении Б).

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

Формат FSavelev должен обеспечивать:

- изображение включенных НШС;

- изображение выключенных НШС;

-изменение состояния НШС по внешнему воздействию.

Рисунок 6 – Формат FSavelev

 3.2.3. Описание логической структуры

Используемые методы.

Для реализации формата FSavelev был применен следующий метод.

Непрерывные процессы моделировались путем отображения новых значений переменных состояния моделируемого объекта через достаточно малые промежутки времени; при этом на каждом такте - 1 c принимались во внимание изменения входных данных, предоставляемых моделями тренажера «ФГБ».

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

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

Структура программы FSavelev является общей и содержит модули: initForm, messageRouter, closeForm.

Вызов модулей осуществляется системными командами ОМО.

Установка начальных значений рабочих переменных формата производится в модуле initForm. Вызов этого модуля производится один раз при открытии формата FSavelev.

Формирование непрерывных процессов производится в модуле messageRouter. Вызов этого модуля производится в режиме «Пуск» тренажера периодически с тактом 1 с по событию UM_CHANGEWINDOWVALUE.

Моделирование дискретных процессов производится путем отработки модельных команд в модулях mouseRouter (реакция от щелчков мыши).

По закрытии интерфейса FSavelev осуществляется вызов модуля closeForm, для корректной выгрузки формата.

Связи с программами.

Связь программы с другими программами осуществляется через:

  •  входные переменные;
  •  генерируемые команды.

Обмен переменными и командами между программами осуществляется средствами ОМО.

Управление форматом FSavelev должно осуществляться

- из модели Savelev.

3.2.4 Используемые технические средства

ПО рабочего места инструктора (инженера) размешается на персональном компьютере типа IBM PC или совместимом, оснащенном операционной системой Windows NT/98/2000/XP и имеющем характеристики не хуже:

оперативная память: не менее 64 Мб для Windows NT/98 и 256 МБ для Windows 2000/XP;

свободное пространство на диске для автономной работы заранее подготовленного исполняемого модуля около 8,5 Мб;

свободное пространство на диске для получения исполняемого модуля из исходных текстов –не менее 19 Мб;

свободное пространство на диске для работы в составе тренажерного комплекса – не менее 50 Мб.

3.2.5 Вызов и загрузка

Файл модели FSavelev.dll  не является исполняемым, он предназначен для использования общим математическим обеспечением (ОМО) тренажера «ФГБ».

Для использования модели FSavelev содержащая её библиотека FSavelev.dll    должна быть помещена в каталоге D:\DFCTSIMS\Sample\DLL.

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

3.2.6. Входные данные

Таблица 2. Перечень входных переменных программы FSavelev

Наименование переменной

Обозначение в  программе

Тип

Начальное значение

ПРД1 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРД2 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРД1 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРД2 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ1 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ2 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ1 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ2 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

МБС (1 - активна, 0 – не активна)

Р2

long

0

Аккустика (1 - активна, 0 – не активна)

Р2

long

0

Связь при выходе (1 - активна, 0 – не активна)

Р2

long

0


3.3 Описание программы
Savelev_NA

Аннотация

Описана программа интерфейса системы нештатных ситуаций тренажера «ФГБ». Приведены общие сведения о программе, её функциональное назначение, логическая структура, способ применения. Указаны использованные технические средства.

3.3.1Общие сведения

Название программы.

Модель нестандартного абонента системы нештатных ситуаций тренажера «ФГБ».

Обозначение программы.

Программа Savelev _NA содержится в файле динамически загружаемой библиотеки Savelev_NA.dll, содержащейся в подкаталоге \DFCTSIMS\Sample\DLL.

Состав исходных файлов по модели:

Savelev_NA.bpf – файл проекта;

Savelev_NA.bpr– файл установок опций проекта;

Savelev_NA.mak – обработчик сценария трансляции;

Savelev_NA.CPP – файл реализации модели Savelev (листинг программы в Приложении В);

Savelev_NA.H – заголовочный файл модели Savelev;

Savelev_NA.res – файл ресурсов проекта.

Исходные файлы модели Savelev  расположены в подкаталоге:

/DFCTSIMS/ Sample /SRC/MODELS / Savelev_NA.

Программное обеспечение (ПО), необходимое для функционирование программы.

Savelev _NA является составной частью специального математического обеспечения тренажера «ФГБ». Для ее функционирования необходимо следующее ПО:

- рабочего места инструктора тренажера «ФГБ» (загрузочный файл – s1b0n.cmd).

Языки программирования, на которых написана программа.

Для реализации моделей применялся язык программирования C++.

Среда разработки – Borland  C++Builder 6.

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

Модель системы нештатных ситуаций тренажера «ФГБ» должна обеспечивать:

- контроль состояния ФГБ с помощью соответствующего интерфейса (формата);

 3.3.3 Описание логической структуры

Используемые методы.

Для реализации модели Savelev_NA был применен следующий метод.

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

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

Структура программы Savelev_NA является общей и содержит модули: Init, Set, Run, CommandRouter.  Вызов модулей осуществляется системными командами общего математического обеспечения (ОМО) ТРИО.

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

Установка начальных значений переменных состояния объекта для процесса моделирования производится в модуле Set. Вызов этого модуля производится при отработке системной команды «Отработка начальных условий».

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

Связи с программами.

Связь программы с другими программами осуществляется через:

  •  входные переменные;
  •  обрабатываемые команды.

Обмен переменными и командами между программами осуществляется средствами ОМО.

Управление Savelev_NA может осуществляться

- из приложения Project1.

Работа должна контролироваться:

- на формате FSavelev.

3.3.4 Используемые технические средства

ПО рабочего места инструктора (инженера) размешается на персональном компьютере типа IBM PC или совместимом, оснащенном операционной системой Windows NT/98/2000/XP и имеющем характеристики не хуже:

оперативная память: не менее 64 Мб для Windows NT/98 и 256 МБ для Windows 2000/XP;

свободное пространство на диске для автономной работы заранее подготовленного исполняемого модуля около 8,5 Мб;

свободное пространство на диске для получения исполняемого модуля из исходных текстов – не менее 19 Мб;

свободное пространство на диске для работы в составе тренажерного комплекса – не менее 50 Мб.

3.3.5 Вызов и загрузка

Файл модели Savelev_NA.dll  не является исполняемым, он предназначен для использования общим математическим обеспечением (ОМО) тренажера «ФГБ».

Для использования модели Savelev_NA содержащая её библиотека Savelev_NA.dll должна быть помещена в каталог D:\DFCTSIMS\Sample\DLL и в конфигурационном файле s1b0n.cfg, расположенном в каталоге \DFCTSIMS\ Sample, должна присутствовать секция, включающая эту модель в конфигурацию СМО тренажера «ФГБ».

3.3.6 Входные данные

Таблица 3. Перечень входных переменных программы Savelev_NA

Наименование переменной

Обозначение в  программе

Тип

Начальное значение

ПРД1 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРД2 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРД1 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРД2 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ1 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ2 УКВ1 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ1 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

ПРМ2 УКВ2 (1 - активна, 0 – не активна)

Р2

long

0

МБС (1 - активна, 0 – не активна)

Р2

long

0

Аккустика (1 - активна, 0 – не активна)

Р2

long

0

Связь при выходе (1 - активна, 0 – не активна)

Р2

long

0

3.4 Описание программы Project1

Аннотация

Описана программа интерфейса системы нештатных ситуаций тренажера «ФГБ». Приведены общие сведения о программе, её функциональное назначение, логическая структура, способ применения. Указаны использованные технические средства.

3.4.1Общие сведения

Название программы.

Нестандартный абонент системы нештатных ситуаций тренажера «ФГБ».

Языки программирования, на которых написана программа.

Для реализации моделей применялся язык программирования C++.

Среда разработки – Borland  C++Builder 6. Листинг приведен в Приложении Г.

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

Нестандартный абонент системы внутреннего освещения ФГБ должен обеспечивать:

- контроль состояния ФГБ с помощью соответствующего интерфейса (формата);

Связи с программами.

Связь программы с другими программами осуществляется через:

  •  входные команды;
  •  выходные команды.

 

3.4.3 Используемые технические средства

ПО рабочего места инструктора (инженера) размешается на персональном компьютере типа IBM PC или совместимом, оснащенном операционной системой Windows NT/98/2000/XP и имеющем характеристики не хуже:

оперативная память: не менее 64 Мб для Windows NT/98 и 256 МБ для Windows 2000/XP;

свободное пространство на диске для автономной работы заранее подготовленного исполняемого модуля около 8,5 Мб;

свободное пространство на диске для получения исполняемого модуля из исходных текстов – не менее 19 Мб;

свободное пространство на диске для работы в составе тренажерного комплекса – не менее 50 Мб.

3.4.4 Обрабатываемые команды

Таблица 4. Перечень выходных команд программы Project1

Наименование команды

Код команды

Назначение параметров

Поменять состояние НШС

60600

1-й параметр: 0-10 (номер НШС)

Таблица 5. Перечень входных команд программы Project1

Назначение команды

Код команды

Назначение параметров

Поменять состояние НШС

60600

1-й параметр: 0-10 (номер НШС)

2-й параметр: 0-состояние НШС – выключена;1 – состояние НШС - включена

Рисунок 7 – Форма нестандартного абонента Project1

  1.  
    Заключение

В ходе выполнения курсовой работы было разработано специальное ПО системы нештатных ситуаций тренажера «ФГБ» средствами тренажерной распределенной исполнительной оболочки (ТРИО).

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

  1.  Список используемой литературы

Гудзовская В.А. Методические указания и рекомендации к выполнению курсовой работы по дисциплине «Организация вычислений в распределенных системах реального времени» - 2011г. ЮРГТУ (НПИ).


Приложение
 А

Savelev.cpp

#include "APITRIO.H"

#include "Savelev.h"

//{SOURCE

//}SOURCE

Savelev *pSavelev = NULL;

int APIENTRY ModelEntryPoint(MODEL_ENTRY_POINT func, int param)

{

  switch (func) {

    case INIT:

       return pSavelev->Init(param);

    case SET:

       return pSavelev->Set(param);

    case RUN:

       return pSavelev->Run(param);

    case SAVE_STATE:

       return pSavelev->SaveState(param);

    case RESTORE_STATE:

       return pSavelev->RestoreState(param);

    case OUT_FROM:

       pSavelev->OutputFromCommonArea();

       return 0;

    case OUT_TO:

       pSavelev->OutputToCommonArea();

       return 0;

    case RECALC_TIME:

       return pSavelev->SetNewTime(param);

    case TERM:

       return pSavelev->TerminateModel();

    default: return -1;

  }

}

int APIENTRY CommandEntryPoint(unsigned int cmd, COMPARAM kp1, COMPARAM kp2)

{

  return pSavelev->CommandRouter(cmd,kp1,kp2);

}

void * APIENTRY CreateModel(void)

{

  pSavelev = new Savelev();

  return pSavelev;

}

void APIENTRY DestroyModel(void *p)

{

//{DESTROY

//}DESTROY

  if (pSavelev != NULL) delete pSavelev;

  pSavelev=NULL;

}

void Savelev::OutputFromCommonArea(void)

{

memcpy((void*)PSavelev,(void*)::PSavelev,sizeof(PSavelev));

}

void Savelev::OutputToCommonArea(void)

{

memcpy((void*)::PSavelev,(void*)PSavelev,sizeof(PSavelev));

}

int Savelev::SetNewTime(int prm)

{

return 0;

}

int Savelev::TerminateModel(void)

{

//{TERMINATE

//}TERMINATE

return 0;

}

int Savelev::Init(int prm)

{

//{INIT

PSavelev[0]=0;

PSavelev[1]=0;

PSavelev[2]=0;

PSavelev[3]=0;

PSavelev[4]=0;

PSavelev[5]=0;

PSavelev[6]=0;

PSavelev[7]=0;

PSavelev[8]=0;

PSavelev[9]=0;

PSavelev[10]=0;

PSavelev[11]=0;

//}INIT

  return 0;

}

int Savelev::Set(int prm)

{

//{SET

PSavelev[0]=0;

PSavelev[1]=0;

PSavelev[2]=0;

PSavelev[3]=0;

PSavelev[4]=0;

PSavelev[5]=0;

PSavelev[6]=0;

PSavelev[7]=0;

PSavelev[8]=0;

PSavelev[9]=0;

PSavelev[10]=0;

PSavelev[11]=0;

//}SET

  return 0;

}

int Savelev::Run(int ip)

{

//{RUN

//}RUN

  return 0;

}

int Savelev::SaveState(int prm)

{

//{SAVE

//}SAVE

  return 0;

}

int Savelev::RestoreState(int prm)

{

//{RESTORE

//}RESTORE

  return 0;

}

int Savelev::CommandRouter(int cmd, void *kp1, void *kp2)

{

  switch (cmd) {

case KSavelev: {//НШС

long p1 = LONGFROMKP(kp1);

char p2 = CHARFROMKP(kp2);

//{KSavelev

PSavelev[p1]=p2;

//}KSavelev

break;}

     default: return -1;

  }

  return 0;

}


Приложение
 Б

FSavelev.cpp

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include <stdio.h>

#include "FSavelevForm.h"

#include "trguilib.h"

#include "sutpmwin.h"

#include "apitrio.h"

//Установка необходимых определений для формата:

//{DEFINE

// ...

//}DEFINE

//Подключение необходимых include-файлов для формата:

//{INCLUDE

#include <stdio.h>

#include "FSavelev.hfm"

//}INCLUDE

//{SOURCE

//Глобальные переменные формата:

// ...

// end для глобальных переменных формата

/*

 Если фоновый рисунок загружается из DLL ресурсов (файл только  BMP OS/2 1.2),

 то определяются константы: nameBMP_DLL

                          и idBMP_DLL (это идентификатор BMP в DLL ресурсов).

 Если фоновый рисунок загружается из файла, то определяется

 константа nameBMP_File, а idBMP_DLL д.б. равна 0.

 Если для константы idBMP_DLL установлено значение < 0,

 то фоновый рисунок формата не создается.

*/

int idBMP_DLL=BACKGROUND_BMP_ABSENT;  //BACKGROUND_BMP_FROM_FILE;

const char nameBMP_DLL[]="";          //имя DLL ресурсов без расширения

const char nameBMP_File[]="";        //имя графического файла

int key;

// Вспомогательные функции оконного класса:

//BEGIN Service function

//...

//END Service function

//}SOURCE

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TFSavelevWin *FSavelevWin;

//---------------------------------------------------------------------------

__fastcall TFSavelevWin::TFSavelevWin(TComponent* Owner)

       : TForm(Owner)

{

}

void __fastcall TFSavelevWin::messageRouter(TMessage &msg)

{

unsigned int messageCode;

long p1,p2,res;

messageCode=msg.Msg;

p1=msg.WParam;

// p2=msg.LParam;

switch (messageCode)

 {

  case UM_CHANGEWINDOWVALUE:

  {

 // Panel1->Color=clWhite;

// Panel2->Color=clWhite

      if (PSavelev[0])

               Panel1->Color=clRed;

       else

               Panel1->Color=clWhite;

       if (PSavelev[1])

               Panel2->Color=clRed;

       else

               Panel2->Color=clWhite;

       if (PSavelev[2])

               Panel3->Color=clRed;

       else

               Panel3->Color=clWhite;

       if (PSavelev[3])

               Panel4->Color=clRed;

       else

               Panel4->Color=clWhite;

       if (PSavelev[4])

               Panel5->Color=clRed;

       else

               Panel5->Color=clWhite;

       if (PSavelev[5])

               Panel7->Color=clRed;

       else

               Panel7->Color=clWhite;

       if (PSavelev[6])

               Panel8->Color=clRed;

       else

               Panel8->Color=clWhite;

       if (PSavelev[7])

               Panel9->Color=clRed;

       else

               Panel9->Color=clWhite;

       if (PSavelev[8])

               Panel10->Color=clRed;

       else

               Panel10->Color=clWhite;

       if (PSavelev[9])

               Panel11->Color=clRed;

       else

               Panel11->Color=clWhite;

       if (PSavelev[10])

               Panel6->Color=clRed;

       else

               Panel6->Color=clWhite;

/*

  switch (PSavelev[)

  {

  case 0:  Panel1->Color=clRed;       break;

  case 1:   Panel2->Color=clRed;      break;

  case 2:   Panel3->Color=clRed;      break;

  case 3:   Panel4->Color=clRed;      break;

  case 4:   Panel5->Color=clRed;      break;

  case 5:   Panel7->Color=clRed;      break;

  case 6:   Panel8->Color=clRed;      break;

  case 7:   Panel9->Color=clRed;      break;

  case 8:   Panel10->Color=clRed;      break;

  case 9:   Panel11->Color=clRed;      break;

  case 10:   Panel6->Color=clRed;      break;

  }

*/

  }

  

   break;

  case UM_CHANGE_SMOSOUNDMODE:

   fSound=(int) p1;

   

   break;

  case UM_CHANGE_SMOFORMATMODE:

   formMode=p1;

   break;

 }

}

void __fastcall TFSavelevWin::mouseRouter(TMessage &msg)

{

unsigned int messageCode;

long p1,p2,res;

TWMCommand comMsg;

messageCode=msg.Msg;

// p1=msg.WParam;

// p2=msg.LParam;

switch (messageCode)

 {

/*

  case WM_CHAR:      //??

   sprintf(szMess,"Сообщение WM_CHAR(%d) p1=%d p2=%d",

           messageCode,p1,p2);

   break;

  case WM_COMMAND:     //Все клавиши, меню, акселераторы

   comMsg=(TWMCommand&) msg;

   sprintf(szMess,"Msg=%d ID=%d N=%d CTL=%d Res=%d",

           comMsg.Msg,comMsg.ItemID,comMsg.NotifyCode,comMsg.Ctl,comMsg.Result);

   MessLabel2->Caption=szMess;

   sprintf(szMess,"Сообщение WM_COMMAND(%d) p1=%d p2=%d",

           messageCode,p1,p2);

   break;

  case WM_INITDIALOG:    //??

   sprintf(szMess,"Сообщение WM_INITDIALOG(%d) p1=%d p2=%d",

           messageCode,p1,p2);

   break;

  case WM_KEYDOWN:           //??

   sprintf(szMess,"Сообщение WM_KEYDOWN(%d) p1=%d p2=%d",

           messageCode,p1,p2);

   break;

  case WM_KEYUP:                 //??

   sprintf(szMess,"Сообщение WM_KEYUP(%d) p1=%d p2=%d",

           messageCode,p1,p2);

   break;

*/

  case WM_LBUTTONDBLCLK:

   break;

  case WM_LBUTTONDOWN:

   break;

  case WM_LBUTTONUP:

   break;

  case WM_MBUTTONDOWN:

   break;

  case WM_MBUTTONUP:

   break;

  case WM_MOUSEMOVE:

   break;

//   case WM_PAINT:          //??

//    sprintf(szMess,"Сообщение WM_MOUSEMOVE(%d) p1=%d p2=%d",

//            messageCode,p1,p2);

//    MessLabel->Caption=szMess;

//    return 1;

  case WM_RBUTTONDOWN:

   break;

  case WM_RBUTTONUP:

   break;

//   case UM_POSTMESSAGE:

//    sprintf(szMess,"Сообщение UM_POSTMESSAGE(%d) p1=%d p2=%d",

//            messageCode,p1,p2);

//    break;

  default:

   return;

 }

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::receiveData()

{

char szBuf[256];

int * pInt=(int *)pPar;

/*int X= *pInt;

int Y=*(pInt+1);

int LData=*(pInt+2);

int vData=*(pInt+3);*/

//

//. . .

//

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::initForm(TObject *Sender)

{

//Подготовка идентификации пунктов меню и клавиш

//для commandRouter()

//пункты меню:

/*

Item11->Tag=11;

Item12->Tag=12;

Item21->Tag=21;

Item22->Tag=22;

Item23->Tag=23;

Item31->Tag=31;

*/

//клавиши:

/*

Button1->Tag=101;

Button2->Tag=102;

BitBtn1->Tag=103;

SpeedButton1->Tag=104;

*/

// this->Top=70;

// this->Left=10;

//исходные настройки формата

// ...

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::commandRouter(TObject *Sender)

{

TComponent * Obj=(TComponent*) Sender;

char szBuf[256];

int tag=Obj->Tag;

switch (tag)

 {

  //Menu commands

/*

  case 11:

   break;

  case 12:

   break;

  case 21:

   break;

  case 22:

   break;

  case 23:

   break;

  case 31:

   break;

*/

  //Button commands:

/*

  case 101:

   break;

  case 102:

   break;

  case 103:

   break;

  case 104:

   break;

*/    

 }

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::keyDownRouter(TObject *Sender, WORD &Key,

     TShiftState Shift)

{

//Для всех клавиш

//Key-виртуальный код клавиши

static char szBuf[256];

char szShift[80]="";

if ( Shift.Contains(ssShift) )

  {

   strcpy(szShift,"with Shift");

  }

 else

  if (Shift.Contains(ssAlt))

    {

     strcpy(szShift,"with Alt");

    }

   else

    if (Shift.Contains(ssCtrl))

     {

      strcpy(szShift,"with Ctrl");

     }

sprintf(szBuf,"OnKeyDown %c(%u) %s",

           Key,(unsigned char) Key),szShift;

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::keyUpRouter(TObject *Sender, WORD &Key,

     TShiftState Shift)

{

//Для всех клавиш

//Key-виртуальный код клавиши

//Shift-нажатие клавиш Shift,Alt,Ctrl

static char szBuf[256];

char szShift[80]="";

if ( Shift.Contains(ssShift) )

  strcpy(szShift,"with Shift");

 else

  if (Shift.Contains(ssAlt))

    strcpy(szShift,"with Alt");

   else

    if (Shift.Contains(ssCtrl))

     strcpy(szShift,"with Ctrl");

sprintf(szBuf,"OnKeyUp %c(%u) %s",

           Key,(unsigned char) Key),szShift;

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::keyPressRouter(TObject *Sender, char &Key)

{

//Для символьных клавиш

//Key-символ клавиши

 char szBuf[256];

sprintf(szBuf,"OnKeyPress %c(%u)",

           Key,(unsigned char) Key);

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::closeForm(TObject *Sender,

     TCloseAction &Action)

{

WindowClosed(this->Handle);       

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::ComboBox1Change(TObject *Sender)

{

key=ComboBox1->ItemIndex;

if (PSavelev[key])

TrioSendModelCommandNow(KSavelev, KPFROMLONG(key),COMPARAM(0),MODULE_ID);

else

TrioSendModelCommandNow(KSavelev, KPFROMLONG(key),COMPARAM(1),MODULE_ID);

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::Button1Click(TObject *Sender)

{

//PSavelev=' ';

Panel1->Color=clWhite;

Panel2->Color=clWhite;

Panel3->Color=clWhite;

Panel4->Color=clWhite;

Panel5->Color=clWhite;

Panel6->Color=clWhite;

Panel7->Color=clWhite;

Panel8->Color=clWhite;

Panel9->Color=clWhite;

Panel10->Color=clWhite;

Panel11->Color=clWhite;

}

//---------------------------------------------------------------------------

void __fastcall TFSavelevWin::Button2Click(TObject *Sender)

{

/*

PSavelev=key;

switch (PSavelev)

  {

  case 0:  Panel1->Color=clWhite;       break;

  case 1:   Panel2->Color=clWhite;      break;

  case 2:   Panel3->Color=clWhite;      break;

  case 3:   Panel4->Color=clWhite;      break;

  case 4:   Panel5->Color=clWhite;      break;

  case 5:   Panel7->Color=clWhite;      break;

  case 6:   Panel8->Color=clWhite;      break;

  case 7:   Panel9->Color=clWhite;      break;

  case 8:   Panel10->Color=clWhite;      break;

  case 9:   Panel11->Color=clWhite;      break;

  case 10:   Panel6->Color=clWhite;      break;

  }

 PSavelev=' ';

*/

}

//---------------------------------------------------------------------------


Приложение В

Savelev_NA.cpp

#include "APITRIO.H"

#include "Savelev_NA.h"

//{SOURCE

int mod_ID=2;

const unsigned char FRAME_TYPE=7;

const unsigned char NODE_ID=1;

int rc,i;

static char  *msg,*data;

unsigned int command, comtime, from;

COMPARAM par1, par2;

int PSavelev_old[12];

//}SOURCE

Savelev_NA *pSavelev_NA = NULL;

int APIENTRY ModelEntryPoint(MODEL_ENTRY_POINT func, int param)

{

  switch (func) {

    case INIT:

       return pSavelev_NA->Init(param);

    case SET:

       return pSavelev_NA->Set(param);

    case RUN:

       return pSavelev_NA->Run(param);

    case SAVE_STATE:

       return pSavelev_NA->SaveState(param);

    case RESTORE_STATE:

       return pSavelev_NA->RestoreState(param);

    case OUT_FROM:

       pSavelev_NA->OutputFromCommonArea();

       return 0;

    case OUT_TO:

       pSavelev_NA->OutputToCommonArea();

       return 0;

    case RECALC_TIME:

       return pSavelev_NA->SetNewTime(param);

    case TERM:

       return pSavelev_NA->TerminateModel();

    default: return -1;

  }

}

int APIENTRY CommandEntryPoint(unsigned int cmd, COMPARAM kp1, COMPARAM kp2)

{

  return pSavelev_NA->CommandRouter(cmd,kp1,kp2);

}

void * APIENTRY CreateModel(void)

{

  pSavelev_NA = new Savelev_NA();

  return pSavelev_NA;

}

void APIENTRY DestroyModel(void *p)

{

//{DESTROY

//}DESTROY

  if (pSavelev_NA != NULL) delete pSavelev_NA;

  pSavelev_NA=NULL;

}

void Savelev_NA::OutputFromCommonArea(void)

{

}

void Savelev_NA::OutputToCommonArea(void)

{

}

int Savelev_NA::SetNewTime(int prm)

{

return 0;

}

int Savelev_NA::TerminateModel(void)

{

//{TERMINATE

//}TERMINATE

return 0;

}

int Savelev_NA::Init(int prm)

{

//{INIT

mod_ID=TrioGetModId("Savelev_NA");

  if(mod_ID==0)

     return -1;

  if(TrioRegisterFrameRouter(FRAME_TYPE, COM_FROM_NHS)!=0)

    return -1;

 if (TrioRegisterSysComRouter(mod_ID, COM_TO_NHS)!=0)

    return -1;

          for (i=0;i<12;i++)

                PSavelev_old[i]=-1;

//}INIT

  return 0;

}

int Savelev_NA::Set(int prm)

{

//{SET

for (i=0;i<12;i++)

PSavelev_old[i]=-1;

//}SET

  return 0;

}

int Savelev_NA::Run(int ip)

{

//{RUN

for (i=0;i<12;i++)

{

 if (PSavelev_old[i]!=PSavelev[i])

{

PSavelev_old[i]=PSavelev[i];

TrioSendCommandToNodeNow(NODE_ID, 0x60600,KPFROMLONG(i),COMPARAM(PSavelev[i]));

}

}

//}RUN

  return 0;

}

int Savelev_NA::SaveState(int prm)

{

//{SAVE

//}SAVE

  return 0;

}

int Savelev_NA::RestoreState(int prm)

{

//{RESTORE

//}RESTORE

  return 0;

}

int Savelev_NA::CommandRouter(int cmd, void *kp1, void *kp2)

{

  switch (cmd) {

case COM_FROM_NHS: {//КОМАНДЫ ОТ НЕСТ АБОНЕНТА

//{COM_FROM_NHS

//Распаковка данных от нестандартного абонента NA_1.exe

msg=NULL;

   do

    {

      msg=TrioFindNextTrioFormatMsg((char *)kp1,

                                  msg,

                                  (unsigned int)kp2,

                                  &command,

                                  &par1,

                                  &par2,

                                  &comtime,

                                  &from,

                                  &data);

    if(msg==NULL)

   break;

     if(command & 0x80000000)

      {

        if(!(command & 0x10000000))

         rc=TrioSendCommandToNodeNow(NODE_ID,

                                   (unsigned int)(command|0x10000000),

                                   0,

                                   0);

        TrioSendSysCommand(command,

                         par1,

                         par2,

                         comtime,

                         mod_ID);

        continue;

      }

switch (command)

      {

//Выполнение протокола обмена с NA_1

         case 0x60600:

TrioSendModelCommandNow(KSavelev,COMPARAM(par1),COMPARAM(par2),MODULE_ID);

         break;

      }

    }  while(msg!=NULL);

//}COM_FROM_NHS

break;}

case COM_TO_NHS: {//КОМАНДЫ К НЕСТ АБОНЕНТУ

//{COM_TO_NHS

//}COM_TO_NHS

break;}

     default: return -1;

  }

  return 0;

}


Приложение
 Г

Unit1.cpp (Project1.exe)

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include <windows.h>

#include <windowsx.h>

#include <commctrl.h>

#include <messages.hpp>

#include <winsock.h>

TMessage Message;

WSADATA  WSAData;

char Temp[256];

HWND hWnd;

LPARAM lParam;

WPARAM wParam;

// Сокет сервера

SOCKET srv_socket ;

SOCKET srv_socket_dau;

struct sockaddr_in  srv_address;

int rc;

 UINT msg;

// Порт сервера

#define SERV_PORT 1850

// Длина использованного сокета

int acc_sin_len;

// Адрес использованного сокета

SOCKADDR_IN acc_sin;

// Обработка сообщения WSA_ACCEPT

void WndProc_OnWSAAccept(HWND hWnd, WPARAM wParam, LPARAM lParam);

// Обработка сообщения WSA_NETEVENT

void WndProc_OnWSANetEvent(HWND hWnd, WPARAM wParam, LPARAM lParam);

#include <string.h>

#include <stdio.h>

#include<time.h>

// Структура заголовка кадра

struct   header  { __int16 dlina;

             __int8 Idserv;

             __int8 Idclient;

             __int8 fcadr;

             __int8 T_kadr;

             __int16 reserv;

            }zag;

//Структура команд управления тренировкой, модельных

struct  { __int32 kodkom;

         __int32 par1;

         __int32 par2;

         __int32 vrema;

       }kom;

__int32 ini_ab;

__int32 zav_rab;

TTimeStamp milli1 ;

char szTemp[8000];

char sizeTemp[8];

int dd;

unsigned int k1,p1,p2,tim_k, k2=0x0000,k3=0x0000,k4=0x0000,k5=0x0000,k6=0x0000,k7=0x0000;

char buff_init[80], buff_ND[8], buff_com[80], buffz[80];

char *ima_serv;

char Work_with_TRIO;

int kb;

unsigned int vvv;

int Pr_COM;

long PSavelev[12];

int key;

int P_help[12];

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

       : TForm(Owner)

{

}

//---------------------------------------------------------------------------

void WndProc_OnWSAAccept(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

 int rc;

 int thread_id;

 int i=0;

 // При ошибке отменяем поступление извещений

 // в главное окно приложения

 if(WSAGETSELECTERROR(lParam) != 0)

 {

   MessageBox(NULL, "accept  Error", "Error", MB_OK);

   WSAAsyncSelect (srv_socket , hWnd, 0, 0);

   return;

 }

 // Определяем размер адреса сокета

 acc_sin_len = sizeof(acc_sin);

 // Разрешаем установку соединения

 srv_socket_dau  = accept (srv_socket, (LPSOCKADDR   )&acc_sin,

   (int FAR *)&acc_sin_len);

 if(srv_socket_dau == INVALID_SOCKET)

 {

   MessageBox(NULL, "accept  Error, invalid socket ",

     "Server", MB_OK);

   return;

 }

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

 // клиента, в главное окно приложения поступит

 // сообщение WSA_NETEVENT.

 // Это же сообщение поступит при разрыве соединения

 rc = WSAAsyncSelect (srv_socket_dau, hWnd, WSA_NETEVENT,

      FD_READ | FD_CLOSE );

 if(rc > 0)

 {

           closesocket  (srv_socket_dau);

           MessageBox(NULL, "WSAAsyncSelect  Error", "Error", MB_OK);

           return;

 }

}

//---------------------------------------------------------------------------

// -----------------------------------------------------

// Функция WndProc_OnWSANetEvent

// -----------------------------------------------------

void WndProc_OnWSANetEvent(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

 int rc;

 // Если на сокете выполняется передача данных,

 // принимаем и отображаем эти данные в виде

 // текстовой строки

 if(WSAGETSELECTEVENT(lParam) == FD_READ )

 {

//    rc = recv ((SOCKET)wParam, szTemp, 256, 0);

   rc = recv ((SOCKET)wParam, sizeTemp, 8, 0);

   if(rc!=8)

   {

//        ShowMessage("Error1!");

       return;

   }

//Определение кадра данных

   dd=*(( unsigned short*)(sizeTemp));  //определение размера кадра данных

   dd   = ntohs(dd);

   if(dd>8)

   {

       rc = recv ((SOCKET)wParam, szTemp, dd-8, 0);

       if(rc!=dd-8)

               ShowMessage("Error2!");

// Код команды   (определение значения)

     k1=*((unsigned int*)(szTemp));

     k1   = ntohl(k1);

     kb=0;

     }

     if(dd==8)

     {

           //Команда "Авария"

           if (Pr_COM)

           {

                   send(srv_socket_dau,buff_com,24,0);

                   *buff_com=0;

                   Pr_COM=0;

           }

           else       //Ответ "нет данных"

           send(srv_socket_dau,buff_ND,8,0);

           return;

     }

     if (dd>8)    //есть данные

     {

        if(k1==0xC0000004)

        {

              MessageBox(NULL, ("Connection closed "+IntToStr(wParam)).c_str(), "Server", MB_OK);

              //Закрытие соединения

              closesocket((SOCKET)wParam);

              return;

        }

        if(k1==0xC0000003)

        {

              //Ответ на команду инициализации

              send(srv_socket_dau,buff_init,12+strlen(ima_serv)+1,0);

//               iCnt++;

//               Form1->StatusBar1->SimpleText=iCnt;

              return;

        }

                 //Ответ "нет данных"

           //Команда "Авария"

           if (*buff_com!=0)

           {

                   send(srv_socket_dau,buff_com,24,0);

                   *buff_com=0;

           }

           else

               send(srv_socket_dau,buff_ND,8,0);

           while (kb<dd)

           {

      // Код команды   следующей (определение значения)

              k1=*((unsigned int*)(szTemp+kb));

              k1   = ntohl(k1);

              k1=0x00FFFFFF & k1;

              kb+=4;

      // 1-й параметр

              p1=*((unsigned int*)(szTemp+kb));

              p1   = ntohl(p1);

              kb+=4;

      // 2-й параметр

              p2=*((unsigned int*)(szTemp+kb));

              p2   = ntohl(p2);

              kb+=4;

      // время

              vvv=*(( unsigned int*)(szTemp+kb));

              vvv   = ntohl(vvv);

              kb+=4;

    //Инициализация сервера после отработки НУ

              if (k1==0x60600)

              {

               P_help[p1]=p2;

           if (p1==0)

           {

               if (p2==1)

               Form1->Panel1->Color=clRed;

               else

               Form1->Panel1->Color=clWhite;

           }

       if (p1==1)

           {

               if (p2==1)

               Form1->Panel2->Color=clRed;

               else

               Form1->Panel2->Color=clWhite;

           }

               if (p1==2)

           {

               if (p2==1)

               Form1->Panel3->Color=clRed;

               else

               Form1->Panel3->Color=clWhite;

           }

           if (p1==3)

           {

               if (p2==1)

               Form1->Panel4->Color=clRed;

               else

               Form1->Panel4->Color=clWhite;

           }

               if (p1==4)

           {

               if (p2==1)

               Form1->Panel5->Color=clRed;

               else

               Form1->Panel5->Color=clWhite;

           }

           if (p1==5)

           {

               if (p2==1)

               Form1->Panel7->Color=clRed;

               else

               Form1->Panel7->Color=clWhite;

           }

           if (p1==6)

           {

               if (p2==1)

               Form1->Panel8->Color=clRed;

               else

               Form1->Panel8->Color=clWhite;

           }

           if (p1==7)

           {

               if (p2==1)

               Form1->Panel9->Color=clRed;

               else

               Form1->Panel9->Color=clWhite;

           }

           if (p1==8)

           {

               if (p2==1)

               Form1->Panel10->Color=clRed;

               else

               Form1->Panel10->Color=clWhite;

           }

           if (p1==9)

           {

               if (p2==1)

               Form1->Panel11->Color=clRed;

               else

               Form1->Panel11->Color=clWhite;

           }

           if (p1==10)

           {

               if (p2==1)

               Form1->Panel6->Color=clRed;

               else

               Form1->Panel6->Color=clWhite;

           }

               }

           }

      }//цикл для чтения кадра данных с длинок больше 8 кб

  }// передача данных

    // Если соединение завершено, выводми об этом сообщение

 else

 if(WSAGETSELECTEVENT(lParam) == FD_CLOSE )

 {

       closesocket((SOCKET)wParam);

       MessageBox(NULL, ("Connection closed "+IntToStr(wParam)).c_str(), "Server", MB_OK);

 }

}

void __fastcall TForm1::NewWndProc(Messages::TMessage &Message)

{

       switch(Message.Msg)

       {

   // Вызываем обработчик сообщения WSA_ACCEPT

   case WSA_ACCEPT:

              //StatusBar1->SimpleText="WSA_ACCEPT";

     WndProc_OnWSAAccept(hWnd, Message.WParam, Message.LParam);

     return;

     break;

   // Вызываем обработчик сообщения WSA_NETEVENT

   case WSA_NETEVENT:

              //StatusBar1->SimpleText="WSA_NETEVENT";

     WndProc_OnWSANetEvent(hWnd, Message.WParam, Message.LParam);

     return;

     break;

        }

       WndProc(Message);

}

void __fastcall TForm1::ComboBox1Change(TObject *Sender)

{

if (!Work_with_TRIO)

{

if (ComboBox1->ItemIndex==0)

{

Panel1->Color=clRed;

}

if (ComboBox1->ItemIndex==1)

{

Panel2->Color=clRed;

}

if (ComboBox1->ItemIndex==2)

{

Panel3->Color=clRed;

}

if (ComboBox1->ItemIndex==3)

{

Panel4->Color=clRed;

}

if (ComboBox1->ItemIndex==4)

{

Panel5->Color=clRed;

}

if (ComboBox1->ItemIndex==5)

{

Panel7->Color=clRed;

}

if (ComboBox1->ItemIndex==6)

{

Panel8->Color=clRed;

}

if (ComboBox1->ItemIndex==7)

{

Panel9->Color=clRed;

}

if (ComboBox1->ItemIndex==8)

{

Panel10->Color=clRed;

}

if (ComboBox1->ItemIndex==9)

{

Panel11->Color=clRed;

}

if (ComboBox1->ItemIndex==10)

{

Panel6->Color=clRed;

}

}

else

{

//Работа с тренажером

// Миллисекунды

milli1 = DateTimeToTimeStamp(Now());

//Заполнение структуры для модельных команд

kom.kodkom=0x60600;

kom.par1=ComboBox1->ItemIndex;

kom.par2=1-P_help[ComboBox1->ItemIndex];

kom.vrema=milli1.Time;

// Сетевой порядок байт

kom.kodkom=htonl(kom.kodkom);

kom.par1=htonl(kom.par1);

kom.par2=htonl(kom.par2);

kom.vrema=htonl(kom.vrema);

zag.T_kadr =7;

zag.dlina=htons(8+16);

memcpy(buff_com,&zag,sizeof(zag));

memcpy(buff_com+sizeof(zag),&kom,sizeof(kom));

Pr_COM=1;

}

 }

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Panel1->Color=clWhite;

Panel2->Color=clWhite;

Panel3->Color=clWhite;

Panel4->Color=clWhite;

Panel5->Color=clWhite;

Panel6->Color=clWhite;

Panel7->Color=clWhite;

Panel8->Color=clWhite;

Panel9->Color=clWhite;

Panel10->Color=clWhite;

Panel11->Color=clWhite;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

 switch (ComboBox1->ItemIndex)

  {

  case 0:  Panel1->Color=clWhite;       break;

  case 1:   Panel2->Color=clWhite;      break;

  case 2:   Panel3->Color=clWhite;      break;

  case 3:   Panel4->Color=clWhite;      break;

  case 4:   Panel5->Color=clWhite;      break;

  case 5:   Panel6->Color=clWhite;      break;

  case 6:   Panel7->Color=clWhite;      break;

  case 7:   Panel8->Color=clWhite;      break;

  case 8:   Panel9->Color=clWhite;      break;

  case 9:   Panel10->Color=clWhite;      break;

  case 10:   Panel11->Color=clWhite;      break;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

// Создаем сокет сервера для работы с потоком данных

srv_socket  = socket(AF_INET , SOCK_STREAM, 0);

if(srv_socket  == INVALID_SOCKET)

{

 MessageBox(NULL, "socket  Error", "Error", MB_OK);

 return;

}

// Устанавливаем адрес IP и номер порта

 srv_address.sin_family = AF_INET ;

 srv_address.sin_addr.s_addr = INADDR_ANY ;

 srv_address.sin_port = htons(SERV_PORT);

 // Связываем адрес IP с сокетом

 if(bind (srv_socket , (LPSOCKADDR   )&srv_address,

   sizeof(srv_address)) == SOCKET_ERROR )

 {

 // При ошибке закрываем сокет

   closesocket  (srv_socket);

   MessageBox(NULL, "bind  Error", "Error", MB_OK);

   return;

 }

 // Устанавливаем сокет в режим приема для

 // выполнения ожидания соединения с клиентом

 if(listen(srv_socket , 1) == SOCKET_ERROR )

 {

   closesocket  (srv_socket);

   MessageBox(NULL, "listen Error", "Error", MB_OK);

   return;

 }

 // При попытке установки соединения главное окно приложения

 // получит сообщение WSA_ACCEPT

 rc = WSAAsyncSelect (srv_socket , hWnd, WSA_ACCEPT, FD_ACCEPT );

 if(rc > 0)

 {

   closesocket  (srv_socket);

   MessageBox(NULL, "WSAAsyncSelect  Error", "Error", MB_OK);

   return;

 }

 // Выводим в окна Statusbar  сообщение о запуске сервера

//  StatusBar1->SimpleText="Server started";

/* Идентификатор сервера = 1

Идентификатор клиента = 4

Номер порта сервера = 2001

Номер порта клиента = 1850

Имя узла сервера = study4

Имя узла клиента = study3

Тип кадра обмена с клиентом = 7

Код первой команды  = 60600

*/

//Связь с ТРИО

ima_serv="Alex-book";

//Заполнение структуры заголовка

zag.Idserv =4;                                  //Идентификатор получателя

zag.Idclient =1;                                //Идентификатор отправителя

zag.fcadr=0;                                    //Флаги кадра

zag.T_kadr =127;                                //Тип кадра обмена

zag.reserv=0;

zag.dlina=8+4+strlen(ima_serv)+1;               //Длина кадра данных: 8b - заголовок,

                                               // 4b - команда и имя машины сервера с \0-символом в конце

//Код команды инициализации абонента ТРИО

   ini_ab=0xC0000003;

//Код команды завершения абонента ТРИО

   zav_rab=0xC0000004;

// Сетевой порядок байт

zag.dlina=htons(zag.dlina);

zag.reserv=htons(zag.reserv);

ini_ab=htonl(ini_ab);

zav_rab=htonl(zav_rab);

//Запись данных в буфер (команда инициализация работы абонента)

   memcpy(buff_init,&zag,sizeof(zag));

   memcpy(buff_init+sizeof(zag),&ini_ab,sizeof(ini_ab));

   memcpy(buff_init+sizeof(zag)+sizeof(ini_ab),ima_serv,strlen(ima_serv));

   *(buff_init+sizeof(zag)+sizeof(ini_ab)+strlen(ima_serv))=0;

//Запись данных в буфер (команда нет данных)

  //memcpy(buff_ND,&zag,8);

       header *h;

       h = (header *)&buff_ND;

       memset(buff_ND, 0,8);

       h->dlina=htons(8);

       h->Idserv=4;

       h->Idclient=1;

       h->T_kadr=127;

//Запись данных в буфер (команда завершение работы абонента)

   memcpy(buffz,&zag,sizeof(zag));

   memcpy(buffz+sizeof(zag),&zav_rab,sizeof(zav_rab));

   memcpy(buffz+sizeof(zag)+sizeof(zav_rab),ima_serv,strlen(ima_serv));

   *(buffz+sizeof(zag)+sizeof(zav_rab)+strlen(ima_serv))=0;

//  Для передачи данных клиенту смена типа кадра согласно протокола обмена с NA

zag.T_kadr =4;                                //Тип кадра обмена

Work_with_TRIO =1;        

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

      WindowProc=NewWndProc;

       hWnd=Form1->Handle;

rc = WSAStartup (MAKEWORD(1, 1), &WSAData);

if(rc != 0)

{

 MessageBox(NULL, "WSAStartup  Error", "Error", MB_OK);

 return;

}

// Отображаем описание и версию системы Windows Sockets

// в окне органа управления Statusbar

wsprintf(Temp, "Server use %s %s",

 WSAData.szDescription,WSAData.szSystemStatus);

//  StatusBar1->SimpleText=szTemp;

 *buff_com=0;

 Pr_COM=0;              

}

//---------------------------------------------------------------------------

Приложение Д

Содержание файла s1b0n.cfg

[common_definitions]

moteDBPath=remoteUMPath=

dbName=sample

configName=sample

baseDir=\dfctsims\sample\data

sessionTitle=Тренажер "Sample"

sizeOfConnectBuffer=16392

#sizeOfConnectBuffer=8196

mainNodeId=4

syncPeriod=60000

serviceModelsEnabled=yes

fmtDataTransmitDif=no

[node_definitions]    

nodeId=1     

nodeName=study2

hostName=study2

nodeDescription=РМИ_1+СМО,IBM_PC,WinXP

numberOfInputBuffers=8

numberOfOutputBuffers=8

frameType=7

socketPort=1850

periodOfConnections=100

serverNode=    

[node_definitions]    

nodeId=4     

nodeName=192.168.11.220

hostName=192.168.11.220

nodeDescription=РМИ_1+СМО,IBM_PC,OS/2

numberOfInputBuffers=8

numberOfOutputBuffers=8

frameType=0

socketPort=2001

periodOfConnections=100

serverNode=1    

[model_definitions]

modelName=Savelev

nodeId=4

hasPeriodicPart=yes

period=100

[model_definitions]

modelName=Savelev_NA

nodeId=4

hasPeriodicPart=yes

period=100


 

А также другие работы, которые могут Вас заинтересовать

40881. Конституційне право України – провідна галузь національного права України 145.5 KB
  €œКонституційне право України – провідна галузь національного права України†План Поняття і предмет конституційного права України. Поняття і структура системи конституційного права України. Інститути конституційного права України: поняття і види. Метою даної лекції є формування у студентів знань щодо поняття “конституційне право України†як галузі права; засвоєння ними понять предмету і методів конституційноправового регулювання вивчення системи конституційного права України та її елементів а також поняття...
40883. Класифікація електромагнітних явищ 165 KB
  Рівняння магнітостатики: рівняння електростатики: . Рівняння магнітостатики має місце і там де . Звідси тобто звідки одержуємо рівняння Лапласа: з урахуванням заряду Пуасона: без.
40884. Конституційне право України як наука і навчальна дисципліна 253 KB
  €œКонституційне право України як наука і навчальна дисципліна План Конституційне право України як наука: поняття предмет система науки джерела науки основні функції науки. Конституційне право України як навчальна дисципліна: поняття структура курсу основна характеристика. Джерела конституційного права України як галузі права: поняття основні вимоги до джерел види джерел. Література Основна до всіх тем Конституція України від 28 червня 1996 р Відомості Верховної Ради України.
40885. Затухання у металі, скін – шар 67 KB
  В металі хвиля затухає як . Глибина на якій хвиля спадає в раз називається скін – шаром. Ми не врахували те що існує також відбита хвиля у середовищі
40886. Конституція України - Основний Закон держави 180 KB
  Конституція України Основний Закон держави†План Поняття і загальна характеристика конституції як Основного Закону держави. Юридичні властивості й функції Конституції України. Основні етапи становлення Конституції України. Правова охорона Конституції України.
40887. Узагальнена плоска хвиля 284.5 KB
  Таким чином хвиля розповсюджується в багатьох напрямках: хвиля в напрямку Задача: Нехай хвиля падає під кутом до поверхні середовища знайти характеристики відбитої хвилі та заломленої.
40888. Основи конституційного ладу України 279.5 KB
  Механізм та основні функції Української держави. Метою цієї лекції є формування у студентів знань щодо основ конституційного ладу України який включає поняття державного і суспільного ладу; засвоєння ними понять “гарантії конституційного ладу Україн膓механізм держав膓принципи суспільного ладу†тощо. Проблеми та перспективи побудови правової держави в Україні Право України.: Інт держави і права ім.
40889. Рівняння Максвела для Т, ТЕ, ТМ хвиль 388 KB
  Т хвиля розповсюджується зі швидкістю світла . хвиля розповсюджується в напрямку – хвиля існує там де є розв’язок рівняння Лапласа електрика. Тому якщо існує електростатичне поле то може існувати і Т – хвиля.