Pull to refresh

Рассчитываем шпоночное соединение с помощью Python

Reading time 8 min
Views 11K
В начале несколько слов о себе: работаю инженером, соответственно моя работа связана с проектированием различных механизмов. Во многих из них присутствует такая вещь, как шпоночное соединение. И несмотря на то, что для его расчета на смятие использует весьма простая формула, считать каждый раз ручками мне быстро надоело и было принято волевое решение об автоматизации сего процесса.



Изначально автоматизация заключалась в банальном 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 мне весьма понравился да и его применение в моей работе действительно возможно (хотя бы для того же КОМПАС скрипты писать). В будущем планирую добавить несколько дополнительных режимов расчета в зависимости от того, что нужно определить. Ну а в совсем отдаленном будущем — возможно появление пользовательского интерфейса.
Также я понимаю, что сим скромным произведением я врят ли удивлю почтенную публику Хабрахабр (если только не брать в расчет кривизну исходного кода). Но надеюсь на понимание и (возможно) рекомендации по улучшению.
Tags:
Hubs:
+10
Comments 15
Comments Comments 15

Articles