Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет для Буйного(пример).doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
388 Кб
Скачать
☆

3. Граф динамической модели

4. Тексты программы «Динамического анализа станка 16к20»

agregat_obj.py – Модуль, создающий файлы gif с графиками

# -*- coding: utf-8 -*-

from Tkinter import *

import math

import sys

from StringIO import StringIO

from PIL import Image,ImageDraw,ImageFont

from math import *

#=================================================

def mashtab1(mx,mmy,x,y,by=0.0):

max_x,min_x=max(mx),min(mx)

dx=(max_x-min_x)/x

if by==0:

max_y,min_y=None,None

for my in mmy:

max_ay,min_ay=max(my),min(my)

if max_y==None or max_y<max_ay: max_y=max_ay

if min_y==None or min_y>min_ay: min_y=min_ay

dy=(max_y-min_y)/y

mmi=[]

for my in mmy:

mi=[]

if by:

max_y,min_y=max(my),min(my)

dy=(max_y-min_y)/y*by

for i in range(len(mx)):

ix,iy=int((mx[i]-min_x)/dx),y-int((my[i]-min_y)/dy)

if ix<1: ix=1

if iy<1: iy=1

if ix>x-1: ix=x-1

if iy>y-1: iy=y-1

kort=(ix,iy)

mi.append(kort)

mmi+=[mi]

return mmi,max_x,min_x,max_y,min_y

def desine(name,a=400,b=300,rgb=(255,255,255),fil=[(0,0,0)],lt=[],lx=[],by=0,mes='proba',dix=50,diy=50):

fill=(0,0,0)

ab=[(1,1),(a-1,1),(a-1,b-1),(1,b-1),(1,1)]

imp = Image.new('RGB',(a,b),rgb)

draw = ImageDraw.Draw(imp, mode='RGB')

x,y,ix,iy=a,b,0,0

if x and y:

mi,max_x,min_x,max_y,min_y=mashtab1(lt,lx,x,y,by)

l=len(lx)

dl=255/l

(r,g,bl)=fill

k=0

kl=len(fil)-1

for i in mi:

draw.line(i,fil[k])

if k<kl:

k+=1

else:

k=0

if mes:

s='%8.5f;%8.5f' % (max_y,min_y)

draw.text((10,5),mes+s, fill=(1,100,250))

draw.line(ab,fill)

while iy<y:

iy+=diy

draw.line([(1,iy),(x,iy)],fill)

while ix<x:

ix+=dix

draw.line([(ix,1),(ix,y)],fill)

imp.save(name,'gif')

object_lib.py – описаны все объекты: объект движения (М) объект двигателя (Д)

объект упругого взаимодействия класс (С)

class M:

def __init__(self,m=0.0):

self.m,self.x,self.f,self.l=m,[0.0,0.0,0.0],0.0,[[0.0],[0.0],[0.0]]

def step(self,dt):

if self.m == 0.0:

self.x=[0.0,0.0,0.0]

return

else:

self.x[2]=self.f/self.m

self.x[0]+=0.5*self.x[1]*dt

self.x[1]+=self.x[2]*dt

self.x[0]+=0.5*self.x[1]*dt

def add(self):

for i in xrange(3):

self.l[i]+=[self.x[i]]

Uo, Lpr, Rpr = 1.0, 0.01, 0.01

class D:

def __init__(self):

"""Ke:=1;Tg:=0.05;Upr:=0;Upr=0.0;w=0.0;Ke=1.0;Tg=0.05;x=0.0;y=0.0"""

self.Upr=0.0

self.w=0.0

self.Ke=1.0

self.Tg=0.05

self.x=0.0

self.y=0.0

def step(self,dt):

self.y=((self.Upr-self.Ke*self.w)-self.x)/self.Tg;

self.x+=self.y*dt

class C:

def __init__(self,c=0.0, r=0.0):

self.c, self.r=c, r

def F(self,ds,dv):

return self.c*ds+self.r*dv

agregat_p.py – главный модуль программы, в котором производятся расчеты

from objects_lib import* – импорт данных из файла objects_lib

from agregat_obj import * -импорт данных из файла agregat_obj

затем расчет силы резания

#1 определяются параметры модели Д - основной двигатель Дс - двигатель подачи

затем ротор, коробка, шпиндель, стойка-корпус.

Мх, Му, Мз - описывают упругие колебания суппорта, приведенные к кромке резца

Срк..... жесткости узлов, Сх, Су, -жесткости крепления резца

Т-время,

дТ - шаг интегрирования

Ткон - конечное время

R-требуем радиус детали

Тно - глубина резания

#2 интегрирование на шаге

Фр - сила резания

d.w =Jr.x[1]/150.0 - отправляется в объект двигателя, 150 = 1500 оборотов

Jr.f =d.x*1500.0 - момент на валу ротора, который появляется при подаче электроэнергии

#3 вывод графика

desine(name1,400,400,white,[red,blue,green,black,green],lt,[Jr.l[1],Jr.l[2],lf,Js.l[2],mx.l[0]],1,'')

