Здравствуйете.
Необходимо написать программу для подбора чисел зубьев зуючето передачи, поз заданным параметрам(пределов передаточного отношения и максимального диаметра).
Надо подобрать числа зубьев z1,z2 и m - модуль зубчатой передачи, значения которого установливаются ГОСТом.
На форме 3 тестбокса, которые заполняет юзер:
- pred_ot - нижний предел передаточного отношения;
- pred_do - верхний предел передаточного отношения;
- d_max - максимальный диаметр колеса.
Как это реализовать(я думаю)
Dim mg(11)' массив со стандартными значениями модуля
Private Sub Command1_Click()
i_ot = Val(pred_ot)
i_do = Val(pred_do)
dmax = Val(d_max)
For i = 0 To 11 ' индекс массива модуля
For z1 = 5 To 100 ' число зубьев колеса
For z2 = 5 To 100 ' число зубьев шестерни
i = z2 / z1 ' вычисляем передаточное отношение
If i > i_ot Then
If i < i_do Then
d2 = z2 * mg(i)
da2 = d2 + 2 * mg(i)' вычисляем max диаметр колеса
If da2 < dmax Then ' проверяем
Debug.Print z1, z2, i, m, da2
End If
End If
End If
Next z2
Next z1
i = i + 1
Next i
End Sub
Советую сделать какую-нибудь базу данных, зачем ты это всё в коде прописваешь? Здесь возможностей меньше...
И ещё:
If i > i_ot Then
If i < i_do Then
d2 = z2 * mg(i)
da2 = d2 + 2 * mg(i)' вычисляем max диаметр колеса
If da2 < dmax Then ' проверяем
Debug.Print z1, z2, i, m, da2
End If
End If
End If
По-моему лучшеоптимальнее будет)
If i > i_ot and i < i_do Then
d2 = z2 * mg(i)
da2 = d2 + 2 * mg(i)' вычисляем max диаметр колеса
If da2 < dmax Then ' проверяем
Debug.Print z1, z2, i, m, da2
End If
End If
Зубчатая передача состоит из 2-х зубчатых колёс. Колесо с меньшим числом зубьев наз шестерня(в условных обозначениях индекс 1, см ниже), с большим - колесо(в условных обозначениях индекс 2).
Передаточным отношением(i) зубчатой передачи наз отношение чисел зубьве колеса(z2) к числу зубьев шестерни(z1), т.е. i=z2/z1. К примеру если на вход(на ведомое колесо передачи) подаётся момент М(к примеру, от двигателя), то на выходе будет М*i.
Модуль забчатого колеса(m) - геометрический параметр, линейная величина, пропорциональная размерам зубчатого колеса(одинаков для колеса и шестерни). Значения модуля установлены соответсвующим ГОСТом.
Диаметр делительной окружности(d)(по которой происходит зацепление зубчатых колёс) определяется по формуле: dj = m*zj, j=1,2. соответственно для шестерни(1) и колеса(2).
Диаметр вершин(da) зубьев зубчетого колеса(максимальный диаметр зубчетого колеса) определяется по формуле: daj=dj+2*m; j=1,2.
Часто приходится решать следующую задачу: задаётся
- предел(как я делал это переменные i_ot и i_do) в который должно попасть передаточное отношение(i) зубчатой передачи;
- максимальный диаметр колеса(из конструктивных соображений, чтобы передача влезла в корпус).(dmax)
Задался целью упростить себе работу , и написать программу для этого расчёта, т.е. на входе имеем предел и диаметр, на выходе: m,z1,z2 удовлетворяющие входу.
т.е. надо перебрать все возможные варианты m,z1,z2 удовлетворяющие введённым условиям
БД для 12 фиксированных значений - не слишком ли жестко? Может и число Пи через удаленный веб-сервис получать, вдруг его надо будет поменять?
Ну лично я бы разместил их на MSFlexGride и обращаться было бы легче. К тому же почему то мне кажется, что это не фиксированные значеня. Стандартные значения модуля разве не моут меняться, ну например от вида зубков или от вида передачи? (хотя наверное это и выходит за рамки этой задачи)
2crazyd:
А я чего-то не понял, у тебя ж i - это индекс массива модуля. А зачем ты его вычиляешь соотношением i=z2/z1? Может тебе не индекс массива так вычислять надо, а его значение., т. е.
mg(i)=z2/z1
И сравнивать тоже не индекс, а значение массива под этим индексом. А то я в коде ничего не понимаю... Зачем ты там индекс массива меняешь, а потом ещё с ним сравниваешь? Где у тебя сами значения массива задействованы???
я чего-то не понял, у тебя ж i - это индекс массива модуля. А зачем ты его вычиляешь соотношением i=z2/z1? Может тебе не индекс массива так вычислять надо, а его значение., т. е.
mg(i)=z2/z1
И сравнивать тоже не индекс, а значение массива под этим индексом. А то я в коде ничего не понимаю... Зачем ты там индекс массива меняешь, а потом ещё с ним сравниваешь? Где у тебя сами значения массива задействованы???
Да с индексом я напутал.
Private Sub Command1_Click()
i_ot = Val(pred_ot)
i_do = Val(pred_do)
dmax = Val(d_max)
For k = 0 To 10
For z1 = 5 To 1000
For z2 = 5 To 1000
i = z2 / z1
If i > i_ot And i < i_do Then
d2 = z2 * mg(k)
da2 = d2 + 2 * mg(k)
If da2 < dmax Then
Debug.Print z1, z2, i, mg(k), da2
Стандартные значения модуля разве не моут меняться, ну например от вида зубков или от вида передачи? (хотя наверное это и выходит за рамки этой задачи)
Да меняются. Но пока мне бы просто сам алгоритм подбора разобрать.
while da2 < dmax
while i > i_ot and i < i_do
' а здесь уже реализовать изменение чисел зубьев(z1 и z2)
i=z2/z1
wend 'i > i_ot and i < i_do
wend 'da2 < dmax
то
Не стоит менять переменную цикла в цикле.
Вот ещё такой вопрос: а нельзи как-нить оптимизировать этот кусок кода, чтобы не перебирать числа зубьев(до 1000), а сделать
Не перечисляя... Хм. Хорошая задачка...
Private Sub Command1_Click()
i_ot = Val(pred_ot)
i_do = Val(pred_do)
dmax = Val(d_max)
For k = 0 To 10
For z1 = 5 To 1000
For z2 = 5 To 1000
i = z2 / z1
If i > i_ot And i < i_do Then
d2 = z2 * mg(k)
da2 = d2 + 2 * mg(k)
If da2 < dmax Then
Debug.Print z1, z2, i, mg(k), da2