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

от автора

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

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

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

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

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

Тм = Li / S,

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

L = l + l1 + l2

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

Для своей таблицы я установила значения данных переменных рандомно, так как основная задача кода это расчет нормы времени. На современных производствах нет необходимости считать машинное время вручную с помощью формул, так как большинство применяемых станков с ЧПУ, а, соответственно, всегда есть возможность выгрузить значения машинного времени в файл 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())

Произведем расчет машинного времени в минутах на единицу продукции, предварительно проверив, что все необходимые столбцы присутствуют в данных. Если какой-то столбец отсутствует, выбрасывается ошибка. Затем мы приводим значения этих столбцов к числовому типу, используя `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)

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

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

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

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

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)     

Рассчитаем коэффициент обслуживания станков в зависимости от числа станков и формы организации труда. Коды 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())

Для удобства выбора типа станка я использовала нумерацию от 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)

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

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)

В заключении рассчитаем время на партию в часах и выгрузим полученные значения в файл 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. Это значительно упрощает работу с большими объемами данных и снижает вероятность ошибок.


ссылка на оригинал статьи https://habr.com/ru/articles/821745/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *