Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

управление_объектом_практика

.pdf
Скачиваний:
17
Добавлен:
25.03.2021
Размер:
448.98 Кб
Скачать

Отчет по учебной практике по теме: «Программа управления объектом»

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

Программа предназначена для осуществления управления объектом, опроса датчика заданное число раз, вычисления среднего значения и дисперсии по результатам опроса.

Структура программы

В состав программы входят функции main, vvod и calc.

Главная функция main:

осуществляет вызов функции vvod, благодаря которой выполняется ввод исходных данных,

осуществляет выдачу управляющих воздействий по каналам управления,

прерывает выполнение программы на заданное время,

осуществляет опрос датчика,

вызывает функцию calc, вычисляющую среднее значение и дисперсию,

осуществляет вывод значений результатов опросов датчика, среднего значения и дисперсии.

Программа:

#include "plant.h" #include "plant.c" #include <iostream> #include <cmath> #include <Windows.h> #define NN 256

using namespace std;

Plant plant; //Объект управления int k, L, T, J, N; //Исходные данные

//Текущие значения double U[NN][NN], M[NN]; double Y[NN];

// Подпрограмма ввода исходных данных

void vvod(int &k,int &L,int &T,int &J,int &N, double M[NN], double U[NN][NN])

{

cout << "Vvedite k" << '\n'; //Число каналов управления cin >> k;

cout << "Vvedite L" << '\n'; //Номер опрашиваемого датчика cin >> L;

cout << "Vvedite T" << '\n'; //Время задержки опроса cin >> T;

cout << "Vvedite J" << '\n'; //Число опросов в серии cin >> J;

cout << "Vvedite N" << '\n'; //Число строк плана cin >> N;

if ((k < NN) && (J < NN) && (N < NN))

{

cout << "Vvedite Massiv M" << '\n'; //Номер канала управления for (int a = 1; a <= k; a++)

{

cin >> M[a];

}

cout << "Vvedite U" << '\n'; //Матрица плана for (int b = 1; b <= N; b++)

{

for (int a = 1; a <= k; a++)

{

cin >> U[a][b];

}

}

}

}

//Подпрограмма подсчета среднего значения и дисперсии void calc(int J, int L, double &Ycp, double &Sy2, double y[NN])

{

Ycp = 0;

Sy2 = 0;

for (int i = 1; i <= J; i++)

{

y[i] = plant_measure(L, plant); Ycp = Ycp + y[i];

Sy2 = Sy2 + (y[i]) * (y[i]);

2

}

Ycp = Ycp / J;

Sy2 = (Sy2 - J * Ycp * Ycp) / (J - 1);

}

//Главная функция int main()

{

double Ycp,Sy2,y[NN]; plant_init(plant);

vvod (k,L,T,J,N,M,U); //Ввод исходных данных int b=1;

do

{

for (int a = 1; a <= k; a++)

{

plant_control(M[a],U[a][b],plant); //Выдача управляющих воздействий

}

Sleep(T); //Прервать выполнение на время T calc(J,L,Ycp,Sy2,y); //Подсчет среднего значения и дисперсии

//Вывод значений

for (int c = 1; c <= J; c++)

{

cout << " y" << c << "=" << y[c];

}

cout << '\n' << " Ycp=" << Ycp << " Sy2=" << Sy2 << '\n'; b++;

}

while (b<=N); return 0; system("pause");

}

3

Структура main:

Начало

Вызов функции vvod(k,L,T,J,N,M[k],U[k][N])

b = 1

a = 1; a <= k; a++

Выдача управляющих воздействий plant_control(M[a],U[a][b],plant)

Ожидание времени T Sleep(T)

Вызов функции calc(J,L,Ycp,Sy2,y)

Вывод значений y[J],Ycp,Sy2

Да

Нет

b<=N

Конец

4

Описание процедур и модулей

1.Функция vvod осуществляет ввод исходных данных: число каналов управления, номер опрашиваемого датчика, время задержки опроса, число опросов в серии, число строк плана, массив номеров каналов управления, матрицу плана (массив управляющих воздействий); функция не возвращает значений.

Формальные параметры:

k – число каналов управления

L – номер опрашиваемого датчика

T – время задержки опроса

J – число опросов в серии

N – число строк плана

M[k] – массив из k номеров каналов управления

U[k][N] – массив N*k значений управляющих воздействий

2. Функция calc осуществляет подсчет среднего значения и дисперсии; не возвращает значений.

Формальные параметры:

Входные параметры:

J – число опросов в серии

L – номер опрашиваемого датчика

Выходные параметры:

Ycp – среднее значение по серии измерений y[NN]

Sy2 – дисперсия

y[NN] – J значений-результатов опроса датчика

Исходные данные программы

k – число каналов управления

L – номер опрашиваемого датчика

T – время задержки опроса

J – число опросов в серии

N – число строк плана

M[k] – массив из k номеров каналов управления

U[k][N] – массив N*k значений управляющих воздействий

