Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Подбор чисел зубьев ЗК Добавлено: 24.08.06 13:03  

Автор вопроса:  crazyd
Здравствуйете.
Необходимо написать программу для подбора чисел зубьев зуючето передачи, поз заданным параметрам(пределов передаточного отношения и максимального диаметра).

Исходные данные:
- 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
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 24.08.06 13:32
                i = z2 / z1 ' вычисляем передаточное отношение

Не стоит менять переменную цикла в цикле.

Ответить

Номер ответа: 2
Автор ответа:
 crazyd



Вопросов: 6
Ответов: 13
 Профиль | | #2 Добавлено: 24.08.06 14:31
Да, это моя невнимательность. Спасибо!

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #3
Добавлено: 24.08.06 15:03
И это тоже не надо
i = i + 1

потому что уже есть "0 To 11".

Счётчик цикла без особой нужды внутри цикла не меняй. А если и меняешь, то не билибердой всякой, а только новым количеством проходов цикла.
Dim i2 As Integer
i2 = z2 / z1

Ответить

Номер ответа: 4
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #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
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 24.08.06 15:41
Советую сделать какую-нибудь базу данных

БД для 12 фиксированных значений - не слишком ли жестко? Может и число Пи через удаленный веб-сервис получать, вдруг его надо будет поменять?

Ответить

Номер ответа: 6
Автор ответа:
 crazyd



Вопросов: 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
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 24.08.06 17:24
Если ты объяснишь, что все эти термины значат и что чему должно быть равно, тогда поможем :) Мы же, в основном, не инженеры, а программисты.

Ответить

Номер ответа: 8
Автор ответа:
 crazyd



Вопросов: 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 удовлетворяющие входу.

т.е. надо перебрать все возможные варианты m,z1,z2 удовлетворяющие введённым условиям

Ответить

Номер ответа: 9
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #9
Добавлено: 24.08.06 19:08
2Sharp:
БД для 12 фиксированных значений - не слишком ли жестко? Может и число Пи через удаленный веб-сервис получать, вдруг его надо будет поменять?
Ну лично я бы разместил их на MSFlexGride и обращаться было бы легче. К тому же почему то мне кажется, что это не фиксированные значеня. Стандартные значения модуля разве не моут меняться, ну например от вида зубков или от вида передачи? (хотя наверное это и выходит за рамки этой задачи)
2crazyd:
А я чего-то не понял, у тебя ж i - это индекс массива модуля. А зачем ты его вычиляешь соотношением i=z2/z1? Может тебе не индекс массива так вычислять надо, а его значение., т. е.
mg(i)=z2/z1
И сравнивать тоже не индекс, а значение массива под этим индексом. А то я в коде ничего не понимаю... Зачем ты там индекс массива меняешь, а потом ещё с ним сравниваешь? Где у тебя сами значения массива задействованы???

Ответить

Номер ответа: 10
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #10
Добавлено: 24.08.06 19:11
и обращаться было бы легче
Хотя может я привык просто

Ответить

Номер ответа: 11
Автор ответа:
 crazyd



Вопросов: 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
Автор ответа:
 crazyd



Вопросов: 6
Ответов: 13
 Профиль | | #12 Добавлено: 24.08.06 19:16
Стандартные значения модуля разве не моут меняться, ну например от вида зубков или от вида передачи? (хотя наверное это и выходит за рамки этой задачи)


Да меняются. Но пока мне бы просто сам алгоритм подбора разобрать.

Ответить

Номер ответа: 13
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #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
Автор ответа:
 crazyd



Вопросов: 6
Ответов: 13
 Профиль | | #14 Добавлено: 24.08.06 20:27
спасибо большое за помощь!

Ответить

Номер ответа: 15
Автор ответа:
 Helli



Вопросов: 0
Ответов: 2
 Профиль | | #15 Добавлено: 06.11.09 15:22
А гост вот этот? [url]http://realgost.ru/gosty/gost/oks/21/21200/gost_19624-74.html[/url]

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам