// ACSR specification for a two-robot manufaturing system // from ``HYTECH''. // 7/25/95 // *** -- I am not sure this line can be executed // due to ACSR priority... // #include // from since the previous line causes an error... #define ZOMBIE (rec Z.({}:Z)) #define UNTIL_INTRPT(P,IP) scope((P),dummy,infinite,NIL,NIL,(IP)) // define robot D Robot_D = D_stay; D_stay = UNTIL_INTRPT(ZOMBIE, (s_ready,1).D_pick[0]); D_pick[0] = {}:D_pick[1]; D_pick[1] = ('d_pick1,1).('d_pick1_to_station,1).D_turnright[0] + ('d_pick2,1).('d_pick2_to_station,1).D_turnright[0] + {}:D_pick[2]; // *** D_pick[2] = ('d_pick1,1).('d_pick1_to_station,1).D_turnright[0] + ('d_pick2,1).('d_pick2_to_station,1).D_turnright[0]; D_turnright[i] = {}:D_turnright[i+1] {i,0,4}; D_turnright[5] = D_putdown[0] + {}:D_putdown[0]; D_putdown[0] = {}:D_putdown[1]; D_putdown[1] = ('d_put1,1).D_turnleft[0] + ('d_put2,1).D_turnleft[0] + {}:D_putdown[2]; // *** D_putdown[2] = ('d_put1,1).D_turnleft[0] + ('d_put2,1).D_turnleft[0]; D_turnleft[i] = {}:D_turnleft[i+1] {i,0,4}; D_turnleft[5] = D_stay + {}:D_stay; // initially, two boxes are all on the moving belt. // alternative : one box on the service station // and one box on the moving belt. // define box 1 Box1 = Mov_m1[0]; On_serve1 = UNTIL_INTRPT(ZOMBIE, (d_pick1,1).On_d1); On_d1 = UNTIL_INTRPT(ZOMBIE, (d_put1,1).Mov_m1[0]); Mov_m1[i] = {}:Mov_m1[i+1] {i,0,132}; Mov_m1[133] = {}:Mov_m1[134] + Mov_f1[133]; Mov_m1[134] = Mov_f1[134]; Mov_f1[i] = {}:Mov_f1[i+1] + ('redmark1,1).Mov_f1[i] + (g_pick1,1).On_g1 {i,133,165}; Mov_f1[166] = ('fall,1).NIL + {}:Mov_f1[167] + ('redmark1,1).Mov_f1[166] + (g_pick1,1).On_g1; Mov_f1[167] = ('fall,1).NIL + ('redmark1,1).Mov_f1[167] + (g_pick1,1).On_g1; On_g1 = UNTIL_INTRPT(ZOMBIE, (g_put1,1).On_serve1); // define box 2 Box2 = Mov_m2[0]; On_serve2 = UNTIL_INTRPT(ZOMBIE, (d_pick2,1).On_d2); On_d2 = UNTIL_INTRPT(ZOMBIE, (d_put2,1).Mov_m2[0]); Mov_m2[i] = {}:Mov_m2[i+1] {i,0,132}; Mov_m2[133] = {}:Mov_m2[134] + Mov_f1[133]; Mov_m2[134] = Mov_f2[134]; Mov_f2[i] = {}:Mov_f2[i+1] + ('redmark2,1).Mov_f2[i] + (g_pick2,1).On_g2 {i,133,165}; Mov_f2[166] = ('fall,1).NIL + {}:Mov_f2[167] + ('redmark2,1).Mov_f2[166] + (g_pick2,1).On_g2; Mov_f2[167] = ('fall,1).NIL + ('redmark2,1).Mov_f2[167] + (g_pick2,1).On_g2; On_g2 = UNTIL_INTRPT(ZOMBIE, (g_put2,1).On_serve2); // define Robot G Robot_G = G_stay; G_stay = UNTIL_INTRPT( ZOMBIE, ( (redmark1,1).G_pick[0] +(redmark2,1).G_pick[0] ) ); G_pick[i] = {}:G_pick[i+1] {i,0,2}; G_pick[i] = {}:G_pick[i+1] // *** + ('g_pick1,1).G_turnright[0] + ('g_pick2,1).G_turnright[0] {i,3,7}; G_pick[8] = ('g_pick1,1).G_turnright[0] + ('g_pick2,1).G_turnright[0]; G_turnright[i] = {}:G_turnright[i+1] {i,0,5}; G_turnright[i] = {}:G_turnright[i+1] + G_wait {i,6,10}; G_turnright[11] = G_wait; G_wait = UNTIL_INTRPT(ZOMBIE, (s_empty,1).G_putdown[0]); G_putdown[0] = {}:G_putdown[1]; G_putdown[1] = {}:G_putdown[2] // *** + ('g_put1,1).('g_put1_to_station,1).G_turnleft[0] + ('g_put2,1).('g_put2_to_station,1).G_turnleft[0]; G_putdown[2] = ('g_put1,1).('g_put1_to_station,1).G_turnleft[0] + ('g_put2,1).('g_put2_to_station,1).G_turnleft[0]; G_turnleft[i] = {}:G_turnleft[i+1] {i,0,9}; G_turnleft[i] = {}:G_turnleft[i+1] + G_stay {i,10,11}; G_turnleft[12] = G_stay; // define Service Station Service_station = S_empty; S_empty = UNTIL_INTRPT( (rec X.({}:X+('s_empty,1).X)), ( (g_put1_to_station,1).On_serve_Box1[0] +(g_put2_to_station,1).On_serve_Box2[0] ) ); On_serve_Box1[i] = {}:On_serve_Box1[i+1] {i,0,7}; On_serve_Box1[i] = {}:On_serve_Box1[i+1] + S_ready_Box1 {i,8,9}; On_serve_Box1[10] = S_ready_Box1; S_ready_Box1 = UNTIL_INTRPT( rec X.({}:X+('s_ready,1).X), (d_pick1_to_station,1).S_empty ); On_serve_Box2[i] = {}:On_serve_Box2[i+1] {i,0,7}; On_serve_Box2[i] = {}:On_serve_Box2[i+1] + S_ready_Box2 {i,8,9}; On_serve_Box2[10] = S_ready_Box2; S_ready_Box2 = UNTIL_INTRPT( rec X.({}:X+('s_ready,1).X), (d_pick2_to_station,1).S_empty ); System = (Robot_D || Box1 || Box2 || Robot_G || Service_station) \{ d_pick1, d_pick2, d_pick1_to_station, d_pick2_to_station, d_put1, d_put2, g_pick1, g_pick2, g_put1, g_put2, g_put1_to_station, g_put2_to_station, redmark1, redmark2, s_empty, s_ready };