Задание курсовой работы.
1.1 Цель работы: В результате выполнения курсового проекта необходимо рассчитать тарировочную характеристику бака и определить погрешностьот нелинейности статической характеристики датчика поплавкового топливомера. При работе над проектом должны быть применены знания, полученные при изучении программных пакетов математического моделирования и компьютерного конструирования.
N бака | Профиль бака | Ширина бака |
2. Разработка программы в Visual Basic
2.1 Описание программы
Команда “Сетка”.Это команда создания осей координат. Сначала нам необходимо нарисовать координатную сетку, для этого выбираем ее цвет после чего используя цикл с определенным шагом и команды Line рисуются несколько линий по горизонтали и вертикали, которые образуют саму эту координатную сетку. Далее аналогичным образом создаются оси координат,то есть выбирается цвет командой и рисуются две линии.
Команда “Бак ” Это команда создания бака. Первым шагом является заполнение координат бака, которые мы берем из своего варианта, после чего идет процесс определения этих же координат при заданном угле:
из текстового поля, куда мы вводим угол, значение угла пересчитывается в радианы и записывается в "а",если значение этого "а" получается строго больше или меньше 0,то для координат "x" и "y" каждой точки с помощью цикла находится длины радиус-векторов из начала координат, а также начальные углы их наклона. Начальные углы и задаваемый нами угол складываются и записываются в "d",с помощью этого угла и найденных радиус-векторов с помощью цикла происходит пересчет координат каждой точки, в следствии чего наш бак поворачивается на заданный нами угол.
Далее для каждой точки находим смещение y относительно начала координат, из уравнения прямой(y=kx+c) с помощью цикла находим для каждой точки значение "c",зная координаты каждой точки "x" и "y", а также коэффициента "k" как отношение приращения функции к приращению аргумента, это нам после потребуется для расчета объема бака
Следующим шагом следует сам процесс рисования бака, для начала все заданные нами координаты с помощью цикла пересчитываются в пиксели, далее аналогично с осями координат, выбирается цвет командой RGB и после с помощью цикла командой Line рисуются линии, соединяющие каждую точку бака
Команда“Расчёт”. Это кнопка расчёта объёма. Первым этапом значения ширины считываются с заданного нами текстового поля, а значению объема присваивается 0.
далее также считывается значение уровня топлива, на котором нам и необходимо вычислить объем, если значение этого уровня равно 0,тогда и сам объем становится равным 0 соответственно, а значение объема записывается в заданное текстовое поле, в противном случае с помощью командыDo While контролируется задание нами объема, то есть пока значение объема записываемого нами будет больше максимального значения уровня бака, то будет выскакивать сообщение с просьбой записать значение меньшего уровня и записывается в необходимое текстовое поле.
После чего если в текстовом поле уровня топлива что-то записано, тогда с помощью цикла определяются координаты верхних точек бака, с учетом отсечения на заданный уровень, то есть если значение каких либо координат "y" бака будет больше или равно заданному уровню, тогда им присваивается значение уровня топлива, и если меньше, то определяются значения координат "x",эти координаты являются координатами отсечения бака, соответствующие заданному уровню топлива
Найденные координаты с помощью цикла пересчитываются в пиксели и по ним выбранным цветом используя команду (RGB) рисуется линия командой (Line) отсечения бака на заданный уровень и по формуле высчитывается объем необходимой части нашего бака.
Текста программы
Dim x(100), y(100), r(100), c(100), k(100), px(10000), py(10000), x1(100), y1(100)
Dim color As Long
Private Sub Command1_Click()
'Çàäà¸òñÿ êîîðäèíàòíàÿ ñåòêà
color = RGB(176, 176, 176)
For i = 1 To 10000 Step 200
Form1.Line (0, i)-(10000, i), color
Form1.Line (i, 0)-(i, 10000), color
Next i
color = RGB(0, 0, 0)
Form1.Line (0, 5000)-(10000, 5000), color
Form1.Line (5000, 0)-(5000, 10000), color
End Sub
Private Sub Command2_Click()
' Çàäàþòñÿ òî÷êè, îïèñûâàþùèå áàê è ïîëîæåíèå äàò÷èêà
n = 21
x(1) = 1.17
y(1) = 0.03
x(2) = 1.07
y(2) = 0.23
x(3) = 1.03
y(3) = 0.39
x(4) = 0.83
y(4) = 0.58
x(5) = 0.57
y(5) = 0.68
x(6) = 0.37
y(6) = 0.72
x(7) = -0.43
y(7) = 0.78
x(8) = -0.63
y(8) = 0.73
x(9) = -0.77
y(9) = 0.63
x(10) = -1.03
y(10) = 0.48
x(11) = -1.53
y(11) = 0.03
x(12) = -1.13
y(12) = -0.07
x(13) = -0.63
y(13) = -0.37
x(14) = -0.23
y(14) = -0.68
x(15) = 0.17
y(15) = -0.73
x(16) = 0.37
y(16) = -0.73
x(17) = 0.63
y(17) = -0.64
x(18) = 0.77
y(18) = -0.63
x(19) = 0.98
y(19) = -0.43
x(20) = 1.07
y(20) = -0.17
x(21) = 1.17
y(21) = 0.03
'çàäà¸ì êîîðäèíàòû äàò÷èêà
Z1 = Text10
Z2 = Text10
Q1 = 0.73
Q2 = -0.73
' Çàäà¸ì ïîëîæåíèå äàò÷èêà, áàêà ïðè çàäàííîì óãëå òàíãàæà
A = Val(Text5.Text) * (3.1415926535 / 180)
If A > 0 Or A < 0 Then
For i = 1 To n Step 1
r(i) = Sqr(x(i) * x(i) + y(i) * y(i))
B = Atn(y(i) / x(i))
D = A + B
If x(i) > 0 Then
x(i) = r(i) * Cos(D)
y(i) = r(i) * Sin(D)
Else
x(i) = -r(i) * Cos(D)
y(i) = -r(i) * Sin(D)
End If
Next i
B1 = Atn(Q1 / Z1)
B2 = Atn(Q2 / Z2)
D1 = A + B1
D2 = A + B2
l1 = Sqr(Z1 * Z1 + Q1 * Q1)
l2 = Sqr(Z2 * Z2 + Q2 * Q2)
Q1 = l1 * Sin(D1)
Q2 = l2 * Sin(D2)
Z1 = l1 * Cos(D1)
Z2 = l2 * Cos(D2)
End If
' Íàõîäèì êîýôôèöèåíòû ôóíêöèé, îïèñûâàþùèõ áàê
For i = 1 To n - 1 Step 1
k(i) = (y(i) - y(i + 1)) / (x(i) - x(i + 1))
c(i) = y(i) - k(i) * x(i)
Next i
If A = 0 Then
k(15) = 0.0000001
End If
k(0) = k(20)
c(0) = c(20)
' Çàäà¸ì òî÷êè áàêà è ñîåä èõ ëèíèÿìè
For i = 1 To n
px(i) = 2000 * x(i) + 5000
py(i) = 5000 - 2000 * y(i)
Next i
color = RGB(255, 100, 10)
For i = 1 To n - 1
Form1.Line (px(i), py(i))-(px(i + 1), py(i + 1)), color
Next i
' çàäà¸ì ëèíèþ-ìåñòî ðàñïîëîæåíèå äàò÷èêà
color = RGB(255, 255, 0)
Form1.Line ((2000 * Z1 + 5000), (5000 - 2000 * Q1))-((2000 * Z2 + 5000), (5000 - 2000 * Q2)), color
End Sub
Private Sub Command3_Click()
Cls
End Sub
Private Sub Command4_Click()
' Çàäà¸ì ïàðàìåòðû áàêà è çíà÷åíèå óðîâíÿ òîïëèâà
n = 21
' V-îáú¸ì
V = Val(Text1.Text)
For i = 1 To n Step 1
x1(i) = x(i)
y1(i) = y(i)
Next i
H0 = Val(Text4.Text)
If Len(Text6.Text) Then
step = Val(Text6.Text)
Else
step = H0
End If
Do While H0 > 1.51
H0 = InputBox("Ââîä H0 íå ïðåâûøàåò ìêñèìàëüíîé âûñîòû áàêà = 1.51 ")
Text4.Text = Str$(H0)
Loop
Do While H0 >= 0
vt = 0
H1 = H0 - 0.73
coord = Text10
Text8.Text = Text8.Text + " " + Str$(H0)
' Ó÷¸ò èçìåíåíèÿ ïîëîæåíèÿ äàò÷èêà
A = Val(Text5.Text) * (3.1415926535 / 180)
If A < 0 Or A > 0 Then
B1 = Atn(H1 / coord)
D1 = B1 + A
l1 = Sqr(coord * coord + H1 * H1)
H1 = l1 * Sin(D1)
End If
' Ñìåùåíèå òî÷åê êîîðäèíàò â çàâèñèìîñòè îò óðîâíÿ òîïëèâà
If Len(Text4.Text) Then
For i = 1 To n Step 1
j = i
If y(i) >= H1 Then
y1(i) = H1
If y(i - 1) < H1 Then
If j = 7 Then
x1(i) = (H1 - c(i)) / k(i)
Else
x1(i) = (H1 - c(i - 1)) / k(i - 1)
End If
Else
If (j < 21 And H1 < y(i) And H1 > y(i + 1)) Or (j >= 11 And j < 21) Then
x1(i) = (H1 - c(i)) / k(i)
End If
End If
End If
Next i
End If
' Ðàñ÷¸ò îáú¸ìà òîïëèâà ïî ìåòîäó Íàäæàðîâà
For i = 1 To n - 2 Step 1
w0 = (x1(i + 1) - x1(1)) * (y1(i + 2) - y1(1))
w1 = (x1(i + 2) - x1(1)) * (y1(i + 1) - y1(1))
vt = vt + Abs(V / 2) * (w0 - w1)
Next i
Text7.Text = Text7.Text + " " + Str$(vt)
' Çàäà¸ì ëèíèþ óðîâíÿ òîïëèâà
For i = 1 To n
px(i) = 2000 * x1(i) + 5000
py(i) = 5000 - 2000 * y1(i)
Next i
color = RGB(200, 0, 0)
For i = 1 To n - 1
Form1.Line (px(i), py(i))-(px(i + 1), py(i + 1)), color
Next i
If H0 = 0 Then
H0 = H0 - 1
Else
H0 = H0 - step
End If
Loop
End Sub
Примечание: В данной программе все значения вводимые с клавиатуры вводятся через точку, кроме координат датчика, их нужно вводить через запятую, в противном случае программа не может считать значения и вылетает.
Пример работы программы с краткими пояснениями
Запускаем программу, видим поле с кнопками, выбираем кнопку Коорд Сетка. Программа выдает нам ось координат.
Далее нам необходимо, чтобы наша программа рисовала бак и датчик по заданным координатам. Проверяем это: Нажимаем кнопку с надписью "Бак"и задаём координаты бака 0,1. Программа работает верно.
После чего задаём другие координаты датчика(0,4), что бы убедится что программа работает верно.
Теперь проверяем поворачивается ли наш бак и датчик при угле тангажа 50.
Осталось проверить считает ли моя программа тарировочную характеристику, при заданном значении ширины бака(0.5), максимальном уровне(максимальная H=1.51) и шаге(0.151).
После чего мы видим во фрейме “Тарировочная характеристика” можно сравнить её с тарировочной характеристикой полученной позже в программеSolidWorks.
Н, м | V, м3 |
1,51 | 1,36 |
1,359 | 1,28 |
1,208 | 1,15 |
1,057 | 0,99 |
0,906 | 0,82 |
0,755 | 0,62 |
0,604 | 0,44 |
0,453 | 0,29 |
0,302 | 0,16 |
0,151 | 0,06 |
Видим что есть минимальные расхождения, но в пределах допустимого. То есть мы получили верную тарировочную характеристику.