Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Рассчитываем шпоночное соединение с поддержкой Python

Anna | 16.06.2014 | нет комментариев
В начале несколько слов о себе: тружусь инженером, соответственно моя работа связана с проектированием разных механизмов. Во многих из них присутствует такая вещь, как шпоночное соединение. И невзирая на то, что для его расчета на смятие использует крайне простая формула, считать всякий раз ручками мне стремительно наскучило и было принято волевое решение об автоматизации сего процесса.

Первоначально автоматизация заключалась в тривиальном Excel-файле, в котором были «забиты» соответствующие формулы. Но потом было решено написать небольшую программу. Причем это преследовало сразу две цели — получить больше комфортный «продукт» и наконец-то написать что-то подлинно пригодное на Python, тот, что мне давным-давно нравится. Правда познания мои в этой области крайне и крайне скромные, но тем задача увлекательнее.

В заключении, немножко теории. Для расчета шпоночного соединения применяется формула, показанная на картинке. В ней применяются следующие величины:

  • Т — это момент, действующий на валу (Н*м)
  • d — диаметр вала (мм)
  • [сигма] — допускаемые напряжения смятия (Н/мм.кв)
  • lp — рабочая длина шпонки (мм)
  • h — высота шпонки (мм)
  • t — глубина шпоночного паза на валу (мм)

Собственно со вступлением покончено, переходим непринужденно к программе. Алгорифм расчета подлинно легкой:
1. Пользователь вводит диаметр вала.
2. Исходя из полученного значения диаметра определяются параметры шпонки.
3. Пользователь выбирает материал ступицы, от которого зависит допускаемое напряжение смятия.
4. Пользователь вводит значение момента, действующего на валу.
5. Пользователь вводит значение длины шпонки.
6. Расчет и итог итога.
На самом деле данный алгорифм должен включать еще несколько пунктов, которые я не указал. Речь идет о проверках того, что именно пользователь ввел (строку либо число).
Выходит, начнем со ввода начальных параметров. Для ввода значений с клавиатуры применяется дальнейшая конструкция:

d = int(raw_input("Введите значение диаметра вала, мм: "))

С ее поддержкой мы получаем символы с клавиатуры и преобразуем их из строки в число. Казалось бы, все легко. Впрочем, позже вдумчивого обдумывания я решил несколько усложнить данный код:

while 1:
    try:
        d = int(raw_input("Введите значение диаметра вала, мм: "))
        break
    except ValueError:
        print ("Нужно ввести число!")

В итоге, программа сама контролирует, что именно вводит пользователь — число либо строку. И во втором случае выдает соответствующее предупреждение. Безмерный цикл здесь применяется для того, Дабы рано либо поздно получить от пользователя нужные данные. С поддержкой аналогичного приема программа получает и остальные нужные ей данный, сразу же их проверяя на правильность.
Переходим к определению параметров самой шпонки. Здесь, к сожалению, я не придумал ничего разумнее, как применять касательно длинный список из if — elif — else:

if 6 <= d < 8:
    shponka = {"b": 2, "h": 2, "t1": 1.2, "t2": 1.0}
elif 8 <= d < 10:
    shponka = {"b": 3, "h": 3, "t1": 1.8, "t2": 1.4}
elif 10 <= d < 12:
    shponka = {"b": 4, "h": 4, "t1": 2.5, "t2": 1.8}
elif 12 <= d < 17:
    shponka = {"b": 5, "h": 5, "t1": 3.0, "t2": 2.3}
elif 17 <= d < 22:
    shponka = {"b": 6, "h": 6, "t1": 3.5, "t2": 2.8}
elif 22 <= d < 30:
    shponka = {"b": 8, "h": 7, "t1": 4.0, "t2": 3.3}
elif 30 <= d < 38:
    shponka = {"b": 10, "h": 8, "t1": 5.0, "t2": 3.3}
elif 38 <= d < 44:
    shponka = {"b": 12, "h": 8, "t1": 5.0, "t2": 3.3}
elif 44 <= d < 50:
    shponka = {"b": 14, "h": 9, "t1": 5.5, "t2": 3.8}
elif 50 <= d < 58:
    shponka = {"b": 16, "h": 10, "t1": 6.0, "t2": 4.3}
elif 58 <= d < 65:
shponka = {"b": 18, "h": 11, "t1": 7.0, "t2": 4.4}
elif 65 <= d < 75:
    shponka = {"b": 20, "h": 12, "t1": 7.5, "t2": 4.9}
