数学建模社区-数学中国
标题:
智能RGV的动态调度策略
[打印本页]
作者:
杨利霞
时间:
2019-4-7 11:42
标题:
智能RGV的动态调度策略
问题B 智能RGV的动态调度策略
, i! _" l3 G$ F) [( [) k
- C& Y. ]& T1 {( K* H4 e0 z
图1是一个智能加工系统的示意图,由8台计算机数控机床(Computer Number Controller,CNC)、1辆轨道式自动引导车(Rail Guide Vehicle,RGV)、1条RGV直线轨道、1条上料传送带、1条下料传送带等附属设备组成。RGV是一种无人驾驶、能在固定轨道上自由运行的智能车。它根据指令能自动控制移动方向和距离,并自带一个机械手臂、两只机械手爪和物料清洗槽,能够完成上下料及清洗物料等作业任务(参见附件1)。
0 @7 F8 \) V; o% w) K# H
( w8 a, f$ p; Y) J; x0 c
, U; L5 B% I; F+ X: H
1 x H$ J" |, S0 O5 H
5 w5 A( Y& C- J, x
图1:智能加工系统示意图
+ z+ X6 q, e: E1 y7 ~* `" b
7 ]" g; {3 k4 q6 q
. P3 ~9 F! f0 E" G# C6 B( h4 }0 G
% {3 N/ I7 r. X" _4 b
针对下面的三种具体情况:
k2 ]5 _; r3 V: Y, j
B+ ]' O1 Q+ \4 U, c* l
(1)一道工序的物料加工作业情况,每台CNC安装同样的刀具,物料可以在任一台CNC上加工完成;
- Y' d6 y5 b- c% I- u8 A
4 X5 x" N0 q3 l$ K& Y
(2)两道工序的物料加工作业情况,每个物料的第一和第二道工序分别由两台不同的CNC依次加工完成;
( ` n e. [% @& [# {
* Z N& d, n. K( ~
(3)CNC在加工过程中可能发生故障(据统计:故障的发生概率约为1%)的情况,每次故障排除(人工处理,未完成的物料报废)时间介于10~20分钟之间,故障排除后即刻加入作业序列。要求分别考虑一道工序和两道工序的物料加工作业情况。
' L8 v4 r7 j( Z! k, \
# ?3 m F+ y8 I& E. Z
请你们团队完成下列两项任务:
' D' X8 f4 d4 l# c/ b
" I! s. R5 m/ j5 G
任务1:对一般问题进行研究,给出RGV动态调度模型和相应的求解算法;
; z0 @7 e( E6 q
) H+ @$ ^$ B5 n$ e
任务2:利用表1中系统作业参数的3组数据分别检验模型的实用性和算法的有效性,给出RGV的调度策略和系统的作业效率,并将具体的结果分别填入附件2的EXCEL表中。
! `% ^3 ^; T6 X* f
9 |& A6 z: z$ D+ s" g
表1:智能加工系统作业参数的3组数据表 时间单位:秒
1 I2 ]" N% m4 g+ p! D e- q
* ?6 W$ W/ @' a( o1 H6 j9 v4 q* ?
系统作业参数
( z* R, }* {. O/ Y0 ^
第1组
+ S F9 l' Q9 b# ~& b* i
第2组
1 X# f, r/ k" @& o1 H0 P
第3组
0 }# L4 k {9 ?5 m
RGV移动1个单位所需时间
7 p) T$ ]# m0 g
20
2 a7 }% @$ ^. `) X
23
7 h" V1 k* K8 J: R
18
7 R6 N! R6 l. t
RGV移动2个单位所需时间
$ G0 K! N2 s1 z
33
: S5 w. ]! d# W" Y7 h
41
! S8 p X8 f3 ]
32
. f) E C. e, f) V+ I6 t& Y) K4 ]. T
RGV移动3个单位所需时间
) T1 E( Q* p( w8 Q
46
9 z2 H4 x' V" `9 x% W8 r
59
( c& @; `! W' T# N5 u, q
46
, |7 H5 z% b( `7 x$ F$ }
CNC加工完成一个一道工序的物料所需时间
5 |" m- F2 f$ k9 M7 h8 B5 \/ a$ l
560
- N. M( B$ k1 ]# t6 ^
580
( @$ m' |+ r2 c* B' l
545
" R' S. ~9 D8 R% H" R, r( ^
CNC加工完成一个两道工序物料的第一道工序所需时间
& V1 G4 J+ f" q
400
! Y! o* B' \3 m+ t* P9 o! I1 N
280
6 A! l# Q" U1 t$ L) _- i6 p
455
% E: H$ W! L9 p2 p& ]' U0 U
CNC加工完成一个两道工序物料的第二道工序所需时间
3 `$ L/ v) S, a6 Z$ C
378
0 O3 y" S) p( a, B; |! U; |
500
9 f) I3 h! [: p
182
. l0 R% g' _) ~7 L8 _ M+ o0 M
RGV为CNC1#,3#,5#,7#一次上下料所需时间
) d& C4 Q$ J' r6 S: h( F e: H
28
3 y( m* y d* b- s7 |0 b, Y' I+ g
30
7 Y2 X( u8 _3 U8 i) o/ s- n0 N1 N$ W
27
* ?: y% W Q3 c0 T6 m L; s
RGV为CNC2#,4#,6#,8#一次上下料所需时间
: r6 x7 |9 O; I3 x" t
31
) |. E2 O$ \7 E$ A4 P/ G+ c2 Z
35
( K! P! N7 n0 T- L( B" P$ o
32
& b+ H) A+ W$ S4 T: s$ v
RGV完成一个物料的清洗作业所需时间
, T. \) e! Q, n: i( |
25
/ u8 P* D6 F8 j. ?2 N
30
/ l+ ~ M, a; `- v+ ~
25
9 g2 E+ E# U5 V
注:每班次连续作业8小时。
2 ?, P- n8 x, Z( C5 D
2 Y- Q, J* M0 V. i: T6 q
! k. s( t1 f# k3 k! T4 v9 S; F
/ q2 d, d) g. V
#include<stdio.h>
/ H' _% f) C" U: J, y
#include<math.h>
8 B5 i2 m0 W k/ e5 W( n% f
#include<stdlib.h>
: x& ~7 C! b$ \% Y) H8 k
int main(){
# f, L# |4 g/ X" p, [7 j
int M[4]={0,18,32,46};
2 ]/ z4 y$ j0 X* R! x# W6 E: O% r+ }
int T1=27; //CNC1,3,5,7一次上下料所需时间
( K' v. p" u) g6 v
int T2=32; //CNC2,4,6,8一次上下料所需时间
! j8 H- M# I2 M
int W11=545; //加工完成一个一道工序的物料所需时间
+ O+ P6 j4 w' n5 T x% [; ^, `
int C=25; //完成一个物料的清洗作业所需时间
5 e% }6 o8 b! ~, _9 o
int T=0;
4 d, |: C7 S9 d' C5 d, w7 f7 G
int RGV_X=0; //RGV在第一个位置
~, G. ^+ l$ S2 a5 @+ J d
int CNC_Flag[8]; //0表示没有在加工,1表示正在加工,2表示加工完成
, s8 q1 W8 |. M5 u) o' j/ i# f1 w( b
int CNC_WT[8]; //记录CNC已工作时间
6 K! s$ `9 Z* s
int CNC_X[4]; //CNC_X
=1表示GRV要去第i个位置
$ X5 O' \( ?& ~8 H
int i;
; p4 Y F' C5 H% g( z# X/ r; s7 R
int length=-1; //记录路径长度
; L, I# |+ `+ Y% o+ K
int min1=5; //记录最短路径
5 V: Q/ V# _/ I1 `
int min2=-1; //记录要去的最短的点
2 y( P2 K: l' w
int count=0; //记录成件
- }+ o* [- B- t. [1 s( V
int count2=0;
3 P# `* Y0 F* G1 ^3 g4 M3 b* g
for(i=0;i<8;i++){
/ z* c8 V; [. w* E
CNC_Flag
=0; //一开始CNC都处于没有加工状态
: a4 P) F- I7 v
CNC_WT
=0; //一开始CNC已工作时间都是0
- ~2 ]/ g3 O0 K( ^! z2 @ k
}
& [' Q, p$ F' _8 X) O7 \
for(i=0;i<4;i++){
# Q; f4 B1 W! i1 l& h6 h4 G( b F
CNC_Flag
=0; //一开始RGV那里都不用去
9 J7 J- z9 x9 _0 `4 M
}
$ @ V' l! u2 v! \
while(T<28800){ //时间未到时
7 H- s$ o! B2 S7 b+ m
if(CNC_Flag[0]==0 || CNC_Flag[1]==0 || CNC_Flag[0]==2 || CNC_Flag[0]==2){ //CNC1或2发信号
7 [" B* d }2 ^- N) g3 H n
CNC_X[0]=1;
$ t4 r- \' O* H1 R
}
2 U' k9 k w% j# M7 t* i J8 `
if(CNC_Flag[2]==0 || CNC_Flag[3]==0 || CNC_Flag[2]==2 || CNC_Flag[3]==2){ //CNC3或4发信号
. D2 ^2 [* K3 X) r1 l
CNC_X[1]=1;
0 s- j2 X) e* D1 l5 r6 P% y! c
}
! f! R/ @/ @4 c- d+ M7 A6 [" o
if(CNC_Flag[4]==0 || CNC_Flag[5]==0 || CNC_Flag[4]==2 || CNC_Flag[5]==2){ //CNC5或6发信号
( Y2 Z3 ]) g- Z% v" j4 N- `( ?" }( i; G
CNC_X[2]=1;
* }9 D K* M4 a' X7 G, [- w
}
, F* E2 {) n9 k3 ~. B- X
if(CNC_Flag[6]==0 || CNC_Flag[7]==0 || CNC_Flag[6]==2 || CNC_Flag[7]==2){ //CNC7或8发信号
9 |1 s1 L/ d N- Y6 w$ J
CNC_X[3]=1;
1 X& Z: _9 Y! f/ N7 ]; L* |8 g( I
}
t; r: y* I/ S6 o
for(i=0;i<4;i++){ //找到哪个地方是最近的
/ g0 l$ i: Z* v$ V" W
if(CNC_X
==1){
/ _; q+ o* F8 L5 c/ U0 f! v1 h* n
length=abs(RGV_X-i);
# j: X: ]1 B: n
if(length<min1){
# o- v+ ?% g) N( Q/ @/ M4 T
min1=length;
. s6 q6 ^3 ^& m* ]" x% |+ q8 V8 v
min2=i;
% t5 {: ?! G" x- m+ v V. ?( P
}
0 {4 m7 H2 m _) i6 j+ q7 F8 Y* V. ]6 n
}
4 ?) |3 J. j6 f+ ?, k
}
6 ?0 z1 E4 z4 i9 D
if(T+M[length]>28800)
! R0 I( Z) h- X% G r
break;
. r3 V, U& ~4 t% y0 U5 r
else if(min1>=0 && min1<=3){
; Z. r/ c) B$ J; y) s3 Q
T=T+M[min1]; //时间增加
; R+ _& p% j; n: j
CNC_X[min2]=0;
+ D, a; W+ ]* q- \
RGV_X=min2; //RGV移动到最近点
7 G2 C% a7 b! M/ j- |6 {5 [: c, G
///////////////////////////////////////////////////////
. ?/ p4 E1 V) A7 @- F3 D
for(i=0;i<8;i++){
5 d3 l* j. |9 p: q8 [0 Z- c) V" \
if(CNC_Flag
==1){ //已加工时间增加
1 |+ K. ]+ l- f7 ^6 ~+ W
CNC_WT
=CNC_WT
+M[min1];
" f( a Q% v. W1 K
}
) V+ R+ U$ ]4 j9 H; A
if(CNC_WT
>=W11){ //加工完成
. U' [0 E/ I f) [) D2 I
CNC_Flag
=2;
* w+ f4 X' y; q- C+ |
CNC_WT
=0;
& B. G3 r( B: X& E, J
}
3 U5 i) u$ A& v: g) d. d9 s" |
}
; [9 x. e! Y* q2 _
///////////////////////////////////////////////////////
: ?7 F, H6 ?2 m; U
}
3 T1 M3 o! q# E: f* A6 m
if(min2==0){
0 G+ P" a3 |; N' F) p' S
if(CNC_Flag[0]==0){ //如果CNC1没有在加工,CNC1完成一次上下料 ,置CNC1处于加工状态
; j* K0 ?. K0 S7 [, r
if(T+T1>28800)
+ ^6 G! j9 E/ |+ j/ f6 m' E3 B
break;
/ w7 _$ d/ D" J5 Y7 ?+ h
else{
$ s& J0 s w5 H. X. ? [
printf("(上料时间:%d)",T);
7 H' B/ h- {$ R$ ]3 ~4 U) e
T=T+T1;
. l9 w: q) s: x/ `1 u8 a9 C
for(i=0;i<8;i++){
5 ? g$ V; F# u* k
if(CNC_Flag
==1){ //已加工时间增加
A1 G' i* d# W( X$ ?
CNC_WT
=CNC_WT
+T1;
* [* h+ Z! `# n8 U9 w9 H! i
}
, B; u r( y" y& c3 v% ~
if(CNC_WT
>=W11){ //加工完成
x! ?1 a0 V% t2 z) w! I
CNC_Flag
=2;
: B+ R. K8 P4 Y, y0 {/ T
CNC_WT
=0;
, j/ g* F5 |, E. H
}
4 N) ?/ x. ]( L( Z7 b
}
1 Q, S" U: s& x1 Z3 I
CNC_Flag[0]=1;
( H, q4 |5 ]# D6 }# ^4 s" w' z6 m
printf("1 ");
' k! b( d5 N" f7 E1 X/ e/ K2 B
count2++;
& b/ T9 o' Z+ C6 K
if(count2==30){
2 o+ `& {+ u2 ?: }' j$ a* M- J
printf("\n");
; b9 B; M' n. i' `0 R
count2=0;
, B& v5 j6 Z8 C7 Q* @
}
8 o A }4 J4 ]* X! \
}
1 P8 c+ o) V& u5 l* O
}
" c0 U) T {0 N8 i4 r$ |8 ~1 i
if(CNC_Flag[0]==2){ //如果CNC1在加工,CNC1完成一次上下料,再完成一次清洗工作,置CNC1处于加工状态
2 N: e# Y3 w, E; R/ y2 K. q
if(T+T1+C>28800)
; U& @# G' w E+ q4 K
break;
7 {: f8 c8 Q- d3 ~, T9 d1 `
else{
# T2 a2 I H# X4 C
printf("(上下料时间:%d)",T);
- ~* a: K4 A" U1 Y' Y+ `
T=T+T1+C;
# U# y3 ~8 `3 G! Q+ ^. x! m8 [
for(i=0;i<8;i++){
, x/ h" T' {! p
if(CNC_Flag
==1){ //已加工时间增加
$ g* H2 [4 u% a+ e7 b
CNC_WT
=CNC_WT
+T1+C;
5 t# e' A) e( U6 b- c6 Y s" @
}
: r7 T/ z/ t2 T) N3 L# o
if(CNC_WT
>=W11){ //加工完成
0 c, u: o0 Q. J4 X5 e/ V2 d
CNC_Flag
=2;
) M) R, g# i, O% H6 M- h
CNC_WT
=0;
2 r4 r. ]' B. x- n5 y4 \ R
}
! o& e* z$ l* {; Y$ C0 K- q
}
?) d2 R2 X1 t5 Y) ?; F
CNC_Flag[0]=1;
* \- ~% k: u% E8 P" K& Y" X
count++;
0 m# N7 b1 C, r; Q1 k
printf("1 ");
( }" Z( Z* M' V
count2++;
/ y7 ?4 @* X5 r! z; s% e
if(count2==30){
5 `( P( J' q+ \1 L+ m4 r, B
printf("\n");
h( g7 @! E5 @
count2=0;
6 x D& S* l; g" t
}
: _9 N \* Q& X* D) w
}
& |+ i9 D: T2 m2 D+ S4 h2 e
}
3 x0 F% L4 N9 h9 G
if(CNC_Flag[1]==0){ //如果CNC2没有在加工,CNC2完成一次上下料,置CNC2处于加工状态
5 D2 V% h8 U- M/ L/ u+ P
if(T+T2>28800)
+ Z, r5 t. w' X6 Q, A0 h( d
break;
+ u( A% ?. E' h
else{
3 k4 j$ F9 D0 x: z( R4 j3 b
printf("(上料时间:%d)",T);
5 M; F% t: n. `
T=T+T2;
, N0 N) d) B, C* e% Z: H
for(i=0;i<8;i++){
6 ]3 u1 M$ Q5 h- m6 d
if(CNC_Flag
==1){ //已加工时间增加
% y0 E0 a9 Q: s. J
CNC_WT
=CNC_WT
+T2;
, l- u! ^! F! n( ~- B7 E
}
: b+ a$ J, e+ \: Q1 s" l6 Z) k+ t
if(CNC_WT
>=W11){ //加工完成
' p5 X2 ~1 h4 h/ _8 ]# w( A. Q4 w! ]& D V
CNC_Flag
=2;
; ?! P' L& e4 l
CNC_WT
=0;
1 C T4 C$ I1 {+ M$ C! O) u
}
# W" J5 ]; Y( S9 b
}
# q$ y( w( S0 j4 O/ B7 @! [( q
CNC_Flag[1]=1;
( f, Q% L4 g: D. X
printf("2 ");
1 N" ^! s3 ]9 h I
count2++;
% @# }6 _" [. d
if(count2==30){
) z" E4 H. l- w7 ?* c4 T& q% l
printf("\n");
4 H9 l8 _6 ^' v- @7 ?) K+ C
count2=0;
+ d6 }6 n0 y* j# ^7 G* h- f
}
7 O h+ [; }& U9 z7 R/ g. K
}
) j2 m9 [; C& G4 d2 D
}
7 P; _! F3 g8 U8 M
if(CNC_Flag[1]==2){ //如果CNC2在加工,CNC2完成一次上下料,再完成一次清洗工作,置CNC2处于加工状态
; t$ ?% w& e0 m- ]+ Y
if(T+T2+C>28800)
9 h. q7 J. s. I
break;
$ u! B) c# x8 u9 Q) A
else{
/ B% J* r7 X# [ v
printf("(上下料时间:%d)",T);
% v4 J9 P& X* }# I
T=T+T2+C;
- [7 D, d g# q/ I
for(i=0;i<8;i++){
8 t1 W& h/ _5 V2 n
if(CNC_Flag
==1){ //已加工时间增加
- E2 T1 v$ m [' \
CNC_WT
=CNC_WT
+T2+C;
8 q$ B. w" U- Z0 o* J* i6 K; M
}
" l1 G O; A4 O" y) L
if(CNC_WT
>=W11){ //加工完成
- P! i# v. s/ T, Y% s4 v
CNC_Flag
=2;
3 E2 m5 \# n6 U' r( |' u7 @( `
CNC_WT
=0;
+ Z( D* o( ~8 a. o, j& v
}
8 i( S, w2 B. P$ w2 A3 V
}
/ _' _, s/ ~$ V- Z
CNC_Flag[1]=1;
; J; z& e- k' K q
count++;
0 z( n# x$ i. t$ |5 S( d
printf("2 ");
1 U: T9 T) h# F+ ]
count2++;
. P( C+ T! ^6 Q
if(count2==30){
3 y# ?: p9 \" Z& a
printf("\n");
# w- X9 D# j( @; D* @
count2=0;
# X+ E. {: J9 b
}
( B8 }3 r8 ?% C# H: d
}
5 N7 m& j: P e- L
}
0 q! |9 r4 E4 A* g% q v0 ?; ]* ]
}
9 {0 B% i+ l$ P; m5 c! u# M$ T9 _
//////////////////////////////////////////////////////////////////////////////////////////////
$ m* G8 e$ R: A0 c5 d' X8 N% ?( H, G
else if(min2==1){
2 g: K5 B8 N! P/ h! g' I7 i- }
if(CNC_Flag[2]==0){ //如果CNC3没有在加工,CNC3完成一次上下料 ,置CNC3处于加工状态
6 |: T, o' ?4 c' D' y- l8 b
if(T+T1>28800)
' V9 U/ y" B+ c% V
break;
" K8 }) o) Z& r- M/ i3 H7 f# U
else{
+ x3 ]5 G; f. h
printf("(上料时间:%d)",T);
# F# x3 ^0 b7 e& B$ r
T=T+T1;
; D- b4 l3 s% A2 H. [9 K: ]
for(i=0;i<8;i++){
+ o! s& B/ |5 |% Q
if(CNC_Flag
==1){ //已加工时间增加
% p r+ O4 }( o, T1 u6 @, Y
CNC_WT
=CNC_WT
+T1;
8 z( i3 ?' w6 C+ p2 I/ J! ?: n$ l
}
/ R$ C* R- |- `6 l! W. Q R
if(CNC_WT
>=W11){ //加工完成
/ C6 B2 ?) W) h L/ R
CNC_Flag
=2;
! t m. X5 r( y. o& [7 o! H, l
CNC_WT
=0;
) h. v. S. n/ H& |# |1 Q
}
?# q* r$ Q7 I. L7 \$ ^$ J
}
; J3 M: d! Y3 N5 r8 M
CNC_Flag[2]=1;
$ Z$ R: S. I6 `9 ]( Z$ R7 h
printf("3 ");
7 c3 w( c9 U7 ]# [1 C" C9 f$ C5 c
count2++;
! @, k- v5 ^$ B/ r
if(count2==30){
- Q8 k1 l$ l8 P# v4 F% D
printf("\n");
" E% c! ?% j8 E# O" x7 C/ ^( h, u p
count2=0;
' f) G3 h# k9 W$ I$ z1 F% z
}
4 ]2 R( J5 w: q/ m! G: |
}
; N9 R. q7 h) ]" `6 ?" R
}
/ [9 @0 Y/ D" ^- I, O+ v
if(CNC_Flag[2]==2){ //如果CNC3在加工,CNC3完成一次上下料,再完成一次清洗工作,置CNC3处于加工状态
. E9 ]6 T% |9 @
if(T+T1+C>28800)
& |2 ]' ], C3 H& k2 q6 f. C
break;
, Y2 J5 s# k2 } K6 I# }( C1 t
else{
9 t* S# U6 G- T1 Q
printf("(上下料时间:%d)",T);
! J# G2 n/ }- Q0 n4 ^$ G& G6 `1 q0 S
T=T+T1+C;
! I. L# e- }9 y
for(i=0;i<8;i++){
, B& M7 X* a+ V, G {4 Q! P
if(CNC_Flag
==1){ //已加工时间增加
( J4 v# }0 J% X' [: e+ o
CNC_WT
=CNC_WT
+T1+C;
7 ~& [& n! `) B9 O/ K
}
r, l P# k' x# O1 R
if(CNC_WT
>=W11){ //加工完成
3 S/ Z6 j' t3 B
CNC_Flag
=2;
$ r9 N0 I! o. M) `8 m3 |; t, E
CNC_WT
=0;
( A$ G" {; Q. d C6 u$ D0 Z
}
4 d: X4 T; v& J/ W0 i
}
; p \/ c( c* `: }! o$ ~! s9 C
CNC_Flag[2]=1;
7 I- s$ s0 A9 R- p( o
count++;
8 m& ]) k) w/ d
printf("3 ");
/ u8 I' ~/ z4 c
count2++;
7 R% U9 S% e4 G% O& M+ j8 y
if(count2==30){
4 I- ~$ t" e) D
printf("\n");
8 F; h, A( T; P2 G, i5 D, S/ F
count2=0;
5 d8 N' x; ^; S9 u
}
+ j' @8 H8 a5 ~7 T1 _6 Q
}
2 [) H- m& L" @2 h4 o
}
( Y$ @* \7 J0 [- }4 k% y& R( o
if(CNC_Flag[3]==0){ //如果CNC4没有在加工,CNC4完成一次上下料,置CNC4处于加工状态
- C1 \( I% @$ i. j' T
if(T+T2>28800)
9 H- R' i! j9 r- n" v
break;
8 I0 O: j% d( x# g1 I
else{
# T' f7 I5 E& o! ?2 y
printf("(上料时间:%d)",T);
, j3 W5 Q+ U. {. l
T=T+T2;
. ]! y3 j D2 ?; ~& @
for(i=0;i<8;i++){
: |7 e- ?% c1 T r2 T; J: z2 \& O
if(CNC_Flag
==1){ //已加工时间增加
% c B4 Q# P. i: D. M3 x- f0 E
CNC_WT
=CNC_WT
+T2;
" g8 H$ u% F. x
}
9 M9 W) z) r3 n: }. U# E9 c
if(CNC_WT
>=W11){ //加工完成
4 d+ e' O }/ m+ ]
CNC_Flag
=2;
3 C9 I1 L. c' d6 D& v8 p" U
CNC_WT
=0;
% \6 a: {4 }9 x) x
}
0 F, e- r( `& ~2 C+ ?
}
& G* g% E# H4 `# q
CNC_Flag[3]=1;
[! O* f* l& j2 p6 T$ G8 l: x
printf("4 ");
8 W @( k& b2 }
count2++;
3 L3 B2 e: }4 ?. H
if(count2==30){
0 T/ \4 K. D2 K5 B2 I* r
printf("\n");
" P6 u6 p9 w0 m' M# {4 M; ^
count2=0;
+ c6 ]" s$ w, y0 ]8 C% K
}
% n* v4 Z% ~# e( ~/ F2 ]% g
}
+ d3 q( Y' B) y* z! F" U, F% l
}
% C7 i* Q0 \+ G8 ?7 [6 x
if(CNC_Flag[3]==2){ //如果CNC4在加工,CNC4完成一次上下料,再完成一次清洗工作,置CNC4处于加工状态
) j$ ?5 f1 Z# S' [/ {
if(T+T2+C>28800)
( K$ Z% ]# H$ f r( p
break;
1 M7 C' Y/ \6 z4 L( Z
else{
/ C* H2 Z) `; e. J, {, j3 y* _
printf("(上下料时间:%d)",T);
, X" a% V6 K/ K/ \6 ]( i- `
T=T+T2+C;
3 I( H$ N4 G8 Z* G4 \: \
for(i=0;i<8;i++){
4 }+ ]& d+ S m n" _, ~( m
if(CNC_Flag
==1){ //已加工时间增加
: U1 M5 O, v) |
CNC_WT
=CNC_WT
+T2+C;
# {" I2 ^% W/ K4 ~3 V7 x
}
5 Y0 }( A: K. d3 V, N/ @
if(CNC_WT
>=W11){ //加工完成
6 ]7 ?& I7 U' H4 k$ u) G
CNC_Flag
=2;
: [- y$ m/ n) J; p
CNC_WT
=0;
- j/ B/ ?( l9 W# A7 F
}
( z+ Z T* f5 |: f8 h1 S+ |. u
}
- W; f6 p: I3 I& Y
CNC_Flag[3]=1;
$ e9 W0 |* G" W4 M6 m
count++;
0 s8 d q2 t; m+ a# e
printf("4 ");
- I- D8 u6 Q1 l4 {) ~: u% e
count2++;
6 o2 ~) Q- c: } Q I8 {
if(count2==30){
% G9 M+ ~0 Y, n O: n
printf("\n");
& v0 i0 q6 m6 i# P7 L( O
count2=0;
6 ^+ C4 {2 j0 n0 _
}
( }3 V7 y$ ` r
}
$ C3 G5 P# C. J8 l) u! a
}
1 E- f6 K \8 B0 W) \ _4 c
}
) a7 k9 V! O3 x
/////////////////////////////////////////////////////////////////////////////////////////////////
5 ]8 k3 P7 Y: v
else if(min2==2){
% ?! h- Z4 r7 I" m3 x" a% j. z; K2 Y$ _
if(CNC_Flag[4]==0){ //如果CNC5没有在加工,CNC5完成一次上下料 ,置CNC5处于加工状态
( R1 C, ?% F+ v* t6 J6 E( K
if(T+T1>28800)
Q( T+ @& N" f$ |6 _* c# H! t
break;
: ~! @' u- _( i
else{
3 e! S0 \' c) P2 H; F4 E) u
printf("(上料时间:%d)",T);
. C! A0 I" F! ~: L3 q
T=T+T1;
& M# F" P& i- p
for(i=0;i<8;i++){
$ M( w$ G9 v7 J- v) H6 }2 a7 h
if(CNC_Flag
==1){ //已加工时间增加
& O0 B- w4 D$ z# O9 L. z2 Q$ u
CNC_WT
=CNC_WT
+T1;
- ?* y- x: Y) c# z+ F
}
3 a4 p5 W# K/ W( x
if(CNC_WT
>=W11){ //加工完成
6 U0 Z |! U- U g5 n J
CNC_Flag
=2;
) ]1 p* |- W' y: g
CNC_WT
=0;
+ U% ?0 d4 j! _7 V, X7 X2 A
}
% ^4 q1 X( [/ Q( ~8 Q" h8 v
}
( B7 t/ \0 y4 V) G6 d+ h
CNC_Flag[4]=1;
( ]6 |: Q$ e5 g6 B! J
printf("5 ");
. g1 C( \. u0 ]" |" z
count2++;
3 ~* j! i, _0 B6 V
if(count2==30){
- J7 @2 j9 h* y: C2 ~; h; P
printf("\n");
$ @( L7 X5 P% h7 h
count2=0;
: U) N" s6 r9 _
}
. s8 x( e6 w6 O
}
+ Z6 v4 H2 x {4 O1 }; i
}
$ m1 e x2 O7 o+ y. M
if(CNC_Flag[4]==2){ //如果CNC5在加工,CNC5完成一次上下料,再完成一次清洗工作,置CNC5处于加工状态
4 A8 i" n% v h$ |
if(T+T1+C>28800)
) Y: s' W1 D) f& `/ \
break;
- B @7 j* k9 E6 `/ W
else{
7 I7 Z0 \2 j% G/ u
printf("(上下料时间:%d)",T);
# m+ k, n( A) X( Z* g
T=T+T1+C;
: r+ A& b1 Z. T6 f" k: g7 h1 h7 h
for(i=0;i<8;i++){
0 k. p: @4 f9 H2 R) [' \
if(CNC_Flag
==1){ //已加工时间增加
" \, `! p. h0 j4 ?
CNC_WT
=CNC_WT
+T1+C;
, P3 N1 n! I4 |9 _
}
% M1 r" a- G4 c& W& J( {3 u7 u
if(CNC_WT
>=W11){ //加工完成
" w, k& h) ]6 i4 i% N4 v
CNC_Flag
=2;
$ [: p# K/ t. B- t" p: a" F
CNC_WT
=0;
- }& @$ C1 z" a! l; N b$ z
}
4 Q1 X+ h4 w3 C5 P& z
}
7 v; ^4 d/ c: m, D& y6 u! y2 o
CNC_Flag[4]=1;
0 p }& t% K' l( D" S, o
count++;
3 R i$ D# o1 c, B5 b
printf("5 ");
* i R' |! u' u
count2++;
- y) E0 L8 i# i) M
if(count2==30){
/ t& _% C1 B5 V3 s o
printf("\n");
- b4 R* }: A" b# @/ f3 w ~
count2=0;
" v& D. s; D2 q+ L% \9 Z
}
- n+ J# p0 F6 ~# r
}
" ]: @9 _* W6 {: h* r* |
}
, _& C( @6 B- B5 Z( q4 a
if(CNC_Flag[5]==0){ //如果CNC6没有在加工,CNC6完成一次上下料,置CNC6处于加工状态
( n& }0 ?1 w3 Z& H4 F
if(T+T2>28800)
3 `% _+ }) U7 b4 q0 D
break;
. r& y% E" N" k3 ?% \) p$ `
else{
; d9 u0 M- m/ a% f6 r' o' w6 v, y
printf("(上料时间:%d)",T);
; G' n# y& X+ J. O. O
T=T+T2;
0 b& {( F' K3 X& n, P
for(i=0;i<8;i++){
' d4 ]/ C3 l& F7 \2 D" p' s
if(CNC_Flag
==1){ //已加工时间增加
. F! ?5 X+ O9 ?6 M# M
CNC_WT
=CNC_WT
+T2;
6 d0 H% d2 D8 m
}
9 ?! d5 \, K1 `) a' R
if(CNC_WT
>=W11){ //加工完成
$ W+ v8 A/ g' \( T8 V
CNC_Flag
=2;
' }. o4 \% N& U/ A- o
CNC_WT
=0;
/ ? ]8 i& ^" [, k" {
}
* O6 R& }$ N! k& {, L8 K) k& Z, Z
}
0 t0 o, |4 W8 `! o' @/ M
CNC_Flag[5]=1;
: L1 i. H) |; l
printf("6 ");
R |& R7 ]- Y! `6 m5 B
count2++;
% p5 J/ V& z5 P b. H" R' Q' }% S
if(count2==30){
! d- j) V) ?& ?1 ^" p% A
printf("\n");
; ^6 R; x0 J" x; o F O
count2=0;
2 K2 b1 ]) A2 J( ?
}
8 J, B* r, R/ z- t
}
6 U6 a! v) Z/ V9 W$ {" ~3 K
}
, Q+ \) Q4 U( s9 B9 h7 {
if(CNC_Flag[5]==2){ //如果CNC6在加工,CNC6完成一次上下料,再完成一次清洗工作,置CNC6处于加工状态
( l- H% \2 [% D" {) o; V$ z
if(T+T2+C>28800)
4 C M0 `1 d L$ t
break;
! G+ m+ Y$ f4 M. U% H( a. C
else{
6 c3 ?) u: O7 ^2 z2 x& @
printf("(上下料时间:%d)",T);
" I5 ]4 c/ p1 T9 N% `9 _
T=T+T2+C;
. Y$ {# D: g, n; t4 I
for(i=0;i<8;i++){
( I0 N0 c. K/ C) x Z
if(CNC_Flag
==1){ //已加工时间增加
+ F9 Q1 U& K3 p j$ x. n- e
CNC_WT
=CNC_WT
+T2+C;
5 V& t& X) X0 ?; F
}
& o8 X1 U- w; |* c
if(CNC_WT
>=W11){ //加工完成
1 Y+ T4 f! g- R2 W- h1 Z8 M
CNC_Flag
=2;
8 m6 w/ l- B/ o
CNC_WT
=0;
3 V! L9 N. U! i L0 ?2 K
}
. ?# n4 z8 m5 \: Y% d9 I# g0 R
}
7 L6 C/ e5 {1 I% N! H, Y
CNC_Flag[5]=1;
/ s' X2 Z: Q$ K! ]+ Y
count++;
/ ]* `" @' i4 ]6 a. @: K
printf("6 ");
! W5 }% W- S- O \: [8 w" k
count2++;
6 m6 v8 Y1 r1 r" p7 h. Q
if(count2==30){
X5 B4 r4 }0 D- t% t5 g
printf("\n");
0 m2 T' P4 Z7 c( H
count2=0;
" n% K' h. |0 @+ p8 P; R
}
* r M' w3 @4 r; {7 Z$ P
}
L2 l8 V# X# |. u
}
8 G/ Z( A D8 l6 W/ L
}
- C7 u# E) ]. R- ]$ D$ ?
/////////////////////////////////////////////////////////////////////////////////////////////////
- C1 U4 _/ u2 S5 d
else if(min2==3){
8 C5 ]+ s5 U+ I% J
if(CNC_Flag[6]==0){ //如果CNC7没有在加工,CNC7完成一次上下料 ,置CNC7处于加工状态
( i* ?; b4 ?0 [- ~$ ~) F+ R m3 t
if(T+T1>28800)
5 W) T g9 i+ N. J! Z
break;
: Z$ V$ Q3 H- }4 W3 ]9 A" @9 g
else{
7 P3 S" d3 r+ X: Z9 K6 s7 R- i
printf("(上料时间:%d)",T);
+ a' {% }9 C7 e; |% c6 O
T=T+T1;
' b, @3 d- b! J, l6 J) I+ f
for(i=0;i<8;i++){
* L0 Q) c8 K+ `0 L& q. F
if(CNC_Flag
==1){ //已加工时间增加
. x4 G5 _% W0 W4 ]; U
CNC_WT
=CNC_WT
+T1;
/ h! f# f, ~' K7 F' p. M
}
7 h7 Q/ T7 B5 i2 r3 m% k( |, J
if(CNC_WT
>=W11){ //加工完成
+ H% w4 a% k& u, N" o% I3 _( p
CNC_Flag
=2;
D, X- `6 s C+ [& u/ T
CNC_WT
=0;
) m: g+ T2 T3 g8 O$ f
}
4 q; T# r) E9 U- x5 `/ M. ]
}
+ c7 z3 ?1 c; q: C% R2 G
CNC_Flag[6]=1;
/ O8 f& v# O1 I) a) [$ v, L
printf("7 ");
1 x( J# I" B- S( }
count2++;
% x0 i4 Q3 I, N
if(count2==30){
4 e: Z& g7 f. f' s$ ?7 t* }# p& ^
printf("\n");
. l$ N% q2 p7 d# o }9 V4 ~
count2=0;
( w# k T6 T) w, }1 W
}
) G1 z$ @$ n" l/ X9 \; v
}
( ~' Q- [ G7 p# m1 a/ j0 ~
}
/ u7 e5 }" |$ m; V5 i
if(CNC_Flag[6]==2){ //如果CNC7在加工,CNC7完成一次上下料,再完成一次清洗工作,置CNC7处于加工状态
; Z1 e1 u1 L; g( C( A) p
if(T+T1+C>28800)
8 K: C+ t% ] ~8 N
break;
; {; s' {0 C/ D0 s7 ]) U
else{
V% j5 u, u A# t' _
printf("(上下料时间:%d)",T);
/ c/ O) b) W! w( N, ~. W D
T=T+T1+C;
3 n2 S) k4 |0 b$ j9 K
for(i=0;i<8;i++){
) v% o! u3 h2 J- O5 a, P
if(CNC_Flag
==1){ //已加工时间增加
/ {: b6 d4 ]+ C* T( M
CNC_WT
=CNC_WT
+T1+C;
4 x2 }' ^0 Y4 r! l E$ V
}
7 x+ R# p' }" v1 m# T; z
if(CNC_WT
>=W11){ //加工完成
9 q2 y% w5 P) a6 x: y( |
CNC_Flag
=2;
T( P' Z9 Y" }
CNC_WT
=0;
9 s) l- @: e; O& J2 ?$ X+ X
}
5 S, b/ W$ n4 o( \7 V) P( ?
}
; F: `- M6 B" e+ S
CNC_Flag[6]=1;
+ j/ v# U* }- ]- k8 h) R
count++;
0 q0 l: c+ P' a K/ g8 R2 J8 |
printf("7 ");
" p! }8 j+ D" t/ V
count2++;
2 _ K9 h% `9 z4 A/ U
if(count2==30){
& z) f; ^ k- w" h' ^( ?* x
printf("\n");
5 w. W: j- i0 u6 T7 q3 R- ^2 U
count2=0;
2 f+ a2 @9 f& u. x0 P$ r
}
$ R% p' k- [' y6 W. A$ E8 n
}
7 e! ~& g; [2 o4 Q: Y
}
4 J. V9 G7 I1 \& {& k
if(CNC_Flag[7]==0){ //如果CNC8没有在加工,CNC8完成一次上下料,置CNC8处于加工状态
3 s" p: h: o$ n) \# x. s4 m
if(T+T2>28800)
I7 z0 L) h' g% q- o- }
break;
6 W* T+ P+ ~0 x& r) N
else{
D0 L+ ]3 l' g* m% }" c2 o: z
printf("(上料时间:%d)",T);
& k' e W) `, R6 ]
T=T+T2;
$ i9 ?0 [" f# `8 o g. B8 b1 p% a0 N
for(i=0;i<8;i++){
7 Z, B4 \9 ~% r- W+ ?$ e
if(CNC_Flag
==1){ //已加工时间增加
/ e0 s- s5 _. g r/ ]- X0 P4 ^* V0 G
CNC_WT
=CNC_WT
+T2;
* }+ C+ a* z, Y; @% P: A
}
$ e: ?6 o1 j) C" }" H
if(CNC_WT
>=W11){ //加工完成
( W* Q! U6 X q9 g; o3 A- @ z5 h
CNC_Flag
=2;
: y; ~! b5 A4 R: b7 K; R z
CNC_WT
=0;
! u' C/ ~, x. Q6 n) O
}
7 X/ p8 x5 G1 ~0 ~1 [
}
$ G' I- Y4 Z: g
CNC_Flag[7]=1;
$ K% m, O7 j F& L+ y9 t8 E% p
printf("8 ");
6 O. }- _' f; ^. ]
count2++;
* s) [2 E; t1 I, p& S6 {
if(count2==30){
, C2 N, }) t; G+ s {4 F0 q- Y
printf("\n");
V9 e: T' }- p% m2 n6 B: l l
count2=0;
7 ^" l$ Q0 C/ ]/ @
}
; o: M4 q+ ]6 N- q; N
}
( J* f7 Y" s4 t: x) H! q# R, I7 h
}
0 J1 P) m" Y. ? l( \
if(CNC_Flag[7]==2){ //如果CNC8在加工,CNC8完成一次上下料,再完成一次清洗工作,置CNC8处于加工状态
8 u4 U; Y1 A: u# e
if(T+T2+C>28800)
3 U/ i2 h( L% `) r- s, v8 d
break;
+ U+ t7 q+ Q) ^3 y
else{
4 R6 E' }' m6 | [% E5 x& B9 Q' H8 V
printf("(上下料时间:%d)",T);
+ k, ], i1 g) T, C3 K; [) r
T=T+T2+C;
7 Y' M* }; X6 R1 z9 A4 G/ F0 k9 l
for(i=0;i<8;i++){
9 y- n$ \ y- L7 w$ u$ \# T0 f
if(CNC_Flag
==1){ //已加工时间增加
" r: k3 R! t/ _# O" G
CNC_WT
=CNC_WT
+T2+C;
$ P# ?. C9 H* H0 i2 O
}
' S1 m6 b6 Y) |/ t, n
if(CNC_WT
>=W11){ //加工完成
. g7 a. H6 @, Z: Q9 J, ~0 N1 h( L
CNC_Flag
=2;
0 O: R6 i) u" d- _9 O3 f
CNC_WT
=0;
- ?% M7 v7 B, L# w& w1 q
}
9 V$ B# @' t6 {+ _' Y& U# d$ I
}
: T4 F9 z. t! V P0 V8 h: A
CNC_Flag[7]=1;
$ F4 N9 @/ A$ v
count++;
. O7 w, l ?# v7 o
printf("8 ");
" D* V. m7 }8 {9 Z
count2++;
3 C& Y5 ~8 G# ^2 n- p) V' K
if(count2==30){
) R& {; W, ~2 B/ ^2 F! a" F
printf("\n");
% V8 m) e8 m0 P/ K7 F
count2=0;
- B6 B- T! ^; ^
}
6 M9 B- M8 l( o% z9 ]: k
}
U! n H, d$ o$ i) q3 \4 L
}
) J/ e* t9 \/ I) y R# N
}
. O$ R5 A$ p. N, Y1 x
//////////////////////////////////////////////////////////////////////////
; d- Q& Y; Y/ i9 R
else{ //否则等待,等待过程中RGV先移动到要完成加工的CNC那里
2 t- L* P/ \& W0 b
int min3=600;
) V' z3 `0 M+ ?+ g$ T
min1=5;
; K" e$ x" e' m
min2=-1;
6 q8 u/ F' E: S9 j$ X
/* T=T+1;
) c0 {' a& h9 f3 Z# S1 d
for(i=0;i<8;i++){
( [, ^. T: p$ q/ G4 K4 r: x$ n
if(CNC_Flag
==1){ //已加工时间增加
0 a- X4 c3 g& ^: |6 B6 n
CNC_WT
=CNC_WT
+1;
! O5 _' v8 t7 l0 y7 k$ |
}
) P$ s% T/ ]; k$ v3 Z
if(CNC_WT
>=W11){ //加工完成
# c3 @& I) I7 M8 j& |" b) a# I
CNC_Flag
=2;
3 Z& H( X8 { P* d
CNC_WT
=0;
+ R) G8 X" u: X ]
}
6 X( Z3 z% |3 @& f3 ~- B
}
, C1 [; L+ [" n8 }5 N4 k" s5 N" l
*/
: f( t5 g1 C E) A
for(i=0;i<8;i++){
C6 u i3 G6 Z5 L; Y X
if(CNC_Flag
<min3){
- u X. D5 q/ z0 M# T
min3=CNC_Flag
;
& Q7 b2 N7 h, P6 r1 {
if(i==0 || i==1){
9 R8 c, Y9 d! X [" f1 J6 @
min2=0;
2 ~- e+ ^5 h; J6 ^& u# j
}
2 k; q- n) N) O0 u- i
else if(i==2 || i==3){
1 u2 L3 f4 C/ N2 S3 |% B( P+ i8 r, O
min2=1;
! o5 Q! Q3 O1 F7 I8 } A
}
# [! u$ R4 j% I
else if(i==4 || i==5){
: ~- `) v+ J: U) C
min2=2;
* q: x. r" }4 d% C" ^. }; N
}
: w; e, y- n" L; W2 x' @- j; ~3 f
else if(i==6 || i==7){
# h. d6 |) T! ]; e& C7 q: @ H# {
min2=3;
2 \ b7 ?0 [8 [) Z, n
}
0 `8 E! {3 N. Z# O( z9 j
}
4 |" ~; I9 U. {; d& ^% `
}
% v$ k7 u; O( y% K5 U+ X! t
if(T+M[abs(min2-RGV_X)]>28800)
4 x8 s Z/ _$ @. z" v
break;
# F6 K: }$ o* G" C: a9 A
else if(min2>=0 && min2<=3 && M[abs(min2-RGV_X)]!=0){
' N4 m5 j- D% F C
T=T+M[abs(min2-RGV_X)]; //时间增加
, Z, K b$ `- f, w! J: e
for(i=0;i<8;i++){
& z N# R5 G+ g8 T9 a
if(CNC_Flag
==1){ //已加工时间增加
' d( m/ v6 Q0 A2 B% _1 y% o# J7 F
CNC_WT
=CNC_WT
+M[abs(min2-RGV_X)];
0 m8 @. x |+ Y8 z2 g. Z8 ~& m
}
3 R9 ?: c; E( L2 u$ D
if(CNC_WT
>=W11){ //加工完成
3 e6 @- x: T1 R+ D+ d
CNC_Flag
=2;
/ S/ T& O1 T8 Q; y- P0 m, p
CNC_WT
=0;
. M8 D- d) \! i" a/ ?, _9 N
}
9 U }1 Q: u) L- }
}
5 C( R/ U0 K7 |- e$ I. J
RGV_X=min2; //RGV移动到最近点
; w/ f7 z, u' o1 G* s) I1 ] ]' v2 @
// printf("%d ",min2+1);
5 b9 Q0 C8 n+ r3 ?5 u* j- `5 Z
count2++;
. X3 c* u% K4 h W: ~0 I& ?
if(count2==30){
4 O/ M$ O+ \" R$ T# J" u* L# Q5 {& \
// printf("\n");
" t/ S& `' x0 I: r
count2=0;
0 _1 G9 ~+ Y Y/ P+ M
}
- S4 u% p1 o2 F# E2 B$ h s
}
. q# p9 L; l* _3 |
else{
/ i+ E/ K' g& [2 A9 |. I5 |
T=T+1;
) D! n. d7 _+ u! a5 N1 h
for(i=0;i<8;i++){
4 Q) S& j# d7 L: u
if(CNC_Flag
==1){ //已加工时间增加
* R9 b( R* T" z- w; y
CNC_WT
=CNC_WT
+1;
- }: u) Q5 o7 q: F) L7 ?
}
. k9 F8 W: V3 z
if(CNC_WT
>=W11){ //加工完成
. ^% [9 S& C( j) x% z
CNC_Flag
=2;
# h( S t6 s; s( q/ O# c" ^$ X% v
CNC_WT
=0;
7 {. g2 e3 C$ @8 \6 b5 t: F7 o
}
* u& K7 c/ g0 O' s! P
}
# p0 O' A: q+ m1 _
}
$ n' V/ a! a6 }3 H) b3 h
min3=600;
. ?1 o- _: a. K# I$ x3 m6 X# C8 K. J
}
% a& \3 E1 K+ Q/ `" @
min1=5;
& c' T) P) g+ ~+ T' g4 n% [- {
min2=-1;
% v! p& Q; c' d6 ~" F5 g+ X
}
! t% I' u, \4 t( w4 `' |, T6 D% w/ Z
printf("%d\n",count);
( {+ i- {0 G2 u' s( ?1 C3 h3 r0 Y! T
return 0;
0 U' ^) ~+ i' ~: r! q
}
% @' Z, U8 Q6 t1 F: N& B3 o
% J- L; c; F1 }1 L# l# s2 O7 Q8 R
7 N$ P/ c$ B9 ?! C2 d3 J& V
0 Y6 O0 c, ]" T- a/ m
# E6 I5 Q+ W3 x) O$ O2 Q2 Z; L5 N
2 S# q9 A; }7 |9 @
8 K2 t2 K- S: ?/ K
4 y$ @! ^2 @- Y. j
8 Q; k- g2 p2 ]4 U- X* i7 I- S
. `1 Y3 P3 E9 X0 d- h
/ P, o/ w, X1 Z4 G; L7 |0 S
* l: T) ]5 Q' e) K$ ^& A2 M# m9 x5 o
0 U. |* ]5 i# e3 s* s* a h
2 E% u1 y/ J: y" A* l; {1 v
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5