name1 - файл куда писать

400,400 - размеры окна

white - цвет подложки фон

red, blue, green, black .... – цвета линий графика

lt - массив значений времени

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

Js.l[2] -момент на влу двигат

mx.l[0] -колебания кромки резца по х

1 - признак того, что все графики в одном масшт.

«» - надпись на графике

desine(name2,400,400,white,[blue],Jr.l[2],[Jr.l[1]],0,'') - динамич. характеристика двигателя

#4 операторы вывода на экран

# -*- coding: utf-8 -*-

from Tkinter import *

import math

import sys

from objects_lib import *

from agregat_obj import *

def rez(v=0.0,t=0.0, s=0.0):

"""Сила резания при точении"""

x, y, n, Kp, Cp = 1.0, 1.0, 1.0, 1.0, 0.01

rez = 0.0

s=0.1

t=5.0

if v>0.0 and t>0.0 and s>0.0:

rez=-10.0*Cp*pow(t,x)*pow(s,y)*pow(v,n)*Kp*1.0

return rez

# 1 =================================================

d,ds=D(),D()

Jr,Jk,Js=M(0.50),M(0.30),M(0.10)

stoyka=M(0.0)

mx,my,mz=M(100.0),M(100.0),M(100.0)

ms=M(100.0)

crk,cks=C(4000.0, 1.7),C(5000.0, 1.7)

cx,cy,cz=C(5000.0, 500.7),C(5000.0, 500.7),C(2000.0, 10.7)

J=[Jr,Jk,Js,mx,my,mz,ms]

c=[crk,cks,cx,cy,cz]

l = [(crk,Jr,Jk),(cks,Jk,Js),(cx,stoyka,mx),(cy,stoyka,my),(cz,ms,mz)] #graf

t, dt, tkon, Fr = 0.0, 0.0001, 3.2, 0.0

R,tho=0.05,2.0

lt, lf =[t], [Fr] #lines

kout=15

kkout=kout

# 2 =================================================

while t<tkon:

for i in J: i.f=0.0

d.Upr=Uo-d.x*Rpr-d.y*Lpr

d.w =Jr.x[1]/150.0

Jr.f =d.x*1500.0

ds.Upr=Uo-ds.x*Rpr-ds.y*Lpr

ds.w =ms.x[1]/0.10

ms.f =ds.x*10.0

dx=mx.x[0]-stoyka.x[0]

dy=my.x[0]-stoyka.x[0]

Ro=pow(dy*dy+(dx+R)*(dx+R),0.5)

dR=Ro-R

th=tho-dR*1000.0

Fr=rez(Js.x[1]*Ro, th, mz.x[0])

Fy=Fr*(R+dx)/Ro

Fx=Fr*dy/Ro

Fz=Fr*0.01

mx.f+=Fx

my.f+=Fy

mz.f+=Fz

Js.f+=Fr*Ro

d.step(dt)

ds.step(dt)

for (c, m1, m2) in l:

f=c.F(m1.x[0]-m2.x[0], m1.x[1]-m2.x[1])

m2.f+=f

m1.f-=f

for i in J: i.step(dt)

if kout>=kkout:

for i in J: i.add()

lt +=[t]

lf +=[Fr]

kout=1

kout+=1

t+=dt

# 3 =================================================

white,black,blue,red,green=(255,255,255),(0,0,0),(2,5,200),(200,5,2),(2,200,2)

name1,name2="dvig1.gif","dvig2.gif"

desine(name1,400,400,white,[red,blue,green,black,green],lt,[Jr.l[1],Jr.l[2],lf,Js.l[2],mx.l[0]],1,'')

desine(name2,400,400,white,[blue],Jr.l[2],[Jr.l[1]],0,'')

# 4 =================================================

A,B=800,500

tk = Tk()

tk.title("Токарный станок")

f = Frame(tk)

f.pack()

c = Canvas(f, bg="White", width=A, height=B)

c.pack(expand=1, fill=BOTH)

img1, img2 = PhotoImage(file=name1), PhotoImage(file=name2)

c.create_image(1, 1, image=img1, anchor=NW)

c.create_image(401,1, image=img2, anchor=NW)

s1='Скорость: от %10.2f до %10.2f об/мин' % (0.0,max(Jr.l[1]))

s2='Момент: от %10.2f до %10.2f Нм' % (min(Jr.l[2]),max(Jr.l[2]))

s3='Время: от %10.2f до %10.2f с' % (0.0,tkon)

s4='Сила резания: от %10.5f до %10.5f Н' % (0.0,max(lf))

c.create_text(150, B-90, text=s1, fill="red")

c.create_text(150, B-75, text=s2, fill="blue")

c.create_text(150, B-60, text=s3, fill="black")

c.create_text(150, B-40, text=s4, fill="black")

widget = Label(c, text='Модель', fg='black', bg='white')

widget.pack()

c.create_window(25, B-10, window=widget)

tk.mainloop(1)