Автоматизация расчета нормы времени с использованием Python

Всем привет! На Хабре я новичок, решила поделиться своими скромными идеями и выслушать ваше мнение, возможно, вы дадите мне дельные советы.

Отработав три года, как инженер по нормированию труда, я поняла, что основная моя работа связана с тем, чтобы качественно и быстро обработать большие объёмы данных. Порой данных было так много, а времени просто не хватало, отчего зависал Excel или просто возникали ошибки в формулах.

Поэтому я решила хотя бы частично автоматизировать процесс расчета нормы времени на изготовление различного рода деталей.

Для начала у меня есть таблица Excel, где в левой части таблицы представлена выгрузка деталей из программ CAD. В моем примере это стандартные накладки, которым требуется фрезерная обработка.

b5ec75aaff5cfbec1d210e0c719b67bb.png

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

Тм = Li / S,

где  L — расчётная длина пути режущего инструмента в направлении подачи, мм; i — число проходов; S — подача, мм/об.

L = l + l1 + l2

где l — расчетная длина обрабатываемой поверхности, мм; l1 = t * ctg угла φ — величина врезания резца, мм; t — глубина резания, мм;  φ — главный угол в плане резца; l2 = 1–3 мм — выход (перебег) резца.

54293befa01e02796feda6b707c18271.png

Для своей таблицы я установила значения данных переменных рандомно, так как основная задача кода это расчет нормы времени. На современных производствах нет необходимости считать машинное время вручную с помощью формул, так как большинство применяемых станков с ЧПУ, а, соответственно, всегда есть возможность выгрузить значения машинного времени в файл Excel.

Теперь перейдем непосредственно к коду. Импортируем все необходимые библиотеки.

import numpy as np
import pandas as pd
import openpyxl

Укажем путь к нашему Excel-файлу и считаем данные в DataFrame с помощью `pandas`. Выведем первые пять строк таблицы, чтобы мы могли убедиться, что данные загружены правильно.

file_path = 'time.xlsx'
df = pd.read_excel(file_path)
print(df.head())

1733a84ccf93141a661e3888a86cd4f5.jpg

Произведем расчет машинного времени в минутах на единицу продукции, предварительно проверив, что все необходимые столбцы присутствуют в данных. Если какой-то столбец отсутствует, выбрасывается ошибка. Затем мы приводим значения этих столбцов к числовому типу, используя `pd.to_numeric ()`. Полученные значения машинного времени выводим в массив.

columns_to_extract = ['L', 'i', 'S']
missing_columns = [col for col in columns_to_extract if col not in df.columns]
if missing_columns:
    raise KeyError(f"The following columns are missing from the DataFrame: {missing_columns}")
df[columns_to_extract] = df[columns_to_extract].apply(pd.to_numeric, errors='coerce')
df['Tm'] = (df['L'] * df['i']) /  df['S']
Tm_array = df['Tm'].values
print(Tm_array)

8b139e1935f004989dc9772d0a56c69a.jpg

Теперь необходимо рассчитать поправочные коэффициенты: коэффициент партийности, коэффициент в зависимости от количества обслуживаемых станков и организации рабочего места. Данные коэффициенты представлены в таблицах в нормативном документе »Общемашиностроительные укрупненные нормативы времени на работы, выполняемые на металлорежущих станках».

Рассчитаем коэффициент партийности, написав следующую функцию*:

*При выводе коэффициента необходимо указать тип станка, в моем случае — это станки с ручным управлением.

В результате получаем массив данных со значением коэффициента партийности в зависимости от количества деталей.

data_n = {
    'Число деталей в партии': ['1..2', '3..5', '6..10', '11..20', '21..40', '41..90', 'свыше 90'],
    'при обработке на станках с ручным управлением': [1, 0.9, 0.8, 0.75, 0.7, 0.6, 0.55],
    'при обработке на станках с полуавтоматическим циклом (зубообрабатывающие, дисковые пилы и т.д.)': [1, 0.98, 0.95, 0.92, 0.9, 0.86, 0.85]
}
df_codes = pd.DataFrame(data_n)
def get_n_value(part_counts, col_name):
    if part_counts <= 2:
        return df_codes.loc[df_codes['Число деталей в партии'] == '1..2', col_name].values[0]
    elif 3 <= part_counts <= 5:
        return df_codes.loc[df_codes['Число деталей в партии'] == '3..5', col_name].values[0]
    elif 6 <= part_counts <= 10:
        return df_codes.loc[df_codes['Число деталей в партии'] == '6..10', col_name].values[0]
    elif 11 <= part_counts <= 20:
        return df_codes.loc[df_codes['Число деталей в партии'] == '11..20', col_name].values[0]
    elif 21 <= part_counts <= 40:
        return df_codes.loc[df_codes['Число деталей в партии'] == '21..40', col_name].values[0]
    elif 41 <= part_counts <= 90:
        return df_codes.loc[df_codes['Число деталей в партии'] == '41..90', col_name].values[0]
    else:
        return df_codes.loc[df_codes['Число деталей в партии'] == 'свыше 90', col_name].values[0]
number = ['Кол-во']
data_num = df[number].values
part_counts = data_num # количество деталей в партии
kn = [get_n_value(count, 'при обработке на станках с ручным управлением') for count in part_counts]
print(kn)     

f698624c5b48bbb27a576b61ed185a69.jpg

Рассчитаем коэффициент обслуживания станков в зависимости от числа станков и формы организации труда. Коды 1,2,3 означают значения коэффициентов занятости (таблица 2, Карта 1 лист 1 »Общемашиностроительные укрупненные нормативы времени на работы, выполняемые на металлорежущих станках».)

def get_valor(количество_станков, тип):
    # Извлечение данных из таблицы
    data_os = {
        'Количество станков': ['2', '3', '4'],
        'Индивидуальная_1': [0.56, 0.39, 0.33],
        'Индивидуальная_2': [0.65, 0.48, 0.39],
        'Индивидуальная_3': [0.75, 0.55, 0.47],
        'Бригадная_1': [0.53, 0.37, 0.30],
        'Бригадная_2': [0.60, 0.44, 0.37],
        'Бригадная_3': [0.67, 0.51, 0.45],
    }
    # Проверка наличия входных данных в таблице
    if количество_станков not in data_os['Количество станков'] or тип + '_1' not in data_os:
        return "Неверные данные"

    # Нахождение индекса в списке количества станков
    index = data_os['Количество станков'].index(количество_станков)

    # Возвращение значения в зависимости от количества станков и типа
    return data_os[тип + '_1'][index]
kos = get_valor('2', 'Индивидуальная')
print(kos)

Далее рассчитаем значение коэффициента организации труда в зависимости от группы станков (в моем случае группа станков 1):

data_org = {
        'Группа станков': ['1', '2'],
        'Коэффициент организации': [1, 0.80],
        
    }
def get_coeff(группа_станков):
    # Извлечение данных из таблицы
    data_org = {
        'Группа станков': ['1', '2'],
        'Коэффициент организации': [1, 0.80],
    }

    # Проверка наличия входных данных в таблице
    if группа_станков not in data_org['Группа станков']:
        return "Неверные данные"

    # Нахождение индекса в списке группы станков
    index = data_org['Группа станков'].index(группа_станков)

    # Возвращение значения в зависимости от группы станков
    return data_org['Коэффициент организации'][index]

# Пример использования функции
korg = get_coeff('1')
print(korg)

На основании тех же самых «Общемашиностроительных нормативов …» формула для расчета штучного времени будет выглядеть следующим образом:

Норма штучного времени  определяется путем суммирования времени на установку и снятие детали и неполного штучного времени на обработку поверхностей.

Т_ш=(Т_вспом+Т_н.ш.) )×К_п×К_ос ×К_орм,мин

Поправочные коэффициенты мы уже рассчитали, а потому осталось рассчитать неполное штучное время и вспомогательное время.

Нормативы неполного штучного времени на обработку поверхности включают:

— основное время (в нашем случае машинное время)

— вспомогательное время, связанное с обработкой поверхности в зависимости от ее размеров, вида и характера обработки, технических условий на обработку;

— вспомогательное время на изменение режима работы станка и смену инструмента;

— время на обслуживание рабочего места, перерывы на отдых и личные потребности.

Так как накладки в моем примере имеют маленькие размеры и обрабатываются на одном и том же станке, будем учитывать только время на обслуживание рабочего места. Данные будут считываться из таблицы Excel

df1 = pd.read_excel(file_path, sheet_name ='t_обсл')
print(df1.head())

e93ba43d2b005813919ac35a2de000d4.jpg

Для удобства выбора типа станка я использовала нумерацию от 1 до 5 в зависимости от типа станка. Так как информация считывается из файла, вы можете в него заносить любую информацию, необходимую для ваших расчетов.

Tobsl = df1.loc[df1['Код'] == 1, 'Время_обсл,%'].iloc[0]
print(Tobsl)
Tnsht=Tm_array+Tobsl/100
print(Tnsht)

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

df2 = pd.read_excel(file_path, sheet_name ='t_вспом')
print(df2.head())
t_vc = df2.loc[df2['Код'] == 1, 'Время_вспом,мин'].iloc[0]
print(t_vc)

86c5cfc6096a8b01562b4be84747d4a0.jpg

Рассчитываем значение штучного времени по формуле, указанной выше:

Tsht=(t_vc+Tnsht)*kn*kos*korg
print(Tsht)

Наконец, норма времени на работы, выполняемые на металлорежущих станках, состоит из штучного времени Тш и подготовительно-заключительного времени tп.з и определяется по формуле:

Н_вр =Т_ш (1+Т_пз /100),мин

# Расчет подготовительно-заключительного времени
df3 = pd.read_excel(file_path, sheet_name ='t_пзв')
print(df3.head())
Tpz = df3.loc[df3['Позиция'] == 2, 'Пзв,%'].iloc[0]
print(Tpz)
# Расчет нормы времени
N_vr=Tsht*(1 + Tpz/100)
print(N_vr)

50096bdd0aacdbaf027eae3f6ac1f732.jpg

В заключении рассчитаем время на партию в часах и выгрузим полученные значения в файл Excel.

col=np.transpose(data_num)
print(col)
#Норма времени на партию, в часах
N_part=(N_vr*col)/60
print(N_part)
# Создание нового файла Excel
workbook = openpyxl.Workbook()
sheet = workbook.active
# Запись данных в ячейки
for row_idx, row in enumerate(N_part, start=1):
    for col_idx, value in enumerate(row, start=1):
        sheet.cell(row=col_idx, column=row_idx, value=value) 
# Сохранение файла Excel
workbook.save("Расчет_времени.xlsx")

Эти шаги демонстрируют, как можно автоматизировать процесс расчета нормы времени, используя Python. Это значительно упрощает работу с большими объемами данных и снижает вероятность ошибок.

© Habrahabr.ru