在集成电路板等电子产品生产中,需要将安装有各种电子元件的印刷电路板放置在回焊炉中,通过加热,将电子元件自动焊接到电路板上。在这个生产过程中,让回焊炉的各部分保持工艺要求的温度,对产品质量至关重要。目前,这方面的许多工作是通过实验测试来进行控制和调整的。本题旨在通过机理模型来进行分析研究。
回焊炉内部设置若干个小温区,它们从功能上可分成4个大温区:预热区、恒温区、回流区、冷却区(如图1所示)。电路板两侧搭在传送带上匀速进入炉内进行加热焊接。
某回焊炉内有11个小温区及炉前区域和炉后区域(如图1),每个小温区长度为30.5 cm,相邻小温区之间有5 cm的间隙,炉前区域和炉后区域长度均为25 cm。
回焊炉启动后,炉内空气温度会在短时间内达到稳定,此后,回焊炉方可进行焊接工作。炉前区域、炉后区域以及小温区之间的间隙不做特殊的温度控制,其温度与相邻温区的温度有关,各温区边界附近的温度也可能受到相邻温区温度的影响。另外,生产车间的温度保持在25ºC。
在设定各温区的温度和传送带的过炉速度后,可以通过温度传感器测试某些位置上焊接区域中心的温度,称之为炉温曲线(即焊接区域中心温度曲线)。附件是某次实验中炉温曲线的数据,各温区设定的温度分别为175ºC(小温区15)、195ºC(小温区6)、235ºC(小温区7)、255ºC(小温区89)及25ºC(小温区10~11);传送带的过炉速度为70 cm/min;焊接区域的厚度为0.15 mm。温度传感器在焊接区域中心的温度达到30ºC时开始工作,电路板进入回焊炉开始计时。
实际生产时可以通过调节各温区的设定温度和传送带的过炉速度来控制产品质量。在上述实验设定温度的基础上,各小温区设定温度可以进行±10ºC范围内的调整。调整时要求小温区1至5中的温度保持一致,小温区8至9中的温度保持一致,小温区10至11中的温度保持25ºC。传送带的过炉速度调节范围为65~100 cm/min。
在回焊炉电路板焊接生产中,炉温曲线应满足一定的要求,称为制程界限(见表1)。
请你们团队回答下列问题:
问题1 请对焊接区域的温度变化规律建立数学模型。假设传送带过炉速度为78 cm/min,各温区温度的设定值分别为173ºC(小温区1~5)、198ºC(小温区6)、230ºC(小温区7)和257ºC(小温区8至9),请给出焊接区域中心的温度变化情况,列出小温区3、6、7中点及小温区8结束处焊接区域中心的温度,画出相应的炉温曲线,并将每隔0.5 s焊接区域中心的温度存放在提供的result.csv中。
问题2 假设各温区温度的设定值分别为182ºC(小温区1~5)、203ºC(小温区6)、237ºC(小温区7)、254ºC(小温区8至9),请确定允许的最大传送带过炉速度。
问题3 在焊接过程中,焊接区域中心的温度超过217ºC的时间不宜过长,峰值温度也不宜过高。理想的炉温曲线应使超过217ºC到峰值温度所覆盖的面积(图2中阴影部分)最小。请确定在此要求下的最优炉温曲线,以及各温区的设定温度和传送带的过炉速度,并给出相应的面积。
问题4 在焊接过程中,除满足制程界限外,还希望以峰值温度为中心线的两侧超过217ºC的炉温曲线应尽量对称(参见图2)。请结合问题3,进一步给出最优炉温曲线,以及各温区设定的温度及传送带过炉速度,并给出相应的指标值。
本文针对不同炉温条件, 传送带速度及优化目标下的炉温曲线优化问题进行了探讨.
对于问题一, 解决问题的具体思路如下: 首先, 研究整个回焊炉内水平方向温度的变化趋势, 得到空气温度变化模型; 其次, 对电路板建立热传导模型; 再次, 以实际炉温曲线数据为参照, 采用有限差分法和最小二乘法, 并结合稳定性条件对电路板热传导模型的未知参数进行确定, 并对空气温度变化模型进行修正; 最后, 求解电路板热传导模型, 求得相应的炉温曲线和特定点温度值. 计算所得结果如下所示:
对于问题二, 解决问题的具体思路如下: 首先, 更新水平方向温度变化函数; 其次,将制程界限转化为约束条件, 建立最大速度求解模型; 最后, 采用自创的分步遍历算法,结合问题一中所得电路板热传导模型, 对传送带最大速度进行求解, 最终求得最大速度为:73.43cm/min.
对于问题三, 解决问题的具体思路如下: 首先, 采用梯形分割求和法求得炉温曲线特定面积与未知决策参量的关系; 其次, 以该面积最小为优化目标, 制程界限为约束条件建立单目标非线性优化模型, 采用多起点全局搜索算法对各温区的设定温度和传送带的过炉速度进行求解; 最后, 利用求得的决策参量计算出所求面积. 计算所得结果如下所示:
对于问题四, 解决问题的具体思路如下: 首先, 考虑将炉温曲线的峰值温度右半部分曲线向左对称化; 其次, 求解原炉温曲线与对称曲线的温度差平方和, 将对称问题转化为求解温度差平方和最小值的问题; 最后, 以指定覆盖面积最小, 温度差平方和最小为目标函数,制程界限为约束条件, 建立双目标非线性规划模型. 对该模型进行求解, 得到最优炉温曲线, 各温区设定温度和传送带过炉速度. 计算所得结果如下所示:
1. 生产车间的温度保持在 25ºC.
2. 假设回焊炉无热量损耗.
3. 假设炉内空气温度会在短时间内达到稳定.
4. 假设焊接过程中传送带不震动, 即电路板平稳匀速运行.
5. 假设回焊炉内空气在垂直于传送带方向上无温度差异.
6. 假设炉内空气温度不受电路板热辐射的影响.
7. 假设电路板材质单一, 传热均匀.
问题一:根据温度变化规律建立数学模型,目前,有关焊接区域的温度变化规律的研究大多是基于数据驱动的控制和调整,文献[2-3]是基于 PID 控制原理控制回焊炉中的温度,而缺乏相关机理模型,不利于了解到电路板在回焊炉内焊接的物理过程。所以本题难点在于需要建立机理模型,模型不仅要能够反映出电路板焊接的物理过程,同时又要与题目中所给的焊接区域温度变化曲线吻合。针对此问题,拟在热传导方程以及牛顿冷却定律的基础上建立数学模型。
问题二:在第一问已求得参数的基础上,又给定了各温区温度,要求确定电路板炉温曲线满足题目所要求的制程界限时电路板的最大过炉速度。本题可用先通过二分法求得最大速度大致区间,再在大致区间中遍历搜索,最后得到最大传输速度。
问题三:确定各温区的设定温度和传送带的过炉速度,使得理想的炉温曲线超过217℃到峰值所覆盖的面积最小。本题难点在于变量个数增多,解空间变大。但可通启发式算法进行求解。
问题四:在问题三的基础上,确定各温区的温度以及传送带过炉速度,使得以峰值温度为中心线的两侧超过 217℃的炉温曲线应尽量对称,同时还要使得理想的炉温曲线超过到峰值所覆盖的面积最小。本题难点在于如何给定对称性指标,且该问题属于多目标优化问题,可通过动态综合加权法,将多目标函数转化为单目标函数。
function result = F(t,v,T1,T2,T3,T4)
% 计算当前环境温度
%v:移动速度;Ti:第i 个不同温区的温度;
t1 = 25/v;%炉前区域
t2 =t1+(30.5*5+5*4)/v;%小温区1-5
t3 =t3+(30.5+5)/v;%小温区6
t4 =t3+(30.5+5)/v;%小温区7
t5 =t4+(5*2+30.5*2)/v;%小温区8-9
if(t<=t1-(T1-25)/20)
T=25;
elseif (t>t1-(T1-25)/20 && t<=t1)
T=175-(t1-t)/(T1-25)*20*150;
elseif (t>t1 && t<=t2)
T=T1;
elseif (t>t2 && t<=t2+5/v)
T=(t-t2)*v/5*(T2- T1)+T1;
elseif(t>t2+5/v && t<=t3)
T=T2;
elseif (t>t3 && t<=t3+5/v)
T =(t-t3)*v/5*(T3-T2)+T2;
elseif (t>t3+5/v && t<=t4)
T= T3;
elseif(t>t4+5/v && t<=t4+5/v)
T=(t-t4)*v/5*(T4-T3)+ T3;
elseif (t>t4 +5/v && t<=t5)
T= T4;
elseif(t>t5 && t<=t5+20/v)
T=(t-t5)*v/20*(25-T4)+ T4;
else
T= 25;
end
result = T;
end
function [result] =T(RC1,RC2,v,T1,T2,T3,T4,h)
deltat=0.01;
len1=floor(339.5/v/deltat);
len0=floor(235.5/v/deltat);
len=floor(435.5/v/deltat);
tn=linspace(0,0,len);
for i=1:len
tn(i)=i*deltat;
end
T=linspace(25,25,len);
for i=2:len0
T(i)=T(i-1)+(F(tn(i),v,T1,T2,T3,T4)-T(i-1))*(1-exp(-deltat/RC1));
end
for i=len0+1:len1
T(i)=T(i-1)+(F(tn(i),v,T1,T2,T3,T4)-T(i-1))*(1-exp(-deltat/RC2));
end
for i=len1+1:len
T(i)=T(i-1)+(F(tn(i),v,T1,T2,T3,T4)-T(i-1))*h*deltat;
end
result=T;
%第一问主函数
clear
clc
[Ts]=xlsread('D:\附件。xlsx',1,'B2:B710');
sum1=0;
sum2=0;
min1=inf;
best1=0;
best2=0;
min2=inf;
best3=0;
deltat=0.01;
v=7/6;
len0=floor(235.5/v/deltat);
len1=floor(339.5/v/deltat);
len=floor(435.5/v/deltat);
tn=linspace(0,0,len);
for i=1:len
tn(i)=i*deltat;
end
for j=1:1000
temp=T(0.1*j,50,7/6,175,195,235,255,0.005);
for i=1:len0
if (tn(i)>=19 && mod(i,50)==0)
sum1=sum1+(temp(i)-Ts((i-1850)/50))^2;
end
end
if(sum1<min1)
min1=sum1;
best1=0.1*j;
end
sum1=0;
end
min=inf;
for j=1:1000
temp = T(best1,0.1*j,7/6,175,195,235,255,0.005);
for i=len0+1:len1
if(mod(i,50)==0)
sum1=sum1+(temp(i)-Ts((i-1850)/50))^2;
end
end
if(sum1<min)
min=sum1;
best2=0.1*j;
end
sum1=0;
end
for j=1:1000
temp =T(best1,best2,7/6,175,195,235,255,2e-3+5e-6*j);
for i=len1+1:len
if(mod(i,50)==0)
sum2=sum2+(temp(i)-Ts((i-2100)/50))^2;
end
end
if(sum2<min)
min2=sum2;
best2=0.1*j;
end
sum2=0;
end
v=78/60;
len=floor(435.5/v/deltat);
tn=linspace(0,0,len);
for i=1:len
tn(i)=i*deltat;
end
result =T(best1,best2,v,173,198,230,257,best3);
plot(tn,result);
%问题二
function result =check(deltat,v,T)
%判断是否符合制程条件
len2=floor(435.5/v/deltat);
len3=floor(339.5/v/deltat);
result=1;
cnt1=0;
cnt2=0;
cnt3=0;
cnt4=0;
for i=2:len3
grad=(T(i)-T(i-1))/deltat;
if(grad<0 || grad>3)
result = 0;
end
if(T(i)>=150 && T(i-1)<150)
cnt1=i;
end
if(T(i)>=180 && T(i-1)<180)
cnt2=i;
end
if(T(i)>=217 && T(i-1)<217)
cnt3=i;
end
end
%判断在150°~190°C的时间是否符合
if(deltat*(cnt2-cnt1)<60||deltat*(cnt2-cnt1)>120)
result =0;
end
%判断在217°C的时间是否符合
if(deltat*(cnt4-cnt3)<40||deltat*(cnt4-cnt3)>90)
result =0;
end
if(T(len3)<240||T(len3)>250)
result =0;
end
end
%第二问主函数
clear
clc
best=65;
%第一次搜索,步长1;
for i=1:100
v=i;
result=T(57.4,43.7,v/60,182,203,237,254,0.00678);
if(check(0.01,v/60,result)==1)
best=v;
end
end
%第二次搜索,步长0.01;
for i=1:200
v=best-1+0.01*i;
result =T(57.4,43.7,v/60,182,203,237,254,0.00678);
if(checck(0.01,v/60,result)==1)
best=v;
end
end
function [Bestv,BeatT1,BeatT2,BeatT3,BeatT4,trace,T_m]=SAA()
%模拟退火算法
vmax=100;
vmin=65;
T1max=185;
T1min=165;
T2max=205;
T2min=185;
T3max=245;
T3min=225;
T4max=265;
T4min=225;
L=100;
K=0.098;
S=0.08;
T_m=100;
Yz=1E-6;
P=0;
trace=linspace(0,0,20000);
f=1;
while(f==1)
Prev=rand*(vmax-vmin)+vmin;
PreT1=rand*(T1max-T1min)+T1min;
PreT2=rand*(T2max-T2min)+T2min;
PreT3=rand*(T3max-T3min)+T3min;
PreT4=rand*(T4max-T4min)+T4min;
temp=T(57.4,43.7,Prev/60,PreT1,PreT2,PreT3,PreT4,0.00678);
if(check(0.01,Prev/60,temp)==1)
Prebestv=Prev;
PrebestT1=PreT1;
PrebestT2=PreT2;
PrebestT3=PreT3;
PrebestT4=PreT4;
f=0;
end
end
f=1;
while(f==1)
Prev=rand*(vmax-vmin)+vmin;
PreT1=rand*(T1max-T1min)+T1min;
PreT2=rand*(T2max-T2min)+T2min;
PreT3=rand*(T3max-T3min)+T3min;
PreT4=rand*(T4max-T4min)+T4min;
temp=T(57.4,43.7,Prev/60,PreT1,PreT2,PreT3,PreT4,0.00678);
if(check(0.01,Prev/60,temp)==1)
Prebestv=Prev;
PrebestT1=PreT1;
PrebestT2=PreT2;
PrebestT3=PreT3;
PrebestT4=PreT4;
f=0;
end
end
data=abs(func(Beatv,BestT1,BestT3,BestT3,BestT4)-func(Prebestv,PrebestT1,PrebestT2,PrebestT3,PrebestT4,));
while(data>Yz) && (T_m>0.001)&&(P<20000)
T_m=K*T_m;
for i=1:L
p=0;
while p==0
Nextv=rand*(vmax-vmin)+vmin;
NextT1=rand*(T1max-T1min)+T1min;
NextT2=rand*(T2max-T2min)+T2min;
NextT3=rand*(T3max-T3min)+T3min;
NextT4=rand*(T4max-T4min)+T4min;
temp=T(57.4.43.7,NextT1,NextT2,NextT3,NextT4,0.00678);
m=check(0.01,Nextv/60,temp);
if(Nextv>=vmin && Nextv<vmax && NextT1>=Tmin && NextT1<=T1max && NextT2>=T2min && Next2<=T2max&& NextT3>=T3min && Next3<=T3max&& NextT4>=T4min && Next4<=T4max && m==1 )
p=1;
end
end
if(func(Bestv,BestT1,BestT2,BestT3,BestT4)>funx(Nextv,NextT1,NextT1,NextT2,NextT3,NextT4))
Prebestv=Bestv;
PrebestT1=BestT1;
PrebestT2=BestT2;
PrebestT3=BestT3;
PrebestT4=BestT4;
Bestv=Nextv;
BestT1=NextT1;
BestT2=NextT2;
BestT3=NextT3;
BestT4=NextT4;
end
if(func(Prev,PreT1,PreT2,PreT3,PreT4)>funx(Nextv,NextT1,NextT1,NextT2,NextT3,NextT4))
Prev=Nextv;
PreT1=BestT1;
PreT2=BestT2;
PreT3=BestT3;
PreT4=BestT4;
P=P+1;
else
change=-(func(Prev,PreT1,PreT2,PreT3,PreT4)-funx(Nextv,NextT1,NextT1,NextT2,NextT3,NextT4))/T_m;
p1=exp(change);
if(p1>rand)
Prev=Nextv;
PreT1=NextT1;
PreT2=NextT2;
PreT3=NextT3;
PreT4=NextT4;
P=P+1;
end
end
traces(p)=func(Bestv,BestT1,BestT2,BestT3,BestT4)
end
data=abs(func(Bestv,BestT1,BestT2,BestT3,BestT4)-func(Prebest1,Prebest2,Prebest3,Prebest4));
end
end
function result=func(v,T1,T2,T3,T4)
%计算面积
Tt=T(57.4,43.7,v/60,T1,T2,T3,T4,0.00678);
maxT=max(Tt);
len5=length(Tt);
cnt1=0;
cnt2=0;
sum=0;
for i=2:len5
if (Tt(i-1)<=217 && Tt(i)>217)
cnt1=i;
end
end
for i=2:len5
if (i>=cntq && i<=cnt2-1)
sum=sum+0.01*(Tt(i)-217);
end
end
result=sum;
end
%问题四
function result =func2(v,T1,T2,T3,T4)
%计算对称度
Tt=T(57.4,43.7,v/60,T1,T2,T3,T4,0.00678);
cnt1=0;
cnt2=0;
cnt3=0;
maxT=max(Tt);
len=length(Tt);
for i=2:len
if(Tt(i-1)<=217 && Tt(i)>217)
cnt=i;
end
if(Tt(i-1)>217 && Tt(i)<=217)
cnt3=i-1;
end
if(Tt(i) == maxT)
cnt2=i;
end
n=floor(((cnt-cnt1)+(cnt3-cnt2))/2);
sum=0;
for i=1:n
sum=sum+(Tt(cnt2-i)-Tt(cnt2+i))^2;
end
result=sum/n;
end
function result=func3(v,T1,T2,T3,T4)
%面积与对称度统一数量级赋权值
m1=func(v,T1,T2,T3,T4);
m2=func2(v,T1,T2,T3,T4);
result=0.1*m1+m2;
end
%第四问的主函数仅需将第三问之中SAA函数中的适应度函数fun改成func3即可运行。