Страница: 1 |
Вопрос: Подбор чисел зубьев ЗК | Добавлено: 24.08.06 13:03 |
Автор вопроса: ![]() |
Здравствуйете.
Необходимо написать программу для подбора чисел зубьев зуючето передачи, поз заданным параметрам(пределов передаточного отношения и максимального диаметра). Исходные данные: - i_ot - нижний предел передаточного отношения; - i_do - верхний предел передаточного отношения; - d_max - максимальный диаметр колеса. Надо подобрать числа зубьев 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 Private Sub Form_Load() mg(0) = 1 mg(1) = 1.25 mg(2) = 1.5 mg(3) = 2 mg(4) = 2.5 mg(5) = 3 mg(6) = 4 mg(7) = 5 mg(8) = 6 mg(9) = 8 mg(10) = 10 mg(11) = 12 End Sub чё-то невыходит. после запуска ничё не происходит, спасает только ctrl+break. ЗЫ: может как-то можно реализовать по другому, без перебора чисел зубьев? Подскажите пожалуйста. Заранее благодраен. |
Ответы | Всего ответов: 15 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 24.08.06 13:32 |
i = z2 / z1 ' вычисляем передаточное отношение
Не стоит менять переменную цикла в цикле. |
Номер ответа: 2 Автор ответа: ![]() ![]() Вопросов: 6 Ответов: 13 |
Профиль | Цитата | #2 | Добавлено: 24.08.06 14:31 |
Да, это моя невнимательность. Спасибо! |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 24.08.06 15:03 |
И это тоже не надо
i = i + 1
потому что уже есть "0 To 11". Счётчик цикла без особой нужды внутри цикла не меняй. А если и меняешь, то не билибердой всякой, а только новым количеством проходов цикла. Dim i2 As Integer
i2 = z2 / z1 |
Номер ответа: 4 Автор ответа: ![]() ![]() Вопросов: 55 Ответов: 1008 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 24.08.06 15:23 |
mg(0) = 1
Советую сделать какую-нибудь базу данных, зачем ты это всё в коде прописваешь? Здесь возможностей меньше...
mg(1) = 1.25 mg(2) = 1.5 mg(3) = 2 mg(4) = 2.5 mg(5) = 3 mg(6) = 4 mg(7) = 5 mg(8) = 6 mg(9) = 8 mg(10) = 10 mg(11) = 12 И ещё: 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 |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 24.08.06 15:41 |
Советую сделать какую-нибудь базу данных
БД для 12 фиксированных значений - не слишком ли жестко? Может и число Пи через удаленный веб-сервис получать, вдруг его надо будет поменять? |
Номер ответа: 6 Автор ответа: ![]() ![]() Вопросов: 6 Ответов: 13 |
Профиль | Цитата | #6 | Добавлено: 24.08.06 16:57 |
Спасибо большое за ответы.
Вот ещё такой вопрос: а нельзи как-нить оптимизировать этот кусок кода, чтобы не перебирать числа зубьев(до 1000), а сделать 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 Заранее благодарен. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 24.08.06 17:24 |
Если ты объяснишь, что все эти термины значат и что чему должно быть равно, тогда поможем ![]() |
Номер ответа: 8 Автор ответа: ![]() ![]() Вопросов: 6 Ответов: 13 |
Профиль | Цитата | #8 | Добавлено: 24.08.06 18:00 |
Зубчатая передача состоит из 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 удовлетворяющие введённым условиям |
Номер ответа: 9 Автор ответа: ![]() ![]() Вопросов: 55 Ответов: 1008 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 24.08.06 19:08 |
2Sharp:
БД для 12 фиксированных значений - не слишком ли жестко? Может и число Пи через удаленный веб-сервис получать, вдруг его надо будет поменять? Ну лично я бы разместил их на MSFlexGride и обращаться было бы легче. К тому же почему то мне кажется, что это не фиксированные значеня. Стандартные значения модуля разве не моут меняться, ну например от вида зубков или от вида передачи? (хотя наверное это и выходит за рамки этой задачи)
2crazyd: А я чего-то не понял, у тебя ж i - это индекс массива модуля. А зачем ты его вычиляешь соотношением i=z2/z1? Может тебе не индекс массива так вычислять надо, а его значение., т. е. mg(i)=z2/z1 И сравнивать тоже не индекс, а значение массива под этим индексом. А то я в коде ничего не понимаю... Зачем ты там индекс массива меняешь, а потом ещё с ним сравниваешь? Где у тебя сами значения массива задействованы??? |
Номер ответа: 10 Автор ответа: ![]() ![]() Вопросов: 55 Ответов: 1008 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 24.08.06 19:11 |
и обращаться было бы легче Хотя может я привык просто
|
Номер ответа: 11 Автор ответа: ![]() ![]() Вопросов: 6 Ответов: 13 |
Профиль | Цитата | #11 | Добавлено: 24.08.06 19:13 |
я чего-то не понял, у тебя ж 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 End If End If Next z2 Next z1 Next k End Sub |
Номер ответа: 12 Автор ответа: ![]() ![]() Вопросов: 6 Ответов: 13 |
Профиль | Цитата | #12 | Добавлено: 24.08.06 19:16 |
Стандартные значения модуля разве не моут меняться, ну например от вида зубков или от вида передачи? (хотя наверное это и выходит за рамки этой задачи)
Да меняются. Но пока мне бы просто сам алгоритм подбора разобрать. |
Номер ответа: 13 Автор ответа: ![]() ![]() Вопросов: 55 Ответов: 1008 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 24.08.06 20:01 |
Что касается
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 End If End If Next z2 Next z1 Next k End Sub Здесь всё должно работать. |
Номер ответа: 14 Автор ответа: ![]() ![]() Вопросов: 6 Ответов: 13 |
Профиль | Цитата | #14 | Добавлено: 24.08.06 20:27 |
спасибо большое за помощь! |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 2 |
Профиль | Цитата | #15 | Добавлено: 06.11.09 15:22 |
А гост вот этот? [url]http://realgost.ru/gosty/gost/oks/21/21200/gost_19624-74.html[/url] |
Страница: 1 |
|