首先说说结论:在不和SEW官方取得沟通之前,你几乎无法直接通过查阅SEW官方文档得到相关减速机的所有技术参数:比如轴的模数和齿数,轴承的参数。我在周一耗费了一个上午,最终和SEW方面确认后才知晓相关技术参数需要凭借销售合同查询。不过,也把我做的搜集和尝试列在后面。
前面的参数查询里,漏掉了一种减速机,就是行星齿轮减速机。这个产品的故障频点需要另行分析。
1.一个失败的尝试
案例一 Gear reducer 32.38:1 ST77DT100L4-KS 二手价 290刀
这个减速机是在bing.com上搜索"SEW gearbox ratio 35.5 tag",随机找到一个铭牌:
注意sn = 890036862.08.07.001
1.1 SEW资料库的资料全集:
首先在SEW资料库里找到,因为有序列号。
https://www.sew-eurodrive.cn/os/dud/?tab=productdata&country=CN&language=zh_cn1
1.1.1 产品参数:
从产品参数页面可以知道:
- 变速比32.38
- 460V/60Hz的电压是美标电机
Catalog designation | ST77DT100L4-KS |
Product data | |
Serial number | 890036862.08.07.001 |
Gear ratio | 32.38 |
Output speed | 52 |
Mounting position | M4B |
Shaft diameter | NP-NS |
Terminal box position | 0 |
Cable entry at terminal box | X |
Output torque (lb-in) | 5375 |
Service factor | 1.7 |
Motor power | 5 |
Motor voltage | 230YY/460Y |
Frequency | 60 |
Wiring diagram | DT79 |
Rated current | 13.6/6.8 |
KVA Code | G |
Thermal class | F |
Other | CB@0, CE X, Bore Size=1 5/8 |
Weight | on request |
2.原始资料搜集和故障频点计算.py程序(片段)
频点计算部分可以自动进行。我现在的做法是使用.json搜集相关信息,然后使用python自动计算,请参见附录A,附录B.
最终我们需要计算出相关的故障频点有多少,分别隶属于哪根轴,哪个齿轮,那个轴承。在故障发生后,还需要反向查询这个故障频点表,来搜索出可能出问题的故障源。这个过程,无需人工参与,是可以自动计算的。
附录A 机械设备相关振动配置信息搜集(.json)
仅仅是一个示例
{
"author": "fengxh",
"desc": "产品的一级参数录入,注意不要混入任何可以自动计算的结果",
"json_format": "1.0",
"created": "Apr16,2024",
"last_modify": "Apr16,2024",
"CAD_file": "xxxxx.pdf",
"unit": {
"engine": {
"type": "xxxx",
"manualfacture": "xxxx",
"PinKw": 30,
"type_rpm": 730
},
"gearbox": {
"type": "xxxxx",
"ratio": 75.577,
"shaft_in": {
"desc": "变速箱输入轴",
"memo": "输入轴 - 一个外齿轮,一个输入大齿轮,一个输出小齿轮,2个轴承",
"gear": [
{
"type": -1,
"memo": "外齿轮",
"module": -1,
"tooth": -1
},
{
"type": -1,
"memo": "输入大齿轮",
"module": -1,
"tooth": -1
},
{
"type": -1,
"memo": "输出小齿轮",
"module": -1,
"tooth": -1
}
],
"bearing": [
{
"type": -1,
"memo": "动力端轴承",
"outer_edge_D_in_mm": -1,
"inter_edge_D_in_mm": -1,
"ball_D_in_mm": -1,
"ball_cnts": -1
},
{
"type": -1,
"memo": "随动轴承",
"outer_edge_D_in_mm": -1,
"inter_edge_D_in_mm": -1,
"ball_D_in_mm": -1,
"ball_cnts": -1
}
]
},
"shaft_inter": [
{
"sn": 1,
"desc": "变速箱二级输入轴",
"memo": "中间轴 - 一个输入大齿轮,一个输出小齿轮,2个轴承",
"gear": [
{
"type": -1,
"memo": "输入大齿轮",
"module": -1,
"tooth": -1
},
{
"type": -1,
"memo": "输出小齿轮",
"module": -1,
"tooth": -1
}
],
"bearing": [
{
"type": -1,
"memo": "动力端轴承",
"outer_edge_D_in_mm": -1,
"inter_edge_D_in_mm": -1,
"ball_D_in_mm": -1,
"ball_cnts": -1
},
{
"type": -1,
"memo": "随动轴承",
"outer_edge_D_in_mm": -1,
"inter_edge_D_in_mm": -1,
"ball_D_in_mm": -1,
"ball_cnts": -1
}
]
},
{
"sn": 2,
"desc": "变速箱三级输入轴",
"memo": "中间轴 - 一个输入大齿轮,一个输出小齿轮,2个轴承",
"gear": [
{
"type": -1,
"memo": "输入大齿轮",
"module": -1,
"tooth": -1
},
{
"type": -1,
"memo": "输出小齿轮",
"module": -1,
"tooth": -1
}
],
"bearing": [
{
"type": -1,
"memo": "动力端轴承",
"outer_edge_D_in_mm": -1,
"inter_edge_D_in_mm": -1,
"ball_D_in_mm": -1,
"ball_cnts": -1
},
{
"type": -1,
"memo": "随动轴承",
"outer_edge_D_in_mm": -1,
"inter_edge_D_in_mm": -1,
"ball_D_in_mm": -1,
"ball_cnts": -1
}
]
}
],
"shaft_out": {
"desc": "变速箱输出轴",
"memo": "输出轴 - 一个输入齿轮,2个轴承",
"gear": [
{
"type": -1,
"memo": "输入大齿轮",
"module": -1,
"tooth": -1
}
],
"bearing": [
{
"type": -1,
"memo": "动力端轴承",
"outer_edge_D_in_mm": -1,
"inter_edge_D_in_mm": -1,
"ball_D_in_mm": -1,
"ball_cnts": -1
},
{
"type": -1,
"memo": "随动轴承",
"outer_edge_D_in_mm": -1,
"inter_edge_D_in_mm": -1,
"ball_D_in_mm": -1,
"ball_cnts": -1
}
]
}
},
"final_output": {
"name": "齿轮齿条摇架",
"gear": [
{
"type": -1,
"memo": "输入外齿轮",
"module": 20,
"module_scale": "mm",
"tooth": 16
},
{
"type": -1,
"memo": "齿条",
"module": 20,
"module_scale": "mm",
"length": 4631
}
]
},
"smooth_oil": {
"desc": "润滑液",
"std_tempeature": -1,
"deadline_tempeature": -1
}
}
}
附录B 故障频点自动解析程序(.py)
并不完整,仅显示部分逻辑。可以逆推处理的方法。
''''
''''
class GpGearDesc:
def __init__(self, module, tooth, ratioOfShaft):
self.module = module
self.tooth = tooth
self.ratioOfShaft = ratioOfShaft
self.ratioOfGear = ratioOfShaft*tooth
def __hash__(self):
# 返回一个哈希值,通常可以使用内置类型的哈希值,比如元组
return hash((self.module, self.tooth))
def __eq__(self, other):
# 定义相等性判断逻辑
return isinstance(other, GpGearDesc) and (self.module == other.module) and (self.tooth == other.tooth)
def __str__(self):
return str("gear.errFreq:%8.3f, with(shaftRatio=%8.3f, module=%8.3f, tooth=%8.3f" (self.ratioOfGear, self.ratioOfShaft, self.module, self.tooth))
def __repr__(self):
return f"GpGearDesc('moudle = {self.module}', tooth = {self.tooth})"
''''
''''
def getVibrationSensorList_v1(filename):
# 读取JSON文件
sensor_data={}
with open(filename, 'r', encoding='utf-8') as file:
sensor_data = json.load(file)
# 初始化温振型传感器数量
total_temperature_vibration_sensors = 0
# 遍历每个单元
sensor_location = []
for unit in sensor_data["sensors"]:
# 获取当前单元的温振型传感器数量
unit_temperature_vibration_sensors = sum(unit["sensors"]["温振型"].values())
locations = unit["sensors"]["温振型"].keys();
cntOfLocation = unit["sensors"]["温振型"].values();
for loc in unit["sensors"]["温振型"]:
for j in np.arange(unit["sensors"]["温振型"][loc]):
sensor_location.append(unit["unit"] + "\\" + loc + "\\" + str("%02d" %j))
# 将当前单元的数量添加到总数中
total_temperature_vibration_sensors += unit_temperature_vibration_sensors
# 打印总数
print("总温振型传感器数量:", total_temperature_vibration_sensors)
print(sensor_location)
return sensor_location
def doGearsOfShaft(gearsArray, shaftRpm, shaftName, arGear, last_gear_tooth):
gearIdx = 1
for gear in gearsArray:
gearName = str(shaftName+"\\gear\\%d" %gearIdx)
gearRpmRatio = shaftRpm;
gearTooth = gear["tooth"]
gearModule = gear["module"]
arGear |= {gearName: GpGearDesc(gearModule, gearTooth, gearRpmRatio)}
gearIdx=gearIdx+1
last_gear_tooth = gearTooth
return last_gear_tooth
def doBearingsOfShaft(bearingArray, shaftRpm, shaftName, arBearing):
bearingIdx = 1
for bearing in bearingArray:
bearingName = str(shaftName +"bearing\\%d" %bearingIdx)
outer_edge_D_in_mm = bearing["outer_edge_D_in_mm"]
inner_edge_D_in_mm = bearing["inter_edge_D_in_mm"]
ball_D_in_mm = bearing["ball_D_in_mm"]
ball_cnts = bearing["ball_cnts"]
arBearing |= {"bearingName": GpBearingDesc(outer_edge_D_in_mm*1e-3, inner_edge_D_in_mm*1e-3, ball_D_in_mm*1e-3, ball_cnts, shaftRpm)}
bearingIdx += 1
def getVibrationUnitsOf(arJsonFiles):
ret=[]
# 遍历每个单元
arShaft = {}
arGear = {}
arBearing = {}
for filename in arJsonFiles:
# 读取JSON文件
sensor_data={}
with open(filename, 'r', encoding='utf-8') as file:
sensor_data = json.load(file)
# 初始化温振型传感器数量
total_vibration_units = 0
last_gear_tooth = -1
for unit in sensor_data["unit"]:
if "gearbox" == unit:
shaftRpm = 1.0;
if("shaft_in" in sensor_data["unit"]["gearbox"].keys()):
si = sensor_data["unit"]["gearbox"]["shaft_in"]
shaftName = filename + "\\gearbox\\shaft_in";
shaftRpm = shaftRpm*si["gear"][0]["tooth"]/si["gear"][1]["tooth"]
arShaft |= {shaftName:shaftRpm}
last_gear_tooth = doGearsOfShaft(si["gear"], shaftRpm, shaftName, arGear, last_gear_tooth)
doBearingsOfShaft(si["bearing"], shaftRpm, shaftName, arBearing)
if("shaft_inter"):
rpmUpdated = False;
for si in sensor_data["unit"]["gearbox"]["shaft_inter"]:
if not (rpmUpdated):
shaftRpm = shaftRpm*si["gear"][0]["tooth"]/last_gear_tooth
rpmUpdated = True
shaftName = filename + "\\gearbox\\shaft_inter";
arShaft |= {shaftName:shaftRpm}
last_gear_tooth = doGearsOfShaft(si["gear"], shaftRpm, shaftName, arGear, last_gear_tooth)
doBearingsOfShaft(si["bearing"], shaftRpm, shaftName, arBearing)
if("shaft_out" in sensor_data["unit"]["gearbox"].keys()):
si = sensor_data["unit"]["gearbox"]["shaft_out"]
shaftRpm = shaftRpm*si["gear"][0]["tooth"]/last_gear_tooth
shaftName = filename + "\\gearbox\\shaft_out";
arShaft |= {shaftName: shaftRpm}
last_gear_tooth = doGearsOfShaft(si["gear"], shaftRpm, shaftName, arGear, last_gear_tooth)
doBearingsOfShaft(si["bearing"], shaftRpm, shaftName, arBearing)
# 打印总数
#
return (arShaft, arGear, arBearing)