elif 75 <= d < 85:
    shponka = {"b": 22, "h": 14, "t1": 9.0, "t2": 5.4}
elif 85 <= d < 95:
    shponka = {"b": 25, "h": 14, "t1": 9.0, "t2": 5.4}
elif 95 <= d < 110:
    shponka = {"b": 28, "h": 16, "t1": 10.0, "t2": 6.4}
elif 110 <= d < 130:
    shponka = {"b": 32, "h": 18, "t1": 11.0, "t2": 7.4}
else:
    print("Диаметр вала выходит за границы стандартных размеров для шпоночного соединения")
    raw_input("Для выхода нажмите всякую клавишу")
    exit()
print ("Ширина шпонки = "   str(shponka["b"])   " мм, высота шпонки = "   str(shponka["h"])   " мм, глубина паза на валу = "   str(shponka["t1"])   " мм, глубина паза во втулке = "   str(shponka["t2"])   " мм")

Параметры шпонки записываются в словарь — мне показалось, что таким образом с ними будет проще трудиться. Сейчас определяем рабочую длину шпонки:

l_work = l - shponka["b"]

А после этого собственно напряжение смятия:

napr = (2 * 1000 * moment) / (d * l_work * (shponka["h"] - shponka["t1"]))

Полученное значение напряжения смятия сравнивается с допускаемым. Здесь допустимы два варианта:
1. Допускаемое значение напряжения не превышено, значит выбранная шпонка нас удовлетворяет.
2. Допускаемое значение напряжения превышено. Здесь было бы недурно знать, как это дозволено поправить. В большинстве случаев особенно легкой путь для этого — метаморфоза длины шпонки. Следственно программа пересчитывает длину шпонки исходя из того, Дабы напряжения смятия были на 20 единиц ниже допускаемых (обыкновенно этого довольно).
На языке Python это будет выглядеть дальнейшим образом:

if napr <= dopysk_napr:
    print("Напряжения в шпоночном соединении составляют "   str(napr)   " Н/мм^2. Допускаемые напряжения составляют "   str(dopysk_napr)   " Н/мм^2.")
    raw_input("Для выхода нажмите всякую клавишу")
    exit()
else:
    print("Данная шпонка не подходит для данных параметров! Напряжения превышают возможные для данного материала ступицы!")
    #вычисляем нужную рабочую длину шпонки
    l_work_rek = (2 * 1000 * moment) / ((dopysk_napr - 20) * d * (shponka["h"] - shponka["t1"]))
    #вычисляем нужную длину шпонки с учетом скруглений
    l_rek = l_work_rek   shponka["b"]
    #напряжения при применении шпонки рекомендованной длины
    napr_rek = (2 * 1000 * moment) / (d * l_work_rek * (shponka["h"] - shponka["t1"]))
    print("Рекомендуется увеличить шпонку до "   str(l_rek)   " мм. В этом случае напряжения составляют "   str(napr_rek)   " Н/мм^2.")
    raw_input("Для выхода нажмите всякую клавишу")
    exit()

Ну и в заключении, полный код программы:

# -*- coding: cp866 -*-
#вводим диаметр вала и проверяем правильность ввода (число либо нет)
while 1:
    try:
        d = int(raw_input("Введите значение диаметра вала, мм: "))
        break
    except ValueError:
        print ("Нужно ввести число!")
#определяем, какая шпонка применяется при данном диаметре вала
if 6 <= d < 8:
    shponka = {"b": 2, "h": 2, "t1": 1.2, "t2": 1.0}
elif 8 <= d < 10:
    shponka = {"b": 3, "h": 3, "t1": 1.8, "t2": 1.4}
elif 10 <= d < 12:
    shponka = {"b": 4, "h": 4, "t1": 2.5, "t2": 1.8}
elif 12 <= d < 17:
    shponka = {"b": 5, "h": 5, "t1": 3.0, "t2": 2.3}
elif 17 <= d < 22:
    shponka = {"b": 6, "h": 6, "t1": 3.5, "t2": 2.8}
elif 22 <= d < 30:
    shponka = {"b": 8, "h": 7, "t1": 4.0, "t2": 3.3}
elif 30 <= d < 38:
    shponka = {"b": 10, "h": 8, "t1": 5.0, "t2": 3.3}
elif 38 <= d < 44:
    shponka = {"b": 12, "h": 8, "t1": 5.0, "t2": 3.3}
elif 44 <= d < 50:
    shponka = {"b": 14, "h": 9, "t1": 5.5, "t2": 3.8}