5

Инструкция по использованию программы

1.Введите целое число k – число каналов управления от 1 до 4

2.Введите целое число L – номер опрашиваемого датчика от 26 до 40 (активные линейные)

3.Введите целое положительное число T – время, на которое нужно прервать выполнение (в секундах)

4.Введите целое положительное число опросов в серии J

5.Введите целое положительное число N – число строк плана

6.Введите массив каналов управления – целых чисел от 7 до 10

7.Введите массив из N*k значений управляющих воздействий, удовлетворяющих условиям:

для М = 7: [−70; +70];

для М = 8: [−3; +3];

для М = 9: [−5; +5];

для М = 10: [−2,5; +2,5].

Описание контрольной задачи

k = 3 L = 30 T = 5 J = 3 N = 4 M[k]: 7 8 9

U[k][N]:

-60 -30 30 60 -2 -1 1 2 -1.5 -1 1 1.5

6

Цели исследования

Исследовать зависимость изменения Yср – среднего значения результатов опросов датчика – в условиях фиксированного управления по одному каналу и равномерного возрастания управления по другому каналу.

Методика исследования

Было произведено изменение программы:

Изменена функция vvod: ликвидирован ввод времени T, числа строк плана N, массива управляющих воздействий U[k][N]

Изменена главная функция main:

осуществлен ввод шага изменения значения управляющего воздействия – step, минимального Umin и максимального Umax значений управляющего воздействия;

по значениям step, Umin, Umax в главной функции осуществлено формирование вектора из значений управляющих воздействий;

осуществлено построение осей графика и кривой по средним значениям результатов опросов датчика.

Программа

#include "plant.h" #include "plant.c" #include <Windows.h> #include <iostream> #include <cmath> #include <vector> #define NN 256

7

using namespace std;

Plant plant; //Объект управления //Исходные данные

int k, L, J;

double Umin, Umax, Step, M[NN]; char Prod;

//Текущие значения vector <double> U; vector <double> Uusr; double y[NN];

// Подпрограмма ввода исходных данных void vvod(int &k,int &L,int &J,double M[NN])

{

cout << "Vvedite k" << '\n'; //Число каналов управления cin >> k;

cout << "Vvedite L" << '\n'; //Номер опрашиваемого датчика cin >> L;

cout << "Vvedite J" << '\n'; //Число опросов в серии cin >> J;

cout << "Vvedite Massiv M" << '\n'; //Номер канала управления for (int i = 1; i <= k; i++)

{

cin >> M[i];

}

}

//Подпрограмма подсчета среднего значения и дисперсии void calc(int J, int L, double &Ycp, double &Sy2, double y[NN])

{

Ycp = 0;

Sy2 = 0;

for (int i = 1; i <= J; i++)

{

y[i] = plant_measure(L, plant); Ycp = Ycp + y[i];

Sy2 = Sy2 + (y[i]) * (y[i]);

8

}

Ycp = Ycp / J;

Sy2 = (Sy2 - J * Ycp * Ycp) / (J - 1);

}

// Главная функция int main()

{

HDC hDC = GetDC(GetConsoleWindow()); double Ycp,Sy2,y[NN];

plant_init(plant);

vvod (k,L,J,M); //Ввод исходных данных for (int j = 1; j <= k; j++)

{

cout << "Kanal wozdejstwia"<< '\t' << M[j]<< '\n'; cout << "Vvedite shag" << '\n';

cin >> Step;

cout << "Vvedite Umin" << '\n'; cin >> Umin;

cout << "Vvedite Umax" << '\n'; cin >> Umax;

double Ustep = 0;

int a = (Umax - Umin) / Step; double b = a * Step + Umin; if (b < Umax)

{

a=a+1;

}

U.reserve (a+1); //устанавливается длина вектора

Uusr.reserve (a+1);

for (int c = 0; c <= a; c++)

{

U[c] = Umin + Ustep; Ustep = Ustep + Step;

}

9

if (b < Umax)

{

U[a] = Umax;

}

cout << "N" << '\t' << "Ui" << '\t' << "Ycp" << '\t'<< '\n'; for (int h = 0; h <= a; h++)

{

{

plant_control(M[j],U[h],plant); //Выдача управляющих воздействий

}

for (int f = 1; f <= J; f++)

{

y[f] = plant_measure(L, plant); // Опрос датчика

}

calc(J,L,Ycp,Sy2,y);

cout << h+1 << '\t' << U[h] << '\t'; cout << Ycp << '\t' << '\n'; Uusr[h] = Ycp;

}

// расчет масштабирующих коэффициентов

double Ycpmin = Uusr[0]; // Определение мин и максYcp double Ycpmax = Uusr[0];

for (int h = 0; h <= a; h++)

{

double b = Uusr[h]; if (b < Ycpmin)

{

Ycpmin = b;

}

if (b > Ycpmax)

{

Ycpmax = b;

}

}

double Kx = 1; // расчет коэффициентов

10