Пример работы программы с краткими пояснениями
Задание курсовой работы.
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 |
Видим что есть минимальные расхождения, но в пределах допустимого. То есть мы получили верную тарировочную характеристику.