elif 50 <= d < 58:
    shponka = {"b": 16, "h": 10, "t1": 6.0, "t2": 4.3}
elif 58 <= d < 65:
    shponka = {"b": 18, "h": 11, "t1": 7.0, "t2": 4.4}
elif 65 <= d < 75:
    shponka = {"b": 20, "h": 12, "t1": 7.5, "t2": 4.9}
elif 75 <= d < 85:
    shponka = {"b": 22, "h": 14, "t1": 9.0, "t2": 5.4}
elif 85 <= d < 95:
    shponka = {"b": 25, "h": 14, "t1": 9.0, "t2": 5.4}
elif 95 <= d < 110:
    shponka = {"b": 28, "h": 16, "t1": 10.0, "t2": 6.4}
elif 110 <= d < 130:
    shponka = {"b": 32, "h": 18, "t1": 11.0, "t2": 7.4}
else:
    print("Диаметр вала выходит за границы стандартных размеров для шпоночного соединения")
    raw_input("Для выхода нажмите всякую клавишу")
    exit()
print ("Ширина шпонки = "   str(shponka["b"])   " мм, высота шпонки = "   str(shponka["h"])   " мм, глубина паза на валу = "   str(shponka["t1"])   " мм, глубина паза во втулке = "   str(shponka["t2"])   " мм")
#выбираем материал ступицы и проверяем правильность ввода
while 1:
    try:
        material = raw_input("Укажите вид материала ступицы: железо (1) либо чугун (2). ")
        break
    except ValueError:
        print ("Выберите один из предложенных вариантов материала, введя необходимую цифру.")
if material == "1":
    dopysk_napr = 130 #указано в Н/мм^2
elif material == "2":
    dopysk_napr = 80 #указано в Н/мм^2
else:
    print("Указан неверный тип материала!")
    raw_input("Для выхода нажмите всякую клавишу")
    exit()
#ввод значения действующего на соединение момента и проверка правильности ввода
while 1:
    try:
        moment = int(raw_input("Введите значение действующего на соединение момента в Нм: "))
        break
    except ValueError:
        print ("Нужно ввести цисленное значение действующего на соединение момента!")
#ввод значения длины шпонки и проверка правильности ввода
while 1:
    try:
        l = int(raw_input("Введите значение длины шпонки в мм: "))
        break
    except ValueError:
        print ("Нужно ввести число!")
#вычисляем рабочую длину шпонки (принимаем, что шпонка с закругленными торцами)
l_work = l - shponka["b"]
#вычисляем значение напряжения среза в соединении и сопоставляем его с допускаемым
napr = (2 * 1000 * moment) / (d * l_work * (shponka["h"] - shponka["t1"]))
if napr <= dopysk_napr:
    print("Напряжения в шпоночном соединении составляют "   str(napr)   " Н/мм^2. Допускаемые напряжения составляют "   str(dopysk_napr)   " Н/мм^2.")
    raw_input("Для выхода нажмите всякую клавишу")
    exit()
else:
    print("Данная шпонка не подходит для данных параметров! Напряжения превышают возможные для данного материала ступицы!")
    #вычисляем нужную рабочую длину шпонки
    l_work_rek = (2 * 1000 * moment) / ((dopysk_napr - 20) * d * (shponka["h"] - shponka["t1"]))
    #вычисляем нужную длину шпонки с учетом скруглений
    l_rek = l_work_rek   shponka["b"]
    #напряжения при применении шпонки рекомендованной длины
    napr_rek = (2 * 1000 * moment) / (d * l_work_rek * (shponka["h"] - shponka["t1"]))
    print("Рекомендуется увеличить шпонку до "   str(l_rek)   " мм. В этом случае напряжения составляют "   str(napr_rek)   " Н/мм^2.")
    raw_input("Для выхода нажмите всякую клавишу")
    exit()

На этом моя работа над этой программой скорее каждого не закончится, т.к. Python мне крайне понравился да и его использование в моей работе подлинно допустимо (правда бы для того же КОМПАС скрипты писать). В грядущем планирую добавить несколько дополнительных режимов расчета в зависимости от того, что необходимо определить. Ну а в вовсе отдаленном грядущем — допустимо возникновение пользовательского интерфейса.
Также я понимаю, что сим скромным произведением я врят ли поражу почтенную публику Програпрогр (если только не брать в расчет кривизну начального кода). Но верю на осознавание и (допустимо) рекомендации по совершенствованию.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB