При проектировании рабочего искусственного освещения производственного помещения в качестве источника света выбираем люминесцентные лампы. При выполнении в помещении зрительной работы средней точности применяется общая система освещения. При выборе типа светильника необходимо учитывать требования к распределению светового потока. Для указанного выше характера работы выбираем светильники рассеянного света. При размещении светильников необходимо учитывать удобство обслуживания, необходимую равномерность освещения и другие факторы.
Определяем размеры, определяющие размещение светильников в помещении :
1) высота подвеса светильника
h = H – hc - hp,
где H = 3 м – высота помещения;
hc = 0 – свес;
hp = 1 – высота рабочей поверхности;
h = 2 (м);
2) расстояние между светильниками
L » 1.4 h » 1.4 * 2 = 2.8 (м);
3) расстояние от крайнего ряда светильников до стен при учёте, что рабочие поверхности горизонтальные и расположены у стен
l = (0.25..0.33) L = 0.25 * 2.8 = 0.7 (м).
Существует несколько методов расчёта искусственного освещения :
1) метод коэффициента использования светового потока (для расчёта общего равномерного освещения горизонтальной поверхности при светильниках любого типа);
2) точечный метод (для расчёта равномерного общего локализованного и местного освещения помещений при светильниках прямого света и наружного освещения);
3) метод «удельных мощностей» (при приближенных расчётах).
Воспользуемся методом коэффициента использования светового потока.
При принятом количестве светильников искомой величиной является необходимый световой поток одной лампы, определяемый по формуле (8.2):
(8.2)
где Ен = 150 – нормируемая минимальная освещённость, определяется по табл. 2.1 ;
S = 16 м2 – площадь освещенного помещения;
N = 4 – число светильников;
n = 4 – число ламп в светильнике;
кз = 1.4 – коэффициент запаса (принимается в пределах 1.3..2.0 в зависимости от содержания пыли в производственных помещениях с учетом регулярной очистки светильников и вида источника света);
z = 1.2 – коэффициент неравномерности освещения (1.1..1.25);
h = 0.47- коэффициент использования светового потока (зависит от индексов помещения i и значения коэффициента отражения стен и потолка rс и rп), определяется по таблице 2.2;
Индекс помещения вычисляется по формуле:
где А и В – соответственно длина и ширина помещения, м;
h = 2 м – расчётная высота подвеса светильников.
Подставляя в формулу (8.1) имеющиеся значения, получаем:
(Лм)
Вывод
Разработанное программное обеспечение должно эксплуатироваться на IBM PC/AT совместимых компьютерах в помещении, соответствующем санитарным нормам, а именно: площадью не менее 16 м2 и объёмом воздуха 15 м3. В производственном помещении в дневное время должно быть обеспечено достаточное естественное освещение, для чего необходимо расположить два окна размером 2х2 м2, а в темное время суток – искусственное освещение, в качестве источника света которого являются люминесцентные лампы (световой поток одной лампы составляет 536.2 Лм).
Заключение
В рамках дипломного проекта разработана концепция распределенной системы терминального управления робототехническим комплексом, оперирующем в зоне опасной для жизни человека. При разработке концепции использованы современные подходы к организации сбора и передачи информации. В частности рассмотрены основы использования CAN-интерфейса. Для определения коэффициентов терминального управления разработана функция вычисления коэффициентов на двух языках программирования (язык m-скриптов и на языке C++). Возможность применения синтезированного закона опробована на специально разработанной экспериментальной модели системы. Разработка модели и апробация проведены в среде инженерных расчетов Matlab. Конечным продуктом проекта является программное обеспечение пульта управления РСТУ, которое позволяет произвести вычисление коэффициентов терминального управления, построить управляющую функцию, произвести визуализацию результатов работы, создание и сохранение файла протокола, передачу расчетных данных на борт робота манипулятора по сетевому интерфейсу. При разработке учтены все требования технического задания.
Библиографический список
1. Дистанционно управляемые роботы и манипуляторы / ВС. Кулешов, Н.А Лакота, В.В. Андрюнин и др.; Под общ. Ред. Е.П. Попова. – М.Машиностроение, 1986. – 328 с. ил.
2. Батенко А.П. Системы терминального управления. – М.: Радио и связь, 1984. – 160 с., ил.
3. Медведев В.С., Лесков А.Г., Системы управления манипуляционных роботов/Под ред. Е.П. Попова. – М.: Наука, 1978 – 416 с.
4. Летов А.М. Динамика полета и управление. – М.: Наука, – 1969. – 359 с.
5. Красовский А.А. Аналитическое конструирование систем квазитерминального управления // Автоматика и телемеханика. – 1972. – №4. – С. 5-14.
6. Seal C.E., Stabberud A.R. On final value control // IEEE Trans. – 1969. – V.7 – №2. – P. 133-143.
7. Green W.G. Logarithmic navigation for precise guidance for space vehicles // IRE Trans. – 1961. – V. ANE-8 – №2 – P. 59-71.
8. Ястребов В.С., Филатов А.М. Системы управления движением робота. – М.: Машиностроение, 179. 176 с.
9. Батенко А.П. Управление конечным состоянием движущихся объектов. – М.: Сов. радио, 1977. – 256 с.
10. Батенко А.П. Конечное управление цепочкой интеграторов // Автоматика. – 1977. – №2. – С. 63-71.
11. http://www.kaskod.ru
12. http://www.mstu.edu.ru
13. Чиликин М.Г., Ключев В.И. Теория автоматизированного электропривода. – М.: Энергия, 1979. – 616 с.
14. Borland C++Builder. Программирование на С++ без проблем / Шамис В.А.. – М.: «Нолидж», 1997 – 266с., ил.
15. Программирование в среде С++Builder / Сурков К.А., Сурков Д.А., Вальвачев А.Н.. – Мн.: ООО «Попурри», 1998. – 576 с.:ил.
Приложение а
(Обязательное)
Исходные тексты основных функций
А.1 Исходный текст функции вычисления коэффициентов терминального управления на языке Matlab
% ФУНКЦИЯ РАСЧЕТА ТЕРМИНАЛЬНОГО УПРАВЛЕНИЯ
% ----------------------------------------
% ВХОДНЫЕ ПАРАМЕТРЫ:
% Xo - ВЕКТОР НАЧАЛЬНЫХ УСЛОВИЙ
% Xk - ВЕКТОР КОНЕЧНЫХ УСЛОВИЙ
% T - ВРЕМЯ ЗА КОТОРОЕ НЕОБХОДИМО ВЫПОЛНИТЬ ПЕРЕХОД
% dT - ВРЕМЯ ОПЕРЕЖЕНИЯ ФАЗОВОЙ ТОЧКИ
% ----------------------------------------
% ВЫХОДНЫЕ ПАРАМЕТРЫ:
% C - КОЭФФИЦИЕНТЫ ПАРАМЕТРОВ УПРАВЛЕНИЯ
% ----------------------------------------
function [C]=terminal_control(Xo,Xk,T,dT)
r=length(Xo); % КОЛИЧЕСТВО НАЧАЛЬНЫХ УСЛОВИЙ
n=length(Xk); % КОЛИЧЕСТВО КОНЕЧНЫХ УСЛОВИЙ
C=zeros(1,2*r+n);
%---------------------------------------------------------------% РАСЧЕТ ПАРАМЕТРОВ УПРАВЛЕНИЯ Сi
%---------------------------------------------------------------for i=0:r-1
C(i+1)=Xo(i+1)/factorial(i); % ПЕРВЫЕ r ПАРАМЕТРОВ Ci (i=0,1,...,r-1)
end
for i=r:r+n-1
summa_1=0;
summa_2=0;
for nu=0:i-1
summa_1=summa_1+factorial(r+n-nu-1)*C(nu+1)/factorial(r+n-i-1)/factorial(i-nu)/T^(i-nu);
end
for nu=0:r+n-i-1
summa_2=summa_2+((-1)^nu)*factorial(r+n-nu-1)*Xk(nu+1)/factorial(i)/factorial(r+n-i-nu-1)/factorial(nu)/T^(i-nu);
end
C(i+1)=summa_2-summa_1;
end
disp(['---------- ВЫХОДНАЯ ФУНКЦИЯ ----------'])
disp(['X(t)='])
for i=0:r+n-1
disp(['C' num2str(i) '*t^' num2str(i) '+'])
end
disp(['---------- НАЧАЛЬНЫЕ УСЛОВИЯ Xo ----------'])
for i=0:r-1
disp(['Xo(' num2str(i) ')=' num2str(Xo(i+1))])
end
disp(['---------- КОНЕЧНЫЕ УСЛОВИЯ Xk ----------'])
for i=0:n-1
disp(['Xk(' num2str(i) ')=' num2str(Xk(i+1))])
end
disp(['---------- ВРЕМЯ ----------'])
disp(['T=' num2str(T)])
disp(['---------- dT ----------'])
disp(['dT=' num2str(dT)])
disp(['---------- КОЭФФИЦИЕНТЫ Ci ----------'])
for i=0:r+n-1
disp(['C(' num2str(i) ')=' num2str(C(i+1))])
end
А.2 Исходный текст модуля вычисления коэффициентов терминального управления на языке С++
// Функции для вычисления параметров
// терминального управления v.1.0
#include <math.h>
//----------------------------------//
// ФУНКЦИЯ ВЫЧИСЛЕНИЯ ФАКТОРИАЛА N! //
//----------------------------------//
double Factorial(int n)
{
double result=1;
int i=1;
// Если аргумент функции отрицательный возвращаем -1
if (n<0) return -1;
// Расчет факториала
while (i<=n)
{
result*=i;
i++;
}
// Возвращаем результат
return result;
}
//-------------------------------------//
// ФУНКЦИЯ ВЫЧИСЛЕНИЯ ПАРАМЕТРОВ Сi //
//-------------------------------------//
// Входные параметры:
// Xo - массив начальных условий
// r - количество начальных условий
// Xk - массив конечных условий
// n - количество конечных условий
// Tk - конечное время
// Выходные параметры:
// Указатель на массив коэффициентов Ci
//-------------------------------------//
double *CoeffC(double Xo[], int r, double Xk[], int n, double Tk)
{
// Определяем массив коэффициентов
// Памать под массив необходимо очистить
// вызывающей функции delete[] Ci !!!
double *Ci = new double[r+n];
// Вычисляем первые r коэффициентов Ci
for (int i=0; i<=r-1; i++)
{
Ci[i]=(double)(Xo[i]/Factorial(i));
}
// Вычисляем оставшиеся n коэффициентов Ci
// См. Батенко А.П. "Синтез терминального управления" формула (4.16)
int v;
double sum_1, sum_2;
sum_1=sum_2=0.0;
for (int i=r; i<=r+n-1; i++)
{
for (v=0; v<=i-1; v++)
{
sum_1+=(double)(Factorial(r+n-v-1)/Factorial(r+n-i-1)/Factorial(i-v)/pow(Tk,i-v)*Ci[v]);
}
for (v=0; v<=r+n-i-1; v++)
{
sum_2+=(double)(pow(-1,v)*Factorial(r+n-v-1)/Factorial(i)/Factorial(r+n-i-v-1)/Factorial(v)/pow(Tk,i-v)*Xk[v]);
}
Ci[i]=-sum_1+sum_2;
sum_1=sum_2=0.0;
}
r=(int)sizeof(Ci)/sizeof(double);
return Ci;
}
//-------------------------------------//
А.2 Исходный текст функций программного обеспечения РСТУ
//--------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------void __fastcall TForm1::bbCloseClick(TObject *Sender)
{
Close();
}
//--------------------------------------------------------------
void __fastcall TForm1::bOkClick(TObject *Sender)
{
Series1->Clear();
ListBox1->Clear();
int i, k;
String S, s;
//------------------------------------------------------------
// Ввод исходных данных для расчета
//------------------------------------------------------------ int InitConditionNum=StrToInt(Edit1->Text); // Кол-во начальных условий
int FiniConditionNum=StrToInt(Edit3->Text); // - " - конечных условий
String InitCondition=Edit2->Text;
String FiniCondition=Edit4->Text;
double T=StrToFloat(Edit5->Text);
//------------------------------------------------------------
// Формирование массива начальных условий
//------------------------------------------------------------
S=Edit2->Text;
s="";
k=0;
double *xo;
xo=new double[InitConditionNum];
for (i=1; i<=S.Length(); i++)
{
if ((S[i]!=' ')&(S[i]!='[')&(S[i]!=']'))
{
s+=S[i];
}
else
{
if (!s.IsEmpty())
{
xo[k]=StrToFloat(s);
s="";
k++;
}
}
}
//------------------------------------------------------------
// Формирование массива конечных условий
//------------------------------------------------------------
S=Edit4->Text;
s="";
k=0;
double *xf;
xf=new double[FiniConditionNum];
for (i=1; i<=S.Length(); i++)
{
if ((S[i]!=' ')&(S[i]!='[')&(S[i]!=']'))
{
s+=S[i];
}
else
{
if (!s.IsEmpty())
{
xf[k]=StrToFloat(s);
s="";
k++;
}
}
}
//------------------------------------------------------------
// Вычисляем коэффициенты терминального управления
//------------------------------------------------------------
// Указатель на массив коэффициентов
double *C;
C=CoeffC(xo, InitConditionNum, xf, FiniConditionNum, T);
for (i=0; i<InitConditionNum+FiniConditionNum; i++)
{
ListBox1->Items->Add("C["+IntToStr(i)+"] = "
+FloatToStrF(C[i], ffFixed, 7, 5));
}
//------------------------------------------------------------
// Вычисляем управляющую функцию u(t)
//------------------------------------------------------------
double dT, t=0.0;
dT=StrToFloat(Edit6->Text);
int N=(int)T/dT;
StringGrid1->RowCount=N+3;
double u, sum=0.0;
for(i=0; i<=N+1; i++)
{
StringGrid1->Cells[0][i+1]=FloatToStrF(t, ffFixed, 7, 5);
for (k=0; k<InitConditionNum+FiniConditionNum; k++)
{
if (k==0)
{
sum+=C[k];
}
else
{
sum+=C[k]*pow(t, k);
}
}
Series1->AddXY(t, sum, "", clTeeColor);
Application->ProcessMessages();
StringGrid1->Cells[1][i+1]=FloatToStrF(sum, ffFixed, 5, 3);
sum=0.0;
t+=dT;
}
//------------------------------------------------------------
delete[] C;
delete[] xo;
delete[] xf;
}
//--------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid1->Cells[0][0]="Время [сек]";
StringGrid1->Cells[1][0]="U(t)";
}
//--------------------------------------------------------------
void __fastcall TForm1::bbSaveClick(TObject *Sender)
{
ofstream out;
int i;
if (SaveDialog1->Execute())
{
out.open(SaveDialog1->FileName.c_str(), 0);
out<<"Файл протокола от "<<DateToStr(Now()).c_str()<<"\n";
for (i=0; i<ListBox1->Count; i++)
{
out<<"C["<<i<<"] = "<<ListBox1->Items->Strings[i].c_str()<<"\n";
}
for (i=0; i<StringGrid1->RowCount; i++)
{
out<<StringGrid1->Cells[0][i].c_str()<<"\t"<<StringGrid1->Cells[1][i].c_str()<<"\n";
}
out.close();
}
}
//--------------------------------------------------------------
void __fastcall TForm1::bbSendClick(TObject *Sender)
{
String S="@";
int i;
//------------------------------------------------------------
// Формируем пакет для передачи информации
//------------------------------------------------------------
for (i=0; i<ListBox1->Count; i++)
{
S+=ListBox1->Items->Strings[i]+"%";
}
S+="#";
//------------------------------------------------------------
// Вводим IP-адрес
//------------------------------------------------------------
UDP->Host=MaskEdit1->Text;
//------------------------------------------------------------
// Пересылка данных
//------------------------------------------------------------
try
{
UDP->Send(S);
}
catch(...)
{
ShowMessage("Не удалось передать информационный пакет!");
}
//------------------------------------------------------------
}
//--------------------------------------------------------------
void __fastcall TForm1::bbAboutClick(TObject *Sender)
{
FormAbout->ShowModal();
}
//--------------------------------------------------------------
Дата: 2019-12-10, просмотров: 254.