|
办法1:从2016版本里面复制相应的代码+ D2 n+ B3 ~9 g2 }- V1 L7 f. B
. U4 T2 t( b# }8 j9 m具体代码如下:' ]/ N' t+ y) q$ \! P- B! f
- treenode agv = param(1);* u' h2 c+ g' ~8 L- c* f
- treenode currentCP = param(2);! R7 A* b) n k1 z7 P
/ O# M" @. Q' \ c" f, v3 ~- { //************* PickOption Start *************\\" B* Z7 r8 ?4 S8 ~& V
- /***popup:AGV_DivertToElevator*/
+ r- o( @0 P O - /***tag:Description*//**Divert to Elevator*/; O9 `: m3 e: Q
- ' L0 ^8 {+ T; P4 \5 w0 ]
- int operation = param(3);
; m3 c( m2 L# A; ?5 @ - ( ~8 ?# w7 L! Y& C9 C3 S
- #define AGV_LABEL_NAME "fs_AGV_Elev_State"
2 S% w. y* `4 k7 q - if (operation == 0 && !objectexists(label(agv, AGV_LABEL_NAME))
% P2 F5 h2 t: B3 W) L - && (/** \nCondition: *//***tag:Condition*//**/fabs(zloc(currentCP) - zloc(agvinfo(agv, AGV_DEST_CP))) > zsize(agv)/**/)) { // if it's a pointer, then do the initial case) V( t4 D" p; ^2 m2 v
- // initial trigger execution
) n1 i5 k6 |2 T5 p" `: F) _! r - #define ON_ELEVATOR_START 1
! E+ r8 h, s n" q! q. L, D - #define ON_ELEVATOR_PICKUP_ARRIVAL 2( A* ?' v6 S# M: t
- #define ON_ELEVATOR_DROPOFF_ARRIVAL 3
y1 k$ S' v9 F8 X - #define ON_AGV_AT_CP 46 @8 K* {( N3 Y+ l
- #define ON_BOTH_AT_PICKUP 5/ f4 f9 g, |9 I3 i4 |4 w5 |' V
- #define ON_OPEN_DOOR 6
2 m1 Q9 Q5 \2 Y9 A( ?! } - #define ON_CLOSE_DOOR 7- e. H4 P4 g) ?1 k; z7 C) G1 J
- #define ON_PICKUP_DOOR_OPENED 8/ M& X- _) [- a+ _; g. A
- #define ON_PICKUP_DOOR_CLOSED 9
. x& A1 f( ^$ l/ Q$ n2 W% r - #define ON_DROPOFF_DOOR_OPENED 10
) ` S9 ]& k' t6 x; Z! Y# Z, s% ^! Q - #define ON_DROPOFF_DOOR_CLOSED 11 G- P: f' n4 c; l( [
- 2 ]( n1 H' O I! q# |8 t
- #define AGV_STATE_START 0$ J! `+ F( `" `9 `( Y* H6 M+ C$ @
- #define AGV_STATE_AT_ENTRY_CP 1
6 I' _( _, \( t; r& s" D# _ - #define AGV_STATE_AT_ELEV_CP 2# z* P. J, r6 z! }+ s
- #define AGV_STATE_AT_EXIT_CP 3: w2 o4 k, ^+ {9 i$ L# `% g/ K
- 6 A0 x( b. J) B( m* M2 z& W
- #define ELEV_STATE_NONE 0
, l% B' H5 q+ T8 j3 l2 d, g# q - #define ELEV_STATE_AT_PICKUP_FLOOR 1- J5 G* ~ U. M8 `" ~% v
- #define ELEV_STATE_OPENING_DOOR 2
/ Q; J/ W9 ]: i" D! N, e# L - #define ELEV_STATE_DOOR_OPENED 3
, |/ K$ T0 k! I1 O( F" ]! S& c( O - % T+ p, R) y# D3 r) P# _: N
- ! Q, b& W. a. {& V: W! A1 O
- treenode elevDisp = /** \nDispatcher: *//***tag:Dispatcher*//**/cpconnection(currentCP, "Elevators", 1)/**/;
) k1 }2 D2 d9 g/ k' @6 \ - #define elevator outobject(elevDisp, $iter(1))' `% \7 ~8 G- h; T) ^' L( Q6 p/ }2 w
- % W( ~$ K9 b7 k1 y6 n4 K
- if (!objectexists(elevDisp))! @' O( H/ E: o- r$ s0 r0 w; N
- return 0;
# v/ T$ i+ b% i
, L1 b" z: U- p- if (/** \nDo Search: *//***tag:DoSearch*//**/1/**/) {# L1 G& {) D# R' e5 x/ K& O, M( {
- query(
2 Q* S8 Z. p% H7 x& Q! B0 U - /** \nFull Query: */7 o" Y6 d- W: o' D$ S) J
- /***tag:FullQuery*//**/"SELECT $2 AS Elevator FROM $1 Elevators WHERE $3 ORDER BY $4 ASC LIMIT 1"/**/,
) k# ]& U3 M0 g6 g - nrop(elevDisp),
' N! C7 [$ P* a) B/ A - elevator0 S9 Q9 L3 [7 l) T
- /** \nWhere*/4 I$ L, ]" H* L. A) |
- /***tagex:WhereParams*/,/** \n*/ /**AND*/ /** */ /**/getstatenum(elevator) == STATE_IDLE /**/
" z# W. x0 V+ p8 n - /***/( L$ n5 [5 Z V! u
- /** \nOrderBy*/
. }) R3 ?" |9 d* E1 [- X1 G! U - /***tagex:OrderByParams*/,/** \n*/ /**/fabs(zloc(elevator) - zloc(agv))/**/ /**ASC*/
' g9 Q6 N& A! e) x( y( U - /***/);
: Z; B S* v1 Z2 i9 Q3 f% f: v. Z
$ N* F7 ^& S; ?1 e/ _) M# q* T- if (getquerymatchcount() > 0)1 l( p$ b3 `" m
- elevDisp = getqueryvalue(1, 1);
2 J- w B: w* Q! g, S+ r - }) L3 |9 E" q' W9 t( Q! p2 y8 Q2 O
- if (!objectexists(elevDisp))
2 R; k+ g3 k) k* `6 l- ?" @1 ? - return 0;
: F" x+ A2 ~* F+ D* b& T! G - treenode destCP = agvinfo(agv, AGV_DEST_CP);7 O3 V& H+ T1 c% _& p& N" w$ T
8 u% k! c7 N8 u5 V3 h% N- agvredirect(agv, /** \nDivert Point When None Available: *//***tag:WaitDivertPoint*//**/currentCP/**/, REDIRECT_AND_WAIT);8 U' O7 J" }: F2 m6 f5 C) x5 \9 D6 S
# y! _/ A0 q7 a/ E! t O- // Create the task sequence for the elevator$ q. C- P; E9 j/ K! |6 D
- double destZ = zloc(destCP); s d" _' c. W1 L1 ^' q+ C0 L3 n
- treenode ts = createemptytasksequence(elevDisp, 0, 0);
8 B6 {1 v# E' P3 i( ]& n - inserttask(ts, TASKTYPE_TAG, agv, destCP);
9 O8 p; y# T' e7 v0 w& i$ k - // immediately when the elevator starts the task sequence, I call ON_ELEVATOR_START
7 `2 r9 j4 o7 ^ - inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_START, destZ);' K! r$ Z& u8 W, n
- // travel to the z location of the current control point
( @, q" O1 {+ ~' C. L! E, v - inserttask(ts, TASKTYPE_TRAVELTOLOC, 0, 0, 0, 0, zloc(currentCP));
) r2 W0 \) [2 h9 n6 @ - // then call ON_ELEVATOR_PICKUP_ARRIVAL
; D1 U' j" ?/ o' h$ Y; B - inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_PICKUP_ARRIVAL);
/ o. @# i9 A2 {8 j! k. M% u - // then wait for the agv to get on q+ ^+ q7 ~( s2 W, z; _- [
- inserttask(ts, TASKTYPE_UTILIZE, agv);
6 `8 V, k6 L: ~, h/ Y# d/ k' ] - // then travel to the destination z location
, n+ v! H2 E, L0 [7 t1 I; c - inserttask(ts, TASKTYPE_TRAVELTOLOC, 0, 0, 0, 0, destZ);
1 W. |; M$ E- p- \0 M" v - // then call ON_ELEVATOR_DROPOFF_ARRIVAL! p; W" \4 @) t$ f
- inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_DROPOFF_ARRIVAL);
: `; Q! t" S5 E+ n! ]! p2 }" y - inserttask(ts, TASKTYPE_UTILIZE, agv);
/ v8 q! p7 F s* z - dispatchtasksequence(ts);
9 @/ @( ]3 `0 C- E% P% N- q; V+ w - } else switch (operation) {
A- K& D* j6 K9 t& d/ _6 \) I - case ON_ELEVATOR_START: {' y2 ]$ _ a( b0 c; T Z4 K7 H F
- // this is fired when I get a valid elevator
1 p6 i5 U+ p- t+ |7 h4 j) B8 _ - treenode elev = param(1);
l$ U e0 F3 y% G0 R# j* }9 {& m - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);
B, C6 m. a1 [ - ) Z+ P' S: D/ P+ h; L3 q6 }1 _4 Z
- // find the closest floor control point; S* K' Q B9 Q# o
- int floorCPCon = cpconnection(0, /** \nFloor Control Point Connection:*//***tag:FloorCPs*//**/"Destination"/**/, 0);
) j* S5 q. |6 m - treenode curFloorCP = findmin(cpnumconnections(elev, floorCPCon), ) I+ g2 i5 ]; W6 ]( H! Y5 {
- fabs(zloc(agv) - zloc(cpconnection(elev, floorCPCon, count))),% q Y- e3 g! F d* Q
- cpconnection(elev, floorCPCon, count));5 E! ~# J* W* V" l. T5 P
- // return if there is none" m3 q+ n% C. r" u% E# b# [0 C
- if (!objectexists(curFloorCP))6 c2 a$ P$ Q4 q: t6 _6 N
- return 0;
$ l1 E4 {3 r. A2 H5 j - ' D! p6 p1 ]" l' d9 r
- // get the entry control point
5 O- t* `& M% d9 F: W - treenode floorCP = curFloorCP;0 p4 |; M1 M3 B b
- treenode curFloorEntryCP = /** \nEntry Control Point: *//***tag:EntryCP*//**/cpconnection(floorCP, "EntryCP", 1)/**/;
1 D5 u) a3 Q. I0 c0 D - if (!objectexists(curFloorEntryCP))7 ?1 F B& F+ h, u0 q
- return 0;
8 V/ o# |1 _( n& `: p. {6 g; j0 E - treenode floorEntryCP = curFloorEntryCP;
4 }( U- {0 l; d2 }' ^+ K - treenode curFloorElevCP = /** \nElevator Control Point: *//***tag:ElevCP*//**/floorCP/**/;
- p1 T% D/ x) O0 n3 [! b! } O - if (!objectexists(curFloorElevCP))
+ M6 _/ X! |# o- K - return 0;
1 U$ A2 d1 }7 U9 ~0 }5 Z3 G
2 Q( M c* }9 K% t9 L: A9 G" Z- double destZ = param(4);7 `# V4 h a. n, m" W
- // find the floor control point closest to the destination floor7 ~8 i; e, J" ~) h+ Z4 C/ e. a
- treenode destFloorCP = findmin(cpnumconnections(elev, floorCPCon), & Q; z% H( M2 m+ v5 u8 a
- fabs(destZ - zloc(cpconnection(elev, floorCPCon, count))),6 D& B8 q8 D% ?9 U
- cpconnection(elev, floorCPCon, count));4 @4 E' i( |; V4 G& b, c, m
-
- o; u. T, f+ L# O2 n" s1 M - floorCP = destFloorCP;
. z% L, W7 R* E- A: g - treenode destFloorElevCP = /** \nDest Elevator Control Point: *//***tag:DestElevCP*//**/floorCP/**/;9 p5 }2 `5 q5 b* ~
- if (!objectexists(destFloorElevCP))
$ I, a q! w& x! M! k) D( c) x( ` - return 0;- j r8 U8 ~& e
- // get the destination exit control point
. T" H& b" W' K P - treenode destExitCP = /** \nExit Control Point: *//***tag:ExitCP*//**/cpconnection(floorCP, "ExitCP", 1)/**/;
$ E K* [% Y0 z2 S$ h4 ^ - if (!objectexists(destExitCP))& a) s8 h$ u* F4 e2 M8 `
- return 0;4 Z) c) B" W! _9 `, |$ h
- # T3 U; }1 a8 C! j1 o9 h
; }, ?+ ^, }) O' o( o/ Y- // add a listener for the agv. This will call this nodefunction in the ON_AGV_AT_CP section whenever the 5 X& x) V* s0 n
- // agv arrives at a node. I keep a state on the agv's state label, and then increment it each time
1 {1 _2 M. L: Y - // the listener is called so I know which control point he's at, i.e. entry, elev, or exit.
( @' B# ~, ~3 |6 B - agvaddlistener(agv, c, AGV_LISTEN_ARRIVAL | AGV_LISTEN_INTERMEDIATE_DEST," c3 J" | B. I/ m& L; \2 b+ W
- agv, elev, ON_AGV_AT_CP, AGV_LISTENER_PARAM_NODE);
3 p8 M2 i7 {% M5 e6 Z -
! S( X" P; j( ~& s$ X' d) p - // set the data on the state label
9 Y% @8 ^! r+ ^2 I* X& l - treenode stateLabel = assertlabel(agv, AGV_LABEL_NAME, DATATYPE_NUMBER);
- F- ?- z( [2 u" H$ ~ U* n - switch_destroyonreset(stateLabel, 1);
+ [ |3 c4 x& M2 S; {( d& J - set(stateLabel, AGV_STATE_START);
8 ?9 I+ F$ k+ n N! s0 i - set(assertsubnode(stateLabel, "ElevState", DATATYPE_NUMBER), 0);- Z: r4 I# C: b
- nodepoint(assertsubnode(stateLabel, "ElevCP", DATATYPE_COUPLING), curFloorElevCP);
& {5 J8 {7 B6 b0 X3 K: U* C8 c' ` - nodepoint(assertsubnode(stateLabel, "DestElevCP", DATATYPE_COUPLING), destFloorElevCP);5 V' q8 h2 V+ x# u- w a
- nodepoint(assertsubnode(stateLabel, "ExitCP", DATATYPE_COUPLING), destExitCP);% v: e# J# s- q
- agvredirect(agv, curFloorEntryCP, REDIRECT_AND_WAIT);9 a1 r* H8 P! i+ V( o# N7 e/ f( i' x
- return 0;8 s6 G6 z% f" s0 r# f
- }/ G' @+ ], {9 k( b' _: `. k6 ~: @
- case ON_AGV_AT_CP: {2 A2 i% C- g- u. Q
- // this is fired by the agv listener every time the agv arrives at a node.. R. G9 X0 j' V$ a( j1 ~) Q. j8 r- L ^
- treenode agv = param(1);5 k/ P7 j( G- o9 y
- treenode elev = param(2);
% M8 H6 z, ~6 R6 J6 p, g - treenode stateLabel = label(agv, AGV_LABEL_NAME);
: C2 B+ ^6 t3 H- f6 z( J - // I increment the state label, and then switch on it! V4 w% U5 n; Y" I0 s3 D
- inc(stateLabel, 1);
+ i2 b7 r. d1 O8 D, v - switch (get(stateLabel)) {) j5 g: W+ j4 E; z7 k& b! J
- case AGV_STATE_AT_ENTRY_CP: {; z; \, F# P$ n( C4 [. q
- // the agv just arrived at the entry cp
! w. n d( B; I4 W0 e - // so, figure out where the elevator is.
$ j0 i L3 {+ b. O" b5 u - int elevState = get(node("ElevState", stateLabel));
9 A$ t p/ Q1 W& f q. P - // if he's at the pickup floor with his door closed then open the door.2 W7 Q( g# C5 n' U1 U6 g# Q6 P! A
- if (elevState == ELEV_STATE_AT_PICKUP_FLOOR)1 T7 r B/ R7 P# W0 g1 J& q+ ~5 A
- nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_PICKUP_DOOR_OPENED);; z' o6 }$ h; M8 b' t/ W+ `& A
- else if (elevState == ELEV_STATE_DOOR_OPENED) {
) Y0 v* m# q! R7 d& T0 K - // if his door is alread opened, then move the agv onto the elevator, i.e. to
" A6 {5 h7 D# `! |7 T8 ^( s# [ - // the elevator cp
: W {. \! f1 S: f8 J - treenode elevatorCP = tonode(get(node("ElevCP", stateLabel)));0 T' K% w% f9 ], b- W
- agvredirect(agv, elevatorCP, REDIRECT_AND_WAIT);/ z9 y/ ^6 f9 P9 j
- }9 R5 V3 n9 Y& w# K$ j/ |
- break;: r' s2 ]2 G! u" C s5 `9 H
- }, v7 F+ C& f9 K. w/ n: t
- case AGV_STATE_AT_ELEV_CP: {: c1 `# }8 J9 j4 P! o5 l: w' a9 i7 u
- // once the agv is at the elevator cp, close the door7 ~ o/ i& F: k: ?9 t' Y
- nodefunction(c, agv, elev, ON_CLOSE_DOOR, ON_PICKUP_DOOR_CLOSED);6 E( E: J& A. G
- break;- G1 M7 R0 D% W8 ?0 h
- }+ w# x/ v( ~( C- _' p6 N( s) C" F9 e
- case AGV_STATE_AT_EXIT_CP: {
+ B' x$ i% l3 Z0 C2 m, \" Z: a/ \( E - // the agv is at the exit cp! v! g" a8 X$ T$ C
- // destroy the listener node because I'm finished listening
" ?, N+ ]+ e/ d3 Q! n2 G7 ]: j0 [ - treenode listenerNode = param(4); ]$ p% x D, g9 `4 |8 S
- destroyobject(listenerNode);$ v* m; Z0 Q5 x! H" P# D7 }% p
- int agvWait = /** \nWait On Door Close: *//***tag:WaitFinalDoorClose*//**/0/**/;
+ X) q2 ?0 p9 {) w5 f% ^ - if (!agvWait) {. N8 m( m% C+ s4 O
- // if the agv is supposed to continue on, then tell him to go to his final destination$ q' C! r2 E$ J) f
- treenode destCP = gettaskinvolved(gettasksequence(elev, 0), 1, 2); f7 G: D' `/ V; ?, M
- agvredirect(agv, destCP, REDIRECT_AS_FINAL);+ z3 \7 L' W9 t* v
- }/ j; ?! z! M: @. i6 {( P
- // close the door
+ Q$ Q$ e# I' X2 @" z6 i) r - nodefunction(c, agv, elev, ON_CLOSE_DOOR, ON_DROPOFF_DOOR_CLOSED, agvWait);' l" `: K) a. A- N- N4 M
- // and I'm finished with the state label so I can destroy it.! s8 D. h0 g/ b7 k# D
- destroyobject(stateLabel);
. U$ L0 ?- @* O2 K& C9 u3 A - break;+ f9 B/ y/ n' k# S, `4 L
- }
& G# h/ ^' [. y3 U - }( r: _9 N8 a/ b
- return 0;# X) Y; E" w& Z7 V) ~! m
- }
, z, B8 B4 w( _; R* x) F6 a - case ON_ELEVATOR_PICKUP_ARRIVAL: {
, g" r8 x7 V! i" F& ` - // the elevator has arrived at the pick floor3 x2 q) ~+ I7 L& Z' _0 Z
- treenode elev = param(1); M" t& L5 W' W$ z# \" ]' |
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);/ q+ O+ m: I" p. z% _/ w- a
- treenode stateLabel = label(agv, AGV_LABEL_NAME);
, r/ y9 h2 H! y0 @" Z6 d; w - treenode elevState = node("ElevState", stateLabel);
% A+ z8 e7 S9 w: w+ D$ | - // set the elevator state to at-pickup-floor
) d# R3 p5 w+ |7 Y5 J& f4 y f" Z2 Q - set(elevState, ELEV_STATE_AT_PICKUP_FLOOR);) G9 D; n" L3 p& |' U/ G" L3 L
- + T# L% a! K" L. s
- int openDoorImmediately = /** \nOpen Elevator Door Immediately: *//***tag:OpenDoorImmediate*//**/0/**/;* I$ |* n+ Z( c2 H# t: z! F0 X
-
! c; j, V C$ w) ~$ v8 x: n - // if the agv is at the entry control point or I open the door immediately, then open it. H, \1 C; E) t! a3 r1 Y
- if (get(stateLabel) == AGV_STATE_AT_ENTRY_CP || openDoorImmediately) {
2 K$ ]$ Q& \5 D/ z - set(elevState, ELEV_STATE_OPENING_DOOR);
" H3 n% [ X. N - nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_PICKUP_DOOR_OPENED);
3 J _2 \( W1 ^0 W - }
5 Z7 v3 y9 A `+ x% l6 P - return 0;
" e: G: ?( _7 ~% A. _! e( x3 s - }7 x3 f; \( ]$ R: }: O7 q E+ F4 }
- case ON_OPEN_DOOR: {" k1 q F1 d: ]( O
- treenode agv = param(1);3 r% ?& u" x" L0 _* v& F0 @. K' X
- treenode elev = param(2);
% s7 d# X @, W% z( y; ^$ B3 N - int nextStep = param(4);
4 Z# ?9 G" v& k% G( A% P - // open the door based on the time to open the door8 U1 j) `# @+ f+ o# c0 V' J
- double openDoorTime = /** \nDoor Open Delay:*//***tag:DoorOpenTime*//**/5/**/;, k9 T& V8 l' Y$ W$ d# J; j9 u
- delayednodefunction(c, openDoorTime, elev, agv, nextStep);
6 T6 y2 _5 a* q% `% R. I8 M, O3 X9 Q - return 0;
: ]& k3 r/ [6 [. r - }* E- \% t1 V" \0 t( g
- case ON_CLOSE_DOOR: {
# n! k; C( F/ \, k& b" B) r: O - treenode agv = param(1);, v! i" p. W4 U. x
- treenode elev = param(2);
( D% p0 b3 S: ~( Z! e - int nextStep = param(4);
& X3 p4 O- f. G- q - // close the door base on the time to close the door
' K$ Z3 J( Q" y5 [ - double delayTime = /** \nDoor Close Delay:*//***tag:DoorCloseTime*//**/5/**/;1 t4 W4 I3 M. z# r
- delayednodefunction(c, delayTime, elev, agv, nextStep, param(5));) G) _# }( O4 A. m3 S( T
- return 0;
9 I2 d5 j# Z& I' v' n( D - }5 z% Z8 k# E% X+ m" A" y
- case ON_PICKUP_DOOR_OPENED: {
: e% }8 T0 P7 G. h* h' V5 q - // the elevator door has been opened on the pickup floor, p& z X8 V" z2 A' l S* Q0 ]
- treenode elev = param(1);
+ t" L! q9 }1 s/ v! F1 k - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);+ y/ h# u [' T
- treenode entryCP = cp(agv);
6 X1 g$ \$ }* G+ } - treenode stateLabel = label(agv, AGV_LABEL_NAME);
" s4 L$ J X1 O$ I( w; a3 w - treenode elevatorCP = tonode(get(node("ElevCP", stateLabel)));
8 k% \( T" o6 ^ e - treenode elevState = node("ElevState", stateLabel);
7 b5 @8 [; e2 S/ a5 i: j - // set the elevator state
/ n- b9 I3 o4 t, ` - set(elevState, ELEV_STATE_DOOR_OPENED);9 n3 J) D- _* O
- // if the agv is at the entry control point, move him to the elevator control point
4 T+ }1 t3 y I+ f& u2 q) n/ _- @ - if (get(stateLabel) == AGV_STATE_AT_ENTRY_CP)1 H/ m0 z5 H* X6 A$ u+ y1 C+ b9 Y
- agvredirect(agv, elevatorCP, REDIRECT_AND_WAIT);
. ~6 X# _! z0 p - return 0;( a) Q3 E3 g: w& }) Q7 L6 H8 H
- }
2 Z! b8 p1 A# X& J9 I: N - case ON_PICKUP_DOOR_CLOSED: {6 q/ j8 ] |* h; B2 y+ W
- treenode elev = param(1);$ X- S0 n7 o+ G
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);* N! J! }; `( j" x. F9 I
- // assign the agv to "no control point"
+ R; t% t+ Z8 s0 | - agvreassigncp(agv, 0);! h+ j* B4 i/ |6 m
- // move the agv into the elevator
5 l3 ~( l* g4 T( h7 ]0 L8 C4 E' ^ - moveobject(agv, elev);( i" l5 v: b. a
- setrot(agv, 0, 0, 0);
* Z4 T1 Q N5 G8 E% T. R/ j% D# }+ ~( `; [ - // release the elevator to continue to the destination floor4 U& m: W& g! ~
- freeoperators(elev, agv);* y) ~% k% V; }( g5 U
- return 0;
/ _3 ^1 l9 S0 F7 ~) r2 p1 v( b - }4 ^+ h7 I0 D' \0 i1 B4 j( v; Z
- case ON_ELEVATOR_DROPOFF_ARRIVAL: {
9 P3 f- l; r7 {# x9 N7 I - treenode elev = param(1);$ L0 a& O M. A' G: F0 H9 P
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);: G- l. V! X9 C1 @- q& x5 w
- // when the elevator arrives at the destination floor' i0 S, U) l0 o) A
- // move the agv back into the model
2 p8 h7 H( o9 r' ]7 W) C* n1 ? - moveobject(agv, model());1 t( ~, G/ ~' m9 z
- // reassign it to the destination floor control point/ j$ t' z9 I- O$ B9 L
- agvreassigncp(agv, tonode(get(node("DestElevCP", label(agv, AGV_LABEL_NAME)))));
5 [# g* }5 a$ T% Z: X5 t3 I$ A9 A - // open the elevator door
! d% ?: A; x% V1 J% J4 x+ i8 Z5 b - nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_DROPOFF_DOOR_OPENED);) c& k6 f1 {4 U' r) L* A c% N
- return 0;
- |& f# o! W. t1 c - }- b* f- P5 s: g0 j, L
- case ON_DROPOFF_DOOR_OPENED: {) K" l) t: I y! D, V. L& W2 n _
- treenode elev = param(1);
" K3 O, E. \' X# y - treenode agv = param(2);
* e: [3 t l1 P0 W6 O. x - treenode agvLabel = label(agv, AGV_LABEL_NAME);
- H/ p$ Z+ @' v - // once the elevator door is opened on the destination floor, " G, w, i4 H: V1 C
- // redirect the agv to the exit control point2 J4 B) B' G: ?% U6 V& ?/ A
- agvredirect(agv, tonode(get(node("ExitCP", agvLabel))), REDIRECT_AND_WAIT);7 V8 A/ C( n" N2 L
- return 0;
8 J( ?' ~, a& A0 z7 } y - }& V6 f) E4 j; u$ g, L" h
- case ON_DROPOFF_DOOR_CLOSED: {
# k3 W! I' o" Y2 ^" w/ b - treenode elev = param(1);" l6 V' r* j2 u$ H
- treenode agv = param(2);! H) I" Q# v1 c/ w! k1 [3 c
- int isAGVWaiting = param(4);6 N3 ^# L ] ~+ E
- // once the door is closed at the destination floor,
7 G; J/ B# S; W8 q G6 V# k - // if the agv is waiting, then send him to the final destination) A1 ?" Q" x! z; W( Z+ k! r
- if (isAGVWaiting)6 v- E( B- v1 g/ h. c- a
- agvredirect(agv, gettaskinvolved(gettasksequence(elev, 0), 1, 2), REDIRECT_AS_FINAL);
1 u" K) ?) v" s0 H9 g; K8 K - // release the elevator to finish his task sequence2 [+ R* G$ {8 S% o6 L: K2 K2 s' o
- freeoperators(elev, agv);3 b% l3 g: A/ ~: Y0 L- s8 I% F
- return 0;
* e; _( F* a$ J. t - }
: h# Y' U) t! i: \1 a; w - }
9 m1 h. v' I7 G s% K# l) ^' ^8 e - } //******* PickOption End *******\\) D# W1 ?8 l; j, K! g* s3 }1 W
8 v; R) x9 M. F3 W1 K
复制代码 - C! w& ?3 p' k9 W# @! J ^
' N9 U0 W# ?2 g+ P# a4 p
+ q0 \! d6 k- I C y9 w! m. P办法2:使用工艺流程模块完成 |
|