
- •Ф и л и а л в г. Сызрани
- •Содержание
- •Введение
- •1 Цели и задачи курсового проектирования
- •2 Этапы проектирования асу
- •3 Тематика, содержание и объем
- •4 Характеристика производственных процессов как объектов автоматизации
- •5 Требования к автоматизированным системам
- •6 Автоматизация разработки и проектирования элементов и систем автоматики
- •7 Технико-экономическое обоснование уровней автоматизации производственных процессов
- •8 Пример выполнения проекта
- •8.1 Реферат
- •8.2 Введение
- •8.3 Технологическое описание тепловой станции
- •8.4. Определение требований к системе
- •8.5 Построение структуры системы
- •8.6 Построение алгоритма работы системы
- •8.7 Генерация программного кода
- •8.8 Реализация аппаратной части
- •Модификация минитерм 450.22.0 содержит:
- •Четыре входа вместо второго и третьего тс. Основные выходы:
- •8.9 Анализ технико-экономических показателей
- •Заключение
- •Библиографический список
- •Наименование объекта автоматизации
8.7 Генерация программного кода
Класс в Rational Rose — это описание общей структуры (данных и связей) для дальнейшего создания объектов. Для того чтобы генератор Rational Rose имел возможность создавать на основе описанной модели программный код, для каждого класса необходимо указать язык, для которого будет создаваться код. Также необходимо определить компонент, в котором этот класс будет храниться. Если в качестве языка для создания кода указан VC++, то пользователь получает доступ ко всей иерархии классов библиотеки MFC при помощи визуальных средств Model Assistant. Поэтому прежде чем приступить к генерации кода на Visual C++, следует создать диаграмму компонентов, отражающая организацию и взаимосвязи программных компонентов, представленных в исходном коде, двоичных или выполняемых файлах. Связи в данном типе диаграммы представляют зависимости одного компонента от другого и имеют специальное отображение через значок «зависимости».
В данном проекте будет построена упрощенная диаграмма компонентов, на которой каждый из компонентов будет представлять класс или его реализацию.
Для каждого из классов создается два файла: заголовочный (с расширением .h), который содержит описание класса, и файл реализации (с расширением .cpp), где содержится программная реализация методов класса.
Поэтому каждый класс на диаграмме компонентов будет представлен двумя компонентами: Package Specification и Package Body. Первый компонент представляет собой определение пакета (заголовочный файл с расширением .h), второй – тело пакета (файл с расширением.cpp).
Компоненты на диаграмме (рис. 8.11) для простоты имеют те же названия, что и класс, который они представляют.
На диаграмме связями зависимости показано, что для заголовочного файла контроллера требуются файлы датчиков и устройств, которые в свою очередь используются для компиляции самих файлов датчиков и устройств.
Для каждого класса системы, проектируемой в Rational Rose, необходимо указать стереотип класса, язык, на основе которого будет создаваться программный код, и определить компонент, в котором этот класс будет храниться. При создании заголовочного файла класса для каждого атрибута или операции в спецификации классов будет определена область видимости (public, private или protected).
Рис.8.11 Диаграмма компонентов
Структура кода класса, создаваемого в Rational Rose, включает:
- директивы #include, которые создаются при добавлении атрибутов и связей классов;
- декларация класса, его имя, тип и наследование;
- переменные Data members, создаваемые по описанию атрибута класса и его связей;
- декларация методов класса и скелет этих методов для дополнения операций, заданных в описании класса;
- документация для каждого создаваемого класса, переменных и методов;
- идентификатор ID – модели, включаемый в код в виде комментария создаваемого класса, атрибута или метода.
Для использования класса в проекте, его необходимо ассоциировать с выбранным языком
После ассоциации класса с языком программирования можно воспользоваться пунктом данного меню Tools для Visual C++. Одним из основных пунктов данного меню является Model Assistant, позволяющий обновлять и конкретизировать классы в модели для необходимой генерации кода. Для этого необходимо определить класс, например, TSensor, правой кнопкой мыши вызвать контекстное меню и выбрать пункт Model Assistant. Появится окно которое содержит несколько полей: предварительный просмотр класса Preview; имя программы или программного файла для данного класса Code Name, создание исходного текста Generate Code, обновление исходного текста Code Update, тип класса Class Type, документация Documentation.
В окне Documentation можно вводить произвольный комментарий для класса, текст которого при генерации исходного кода будет включён в программу как комментарий.
При выборе в контекстном меню класса пункта Update Model from code (Update Model) открывается окно – приглашение, в котором следует выбрать команду Next. В открывшемся диалоговом окне можно обновить классы модели при помощи установки и снятия отметок с определённых классов. Если классы модели ещё не ассоциированы ни с одним проектом VC++. Для этого необходимо в левой части окна Components in model выбрать один из компонентов и правой кнопкой мыши вызвать контекстное меню, в котором выбрать команду Properties. В открывшемся окне следует перейти в графу Workspase File и нажать кнопку […]. Открывается окно выбора файла VC++ проекта, в котором следует перейти на закладку Recent и выбрать проект, после чего нажать кнопки Add, Ok.
Мастер обновления кода класса предлагает выбрать элементы для обновления. Для этого левой кнопкой мыши следует выделить элементы в левой части окна и нажать кнопку Next. Обновление модели выполняется следующим образом. В контекстном меню одного из классов в окне Browser выбирается пункт Update Model. Мастер обновления модели предлагает отметить компоненты или классы, подлежащие обновлению. Для этого в контекстном меню следует выбрать пункт Properties.
После того, как все компоненты выбраны и ассоциированы с пректом, следует нажать кнопку Next, а затем – Finish. На запрос системы, следует ли обновить классы, ответить Yes. Обновление кода модели происходит автоматически, при этом создаётся окно отчёта и информации об обновлённых кодах классов и модели. (См. приложение.)
Обновление кода проводится для компонентов, полученных в диаграмме классов. Для этого в контекстном меню одного из классов следует выбрать пункт Update Code. Для получения программного кода всей системы следует выполнить следующие операции: Menu Build Build ***.exe.
Далее определяемся с реализуемыми в классах методами.
Класс ARM
Так как функциями класса должны устанавливаться параметры процесса введенные оператором, ей в качестве аргумента передается структура, содержащая все параметры процесса. Определение структуры имеет следующий вид:
struct params
{
public:
double т_Signal_ot_Controller1;
double т_Signal_ot_Controller2;
double т_Signal_ot_Controller3;
double т_ShortPeriod;
double m_LongPeriod;
};
Соответственно реализация функции имеет следующий вид:
void SetProcessParams(params parameters)
{
m_ Signal_ot_Controller1= parameters. Signal_ot_Controller1;
m_ShortPeriod = parameters.ShortPeriod;
m_LongPeriod = parameters.LongPeriod;
m_ Signal_ot_Controller2= parameters. Signal_ot_Controller2;
m_ Signal_ot_Controller3= parameters. Signal_ot_Controller3;
}
Классы Controller1, Controller2, Controller3 реализуются аналогично.
Класс Sensor_ Temp_gaz
Функции типа Get_x используется только для чтения значения атрибута, поэтому ей не передается никаких параметров и устанавливается тип возвращаемого значения совпадающий с типом атрибута, к которому она обеспечивает доступ.
double Get_Temperat(void)
{
return m_Temperat_gaz;
}
Класс Sensor_Temperat_Pryam_vody
double Get_Temperat_Pryam_vody()
{
return т_Temperat_Pryam_vody;}
Классы Sensor_Temp_Nar_vozd, Temperat_Sensor, Sensor_-Davlen_gaz, Sensor_Davien_Pryam_vod, Sensor_davlen_vod реализуются аналогично.
Класс Timer.
Логично предположить, что для того, чтобы функцией SetTimer производилось задание атрибута m_Period ей должен передаваться параметр, содержащий значение устанавли-ваемого промежутка времени.
double SetTimer(interval: double)
{
m_Period = interval;
}}
Класс Vol_Meter
Функция Get_Rashod_seti() должна возвращать атрибут m_Rashod_seti.
double Get_Rashod_seti (void)
{
return m_Rashod_seti;
}
Класс Vol2_Meter
double Get_Rashod_podpitki()
{
return m_Rashod_podpitki;
Класс Vol_Meter_gaz
double Get_Rashod_gaz ()
{
return m_Rashod_gaz;
}
Класс Vol_Meter_Rashod_Pryam_vody
double Get_Rashod_Pryam_vody(Get_Rashod_gaz()
{
return m_Rashod_Pryam_vody;
}
После того, как реализация и прототипы функций определены, с помощью инструмента Model Assistant в указанных классах задаем для каждого оператора тип возвращаемого им значения, передаваемых ему параметров и тело функции (Default Code Body). В классе Controller задается определение структуры params и содержащиеся в ней поля, представляющие задаваемые оператором параметры процесса.
Заключительным этапом в создании программного кода на VisualC+ + является ассоциирование компонента с проектом Microsoft Visual Studio 6.0. ля этого используется инструмент Component Assignment Tool (меню Tools → Visual С++ →Component Assignment Tool...). Здесь в свойствах компонентов требуется либо указать существующий проект Visual Studio, либо создать новый проект (при этом используются средства Microsoft Visual Studio), в котором создаются классы, включенные в выбранные компоненты. С помощью этого инструмента можно также включать классы в компоненты и ассоциировать их с языком VC++ (если это еще не было сделано), методом Drag 'n 'Drop. После того как для всех компонентов был указан проект, в который они будут включены, можно приступать к генерации кода (меню Tools → Visual C++→ Update Code...). Если при этом был выделен класс или компонент, то произойдет обновление его кода (или создание, если он еще не был сгенерирован).
Листинги созданного для проектируемой системы кода генератором Rational Rose Visual C++ приведены ниже.
Файл ARM.cpp (Автоматизированное рабочее место)
// Copyright (С) 1991-1999 Rational Software Corporation
#include "stdafx.h"
#indude "Controlled .h"
#include ARM.h"
//##ModelId=4387F82100BB ARM: CurrentController1()
//##ModelId=4387F8390138 ARM: :Current_Controller2()
{
}
//##ModelId=43 87F84C01B5
ARM:: Current_Controller3 ()
{
}
//##ModelId=4387F87B03D8
ARM::Set_Timer()
{ } //##ModelId=438815F402BF
ARM:: SetProcessParametr()
Файл ARM.h (Автоматизированное рабочее место)
// Copyright (С) 1991-1999 Rational Software Corporation
#if defined (_MSC_VER) && (MSCVER >= 1000)
#pragma once
#endif
#ifhdef_INC_ARM^4387F78E0128_INCLUDED
#define _INC_ARM_4387F78E0128_INCLUDED
class Controller1;
//##ModelId=4387F78E0128 class ARM
{
public:
//##ModelId=4387F8A20186
Controller 3* theController3;
//##ModelId=4387F8A60271
Controller 2* theController2;
//##Modelld-4387F8A20186
Controller 3* theController3;
//##Modelld=4387F8A60271
Controller 2* theController2;
//##ModelId=4387F82100BB CurrentControllerl ();
//##ModelId=4387F8390138
Current Controlled ();
//##ModelId=4387F84C01B5 Current_Controller3();
//##ModelId=4387F87B03D8
Set_Timer();
//##ModelId=438815F402BF SetProcessParametr();
private:
//##ModelId=4387F79D01 D4
double mSignal ot Conrpollerl;
//##ModelId=4387F7BF03B9
double m_Signal_ot_Controller2;
//##ModelId-4387F7D90399
double m_Signal_ot_Controller3;
//##ModelId=438812250119
double mShortPeriod;
//##ModelId=4388126D01A5
double m_LongPeriod;
#endif /* JNC_ARM_4387F78E0128_INCLUDED */
Файл Nasos.cpp (Hacoc подпитки)
// Copyright (С) 1991-1999 Rational Software Corporation
#include "stdafx.h"
#include "Nasos.h"
//##Modelld=4381F24501B5 Nasos::IsOn()
//##ModelId=4381F25801E4 Nasos::IsOff()
Файл Nasos.h (Hacoc подпитки)
// Copyright (C) 1991 - 1999 Rational Software Corporation
#if defined (_MSC_VER) && (JVtSC_VER >= 1000)
#pragma once
#endif
#ifiidef _INC_NASOS_4381F2380232_INCLUDED
#define_lNC_NASOS_4381F2380232_INCLUDED
//##ModelId=4381F2380232 class Nasos
{
public:
//##Modelld-4381F24501B5 lsOn();
//##ModelId-4381F25801E4 IsOff();
#endif /* _1NC_NASOS_4381F2380232^_INCLUDED */
Файл SensorDavlenPryamvod.cpp (Датчик давления прямой сетевой воды)
// Copyright (С) 1991-1999 Rational Software Corporation
#include "stdafx.h"
#include "Sensor_Davlen_Pryam_vod.h"
//##ModelId=43873EB400CB
Sensor_Davlen_Pryam_vod::Get_Davlen_Pryam_vod()
Файл SensorDavlenPryamvod.cpp.h (Датчик давления прямой сетевой воды)
// Copyright (С) 1991-1999 Rational Software Corporation
#if defined (_MSCJ/ER) && (_MSC_VER >= 1000)
#pragma once
#endif
#ifndef
_INC_SENSOR_DAVLEN_PRYAM_VOD_43873E1D0251 INCLUDED
#defme
_INC_SENSOR_DAVLEN_PRYAM_VOD_43873E1D0251_INCLUDED
//##ModelTd=43873ElD0251
class Sensor_Davlen_Pryam_yod
{
public:
//##Modelld=43873EB400CB
Get_Davlen_Pryam_yod();
#endif/* _INC_SENSOR_DAVLEN_PRYAM_VOD_43873E1D0251^_INCLUDED*/
Файл Timer.cpp (Таймер)
// Copyright (C) 1991-1999 Rational Software Софога1юп
#include "stdafx.h" #include "Timer.h"
//##ModelId=409F79EE035C
void Timer: :SetTimer(double interval)
{
m_Period = interval;
Файл Timer.h (Таймер)
// Copyright (C) 1991-1999 Rational Software СофогаЬоп
#if defined (_MSC_VER) && (_MSC_VER >= 1000)
#pragma once
#endif
#ifndef_INC_TlMER_407D440600E7_INCLUDED #define_INC_TIMER_407D440600E7-INCLUDED
//Таймер//##ModelId=409F79EE0352
class Timer
{ public:
//##ModelId=409F79EE035C void SetTimer(double interval);
private:
//Период генерации сообщений таймера
//##ModelId=409F79EE0367 double m_Period;
#endif/*_INC-TIMER_407D440600E7_INCLUDED*/
Полученный код не является полностью завершенным и представляет собой каркас для дальнейшего построения полностью функционального кода автоматизированной системы управления температурными режимами помещений.