|
办法1:从2016版本里面复制相应的代码$ [& A3 L' A5 l7 [% z
m( k' r2 F4 c& L+ J; h具体代码如下:7 u1 T+ o5 _! h' [+ y+ G
- treenode agv = param(1);5 ?9 N6 O9 V1 o4 e. Y0 G8 ]4 s
- treenode currentCP = param(2);) _7 i: k, @: @3 Q" A7 k6 E
- % y' q4 E8 A c N. C
- { //************* PickOption Start *************\\7 ]% N! q$ G. c( g2 v' @& y
- /***popup:AGV_DivertToElevator*/) B# S1 w: W% ~, x) s% |+ W
- /***tag:Description*//**Divert to Elevator*/' s5 g& Z! k" w4 ?
- 5 C4 `4 s O4 q
- int operation = param(3);. |3 K8 W; c+ d; q
- $ y" R5 e" ^5 T7 Y
- #define AGV_LABEL_NAME "fs_AGV_Elev_State"/ E1 @+ J7 c1 g; t
- if (operation == 0 && !objectexists(label(agv, AGV_LABEL_NAME)). h" m& @) K# I: `/ A2 j
- && (/** \nCondition: *//***tag:Condition*//**/fabs(zloc(currentCP) - zloc(agvinfo(agv, AGV_DEST_CP))) > zsize(agv)/**/)) { // if it's a pointer, then do the initial case2 N* X& W. ^( \! a( e; s, g/ p. Y
- // initial trigger execution
5 Q* q8 \* b! L8 y4 N - #define ON_ELEVATOR_START 16 l" M8 w5 ] N! P( n/ D0 ?. u
- #define ON_ELEVATOR_PICKUP_ARRIVAL 2( G" p' [) @' j0 o
- #define ON_ELEVATOR_DROPOFF_ARRIVAL 3. r8 A1 p y9 R" t4 n7 @
- #define ON_AGV_AT_CP 4( M' r7 z: l5 {( w! v3 H1 x
- #define ON_BOTH_AT_PICKUP 5
! b8 l" S! `; `8 H: f4 I - #define ON_OPEN_DOOR 6 @, ^! x* I! E' {, O
- #define ON_CLOSE_DOOR 7
1 n! V4 {. ^ i" g - #define ON_PICKUP_DOOR_OPENED 89 h" |5 E* A- Q5 U' F/ j0 l- Z
- #define ON_PICKUP_DOOR_CLOSED 9/ P* `5 e3 b2 i
- #define ON_DROPOFF_DOOR_OPENED 10
0 r4 |3 i1 `5 c& Q+ O - #define ON_DROPOFF_DOOR_CLOSED 11$ ~" h# [8 M( @. o, p" V
-
. |, M7 A5 |" t/ O - #define AGV_STATE_START 0 I: e' ?- d* G& P% H3 }8 I
- #define AGV_STATE_AT_ENTRY_CP 1
/ O0 t K; p5 U! [0 O - #define AGV_STATE_AT_ELEV_CP 23 z+ F9 y$ \; ^8 i- y
- #define AGV_STATE_AT_EXIT_CP 3. d8 D5 M2 n8 o7 P% ?" a# p D9 y
-
: b! a% v0 P5 _$ J - #define ELEV_STATE_NONE 0+ A4 R7 p9 V9 U
- #define ELEV_STATE_AT_PICKUP_FLOOR 1* I1 q0 W [3 N4 b9 t
- #define ELEV_STATE_OPENING_DOOR 2! U# g9 R/ D( ]. j& y1 D/ Y
- #define ELEV_STATE_DOOR_OPENED 3
4 V& U& ~" _" {2 J- P8 Z: w - 3 o( w) a, H8 N
6 O; o3 h8 Q/ L9 l- treenode elevDisp = /** \nDispatcher: *//***tag:Dispatcher*//**/cpconnection(currentCP, "Elevators", 1)/**/;
: m/ y/ r$ {) J X - #define elevator outobject(elevDisp, $iter(1))
7 M2 T0 z( S: q L - ! r- y7 {/ s5 s% X+ w1 s- x( m4 T
- if (!objectexists(elevDisp))
' r* b d) h; I7 |/ N7 l - return 0;- S _9 T* E, [- i) C2 i
z& c) L0 X$ h0 ?$ s' w; p- if (/** \nDo Search: *//***tag:DoSearch*//**/1/**/) {
4 w6 ?; b3 |( Q! z7 h O! V' _ - query(
, E1 g, p5 A5 V# o - /** \nFull Query: */
/ k- L" Y) ^1 k1 k+ \, i9 I' Y: G - /***tag:FullQuery*//**/"SELECT $2 AS Elevator FROM $1 Elevators WHERE $3 ORDER BY $4 ASC LIMIT 1"/**/,
; a, f8 B) f$ F+ [8 b* y6 J - nrop(elevDisp)," I& }4 |9 E" |2 I
- elevator% ?+ d# l$ { `* r2 m
- /** \nWhere*/% y, _( y/ e+ \
- /***tagex:WhereParams*/,/** \n*/ /**AND*/ /** */ /**/getstatenum(elevator) == STATE_IDLE /**/6 G4 e4 V- f6 y$ \- ^4 G/ |
- /***/
' Y1 s* v5 U7 w, R* E9 @/ H - /** \nOrderBy*/
& M4 {8 v0 [5 A/ l) S$ \ - /***tagex:OrderByParams*/,/** \n*/ /**/fabs(zloc(elevator) - zloc(agv))/**/ /**ASC*/2 B0 r* T8 n8 X% U4 ~! f
- /***/);. `/ L2 Q) y& ?9 J' d" g8 y
- , v( u7 L/ ~8 N6 N' j
- if (getquerymatchcount() > 0)9 m+ N$ C9 X) f" Q5 e; i
- elevDisp = getqueryvalue(1, 1);
7 f0 M6 j: y, {1 w, m; M - }
5 |- q. Y$ `3 ~" I. A0 j+ _ - if (!objectexists(elevDisp))6 x. i# t5 C' p H8 f
- return 0;
% Q( z1 a. [! g& w* Q/ m7 Y - treenode destCP = agvinfo(agv, AGV_DEST_CP);0 N7 K2 L8 l7 l" r
- # u( w6 L4 ~) i! x. e
- agvredirect(agv, /** \nDivert Point When None Available: *//***tag:WaitDivertPoint*//**/currentCP/**/, REDIRECT_AND_WAIT);
% o. C; k# I+ e" l* E) Q/ \' X5 w
! A# _5 e/ B. D' W) K- // Create the task sequence for the elevator: a& }/ j) k G9 u% I
- double destZ = zloc(destCP);
: l" n! h+ u$ r7 f$ ^ - treenode ts = createemptytasksequence(elevDisp, 0, 0);: P: l) W; H: B/ Z9 M
- inserttask(ts, TASKTYPE_TAG, agv, destCP);
, Z1 B9 X5 ~9 D! R* w - // immediately when the elevator starts the task sequence, I call ON_ELEVATOR_START% a8 b: e. h/ ~/ j; Q7 N/ w
- inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_START, destZ);) x( r& c; Q( H0 N# d
- // travel to the z location of the current control point. o! B( a3 L/ G3 S8 {% G
- inserttask(ts, TASKTYPE_TRAVELTOLOC, 0, 0, 0, 0, zloc(currentCP));
# \4 q% @2 Z, G5 b2 C) r1 } - // then call ON_ELEVATOR_PICKUP_ARRIVAL
6 C5 \1 U* Z) L8 L1 H: x4 B - inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_PICKUP_ARRIVAL);
/ }2 W" C* ~! P+ k - // then wait for the agv to get on$ ?$ ?! T7 V( }; I; A" Z
- inserttask(ts, TASKTYPE_UTILIZE, agv);
5 g1 d7 S; v+ M7 U - // then travel to the destination z location
( J @( G0 S8 @" m, y3 D- X - inserttask(ts, TASKTYPE_TRAVELTOLOC, 0, 0, 0, 0, destZ);
. b; V1 C% Q; K9 M. Q1 C4 E - // then call ON_ELEVATOR_DROPOFF_ARRIVAL
" {7 R V! n4 B2 p; g2 c - inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_DROPOFF_ARRIVAL);% @% a; [; y* O& K( t% a# V7 M
- inserttask(ts, TASKTYPE_UTILIZE, agv);
8 M# n6 ?6 D+ _8 b7 p/ x5 z$ D: W - dispatchtasksequence(ts);5 H9 [# T( `- g
- } else switch (operation) {' F( \) A! c$ P v9 o5 p1 d
- case ON_ELEVATOR_START: {7 K* a, _% d- K f8 X
- // this is fired when I get a valid elevator
, C* K9 e1 u. J! ? - treenode elev = param(1);1 ~6 Z( U& p" h- i1 _# Y
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);
6 w8 r) r% z! J0 O5 r - , i2 L8 A0 P' ^
- // find the closest floor control point3 ] ^* x8 n% a& K: { r! X
- int floorCPCon = cpconnection(0, /** \nFloor Control Point Connection:*//***tag:FloorCPs*//**/"Destination"/**/, 0);
& @3 i% z7 ?4 K w - treenode curFloorCP = findmin(cpnumconnections(elev, floorCPCon), : W5 @7 U d, Y; X' [
- fabs(zloc(agv) - zloc(cpconnection(elev, floorCPCon, count))),
( K- Z( h0 X8 f; C - cpconnection(elev, floorCPCon, count));
t6 [ M' Z# c) g1 g - // return if there is none
% g! E; C( g: ^0 B+ z* s - if (!objectexists(curFloorCP))9 _0 r5 W% S* c. k* T! B; t5 T
- return 0;* Z8 _/ |* L6 j3 @
) A; |7 K9 U2 @9 ?% _0 ^; K" E. t- // get the entry control point
8 c% K; z% k- V I8 S1 m5 W - treenode floorCP = curFloorCP;
# l( ]* W. a; y1 c3 c - treenode curFloorEntryCP = /** \nEntry Control Point: *//***tag:EntryCP*//**/cpconnection(floorCP, "EntryCP", 1)/**/;7 C5 n$ S/ j4 b( C9 e, e. \( k
- if (!objectexists(curFloorEntryCP))
4 `+ U% x( q) e& R - return 0;
r! j3 n( Q2 {/ C - treenode floorEntryCP = curFloorEntryCP;0 i& V+ [9 K( e" J8 ]. y8 x+ s8 A5 a) r
- treenode curFloorElevCP = /** \nElevator Control Point: *//***tag:ElevCP*//**/floorCP/**/;
: i" a$ q* m$ J - if (!objectexists(curFloorElevCP))
* Q+ ~1 ?0 d5 `2 D& r% B - return 0;
3 C8 W- f+ F; V" }! ] \
/ l1 A* M& ]1 d! a, v- double destZ = param(4);2 q6 Z# y, W# `9 G# `5 j0 h
- // find the floor control point closest to the destination floor4 [: `& `8 S) S) b g. ^
- treenode destFloorCP = findmin(cpnumconnections(elev, floorCPCon), ) w' h, g) B; d1 y+ y
- fabs(destZ - zloc(cpconnection(elev, floorCPCon, count))),
4 \+ |. x1 i; g: G+ a$ {7 E( I - cpconnection(elev, floorCPCon, count));
+ A* _1 O3 l7 K - ) A7 c' n/ G" T+ O
- floorCP = destFloorCP;
+ U& B9 m9 k D$ G - treenode destFloorElevCP = /** \nDest Elevator Control Point: *//***tag:DestElevCP*//**/floorCP/**/;
3 n% b$ e* x8 o* v7 L - if (!objectexists(destFloorElevCP))5 k9 K$ H( d* ?& d* |
- return 0;
9 k1 l+ }! D, i8 b9 ^) X - // get the destination exit control point
: M* x8 Q) q, M4 g - treenode destExitCP = /** \nExit Control Point: *//***tag:ExitCP*//**/cpconnection(floorCP, "ExitCP", 1)/**/;
- O ~& p9 N6 L - if (!objectexists(destExitCP))
9 w+ @7 P0 I$ e5 s - return 0;- F3 w: f( l3 I7 a. Y) p
- & B$ P% t T8 o. |( ~
/ Q: ^9 {! k2 y; ~8 X- // add a listener for the agv. This will call this nodefunction in the ON_AGV_AT_CP section whenever the
' w1 A, Y9 f" t% U( C - // agv arrives at a node. I keep a state on the agv's state label, and then increment it each time7 C2 e9 Q( h- |- h4 X: a9 z. @& |
- // the listener is called so I know which control point he's at, i.e. entry, elev, or exit.0 z% V+ ?0 K$ G( x2 h5 p
- agvaddlistener(agv, c, AGV_LISTEN_ARRIVAL | AGV_LISTEN_INTERMEDIATE_DEST,
# c* F q, Q& W* i: i7 A) }- L - agv, elev, ON_AGV_AT_CP, AGV_LISTENER_PARAM_NODE);6 o: E g" G" d" s% y* J
-
0 s Q. B `, X2 s - // set the data on the state label
9 L. B" q0 [7 t) T& V# u | - treenode stateLabel = assertlabel(agv, AGV_LABEL_NAME, DATATYPE_NUMBER);
4 t8 {1 h" ]5 R: D - switch_destroyonreset(stateLabel, 1);
* j8 d( S6 U2 u& f - set(stateLabel, AGV_STATE_START);- G1 }. f! f. h. [' r
- set(assertsubnode(stateLabel, "ElevState", DATATYPE_NUMBER), 0);4 I" E/ L; R6 a! R7 z/ x
- nodepoint(assertsubnode(stateLabel, "ElevCP", DATATYPE_COUPLING), curFloorElevCP);
: u$ }$ {* {+ j2 [* P) d w; Z8 n$ @ - nodepoint(assertsubnode(stateLabel, "DestElevCP", DATATYPE_COUPLING), destFloorElevCP);
( T: F( [2 r: x7 q& f" ` - nodepoint(assertsubnode(stateLabel, "ExitCP", DATATYPE_COUPLING), destExitCP);; P0 h/ [- M% E/ H0 D, y- S
- agvredirect(agv, curFloorEntryCP, REDIRECT_AND_WAIT);
4 [) P2 F U& |- O# h: O6 E p( X - return 0;
' H4 R5 [! U8 H7 Q1 U3 s - }
- D1 T, ]% q+ {" O, A) M* T - case ON_AGV_AT_CP: {* y. @! _% I- `6 q+ A- U: n
- // this is fired by the agv listener every time the agv arrives at a node.
" ]1 l; o( _1 w* _6 Z2 m - treenode agv = param(1);
0 U+ \1 \/ N8 h t; c0 }) N1 x6 M - treenode elev = param(2);
( _8 r5 u+ S/ Y# ^ - treenode stateLabel = label(agv, AGV_LABEL_NAME);
6 r! C1 ? w2 c3 d( \1 o0 P% `0 A - // I increment the state label, and then switch on it
, @0 e! h+ G! r- ~% c - inc(stateLabel, 1);
, r6 ]0 S M# t I% w1 W - switch (get(stateLabel)) {/ r( j0 L; ^; [4 r, ~8 K, F: G
- case AGV_STATE_AT_ENTRY_CP: {# Q: Y9 v0 ~, m* X \! \
- // the agv just arrived at the entry cp
( k+ I- U% A" ^. p% G - // so, figure out where the elevator is.) I& q a: I7 k. W
- int elevState = get(node("ElevState", stateLabel));+ d! w; d4 d; F2 S/ e- o' g
- // if he's at the pickup floor with his door closed then open the door.
% j$ m+ D! o/ P+ n! `* ? - if (elevState == ELEV_STATE_AT_PICKUP_FLOOR)
0 T3 b: Q9 j1 x- e - nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_PICKUP_DOOR_OPENED);( \- N) c$ V: }6 S. |+ J2 V
- else if (elevState == ELEV_STATE_DOOR_OPENED) {
1 ?7 a6 g) y% d, N7 v - // if his door is alread opened, then move the agv onto the elevator, i.e. to& A4 V4 y& Q: ?0 T
- // the elevator cp& M2 X/ ~$ n+ h5 b1 r- S+ r; g
- treenode elevatorCP = tonode(get(node("ElevCP", stateLabel)));
) E, D' S F# I - agvredirect(agv, elevatorCP, REDIRECT_AND_WAIT);7 E9 c4 ]' T2 r5 i; `
- }
2 W& G& U, k; s3 C$ l" J - break;
$ e% r' [3 m4 l* Q& V _& _ - }
0 m3 e P) R" h - case AGV_STATE_AT_ELEV_CP: {! n, o+ d! ~: Y% f' t4 s
- // once the agv is at the elevator cp, close the door+ H. R" T* A+ J
- nodefunction(c, agv, elev, ON_CLOSE_DOOR, ON_PICKUP_DOOR_CLOSED);, }4 o5 i9 f! x) d
- break;
! O, V/ @9 b0 }( I; [ c7 k/ U9 Z - }! L/ V- J4 T0 U2 y9 t. g
- case AGV_STATE_AT_EXIT_CP: {
" I+ f7 ~" | i- V* j) p ~/ J - // the agv is at the exit cp
% p3 j- d7 I: C, M8 {& T - // destroy the listener node because I'm finished listening
. w% d n: l: f - treenode listenerNode = param(4);! o: F. {* h' a& M% ]% A9 g
- destroyobject(listenerNode);
& Z$ Q# H8 m+ Y& j- o! \ - int agvWait = /** \nWait On Door Close: *//***tag:WaitFinalDoorClose*//**/0/**/;
# x! e+ w: Q- q( n* H, C- V; p - if (!agvWait) {/ S1 Z+ t. J; u/ g ]
- // if the agv is supposed to continue on, then tell him to go to his final destination
2 A' k. P% e* B- p' a: |& B - treenode destCP = gettaskinvolved(gettasksequence(elev, 0), 1, 2);
6 D8 @% {5 U4 G& W! H - agvredirect(agv, destCP, REDIRECT_AS_FINAL);
( m! g* |" Z+ X- t, Z4 | - }; m. S0 M! b* N9 X8 K4 V0 s/ C6 ~
- // close the door" L5 A3 a( ~/ |
- nodefunction(c, agv, elev, ON_CLOSE_DOOR, ON_DROPOFF_DOOR_CLOSED, agvWait);
; y: G! g3 i' N - // and I'm finished with the state label so I can destroy it.8 ?& B1 k$ l9 {
- destroyobject(stateLabel);7 n7 I/ e7 S) n4 Y5 {# h
- break;( W/ Q3 w: q6 I( q% \# |- P$ }
- }1 m# A0 `5 a& h* u! ?
- }3 A+ H# n% c7 M( J Q+ i
- return 0;' v3 _) c! X1 j1 y5 Z* t4 G3 l) |2 t+ I
- }/ q4 W% T1 C: e$ Y) x$ K5 `7 t
- case ON_ELEVATOR_PICKUP_ARRIVAL: {
4 E4 _" h( B ^4 n5 b - // the elevator has arrived at the pick floor- w# ~, U+ y7 b+ S0 T
- treenode elev = param(1);
$ q K7 N, J [' j - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);: e p2 `5 o# P. k# J) Y
- treenode stateLabel = label(agv, AGV_LABEL_NAME);; t( C4 }+ D* I
- treenode elevState = node("ElevState", stateLabel);
4 g& C2 n" |: n* W - // set the elevator state to at-pickup-floor2 s4 ]( N @1 z0 T3 h: Y& m7 ]
- set(elevState, ELEV_STATE_AT_PICKUP_FLOOR);
# d& A3 `7 N+ _$ y - 0 Y/ n, t& p( a9 ?5 Z+ R: I
- int openDoorImmediately = /** \nOpen Elevator Door Immediately: *//***tag:OpenDoorImmediate*//**/0/**/;
/ n6 H9 g+ U8 V# X. ` -
2 Z- ?: r" R/ `: w8 C/ D; N - // if the agv is at the entry control point or I open the door immediately, then open it
: S, Z. n0 b, |; n) c: A) i - if (get(stateLabel) == AGV_STATE_AT_ENTRY_CP || openDoorImmediately) {
l( O' N; l; Z8 B - set(elevState, ELEV_STATE_OPENING_DOOR);* k+ E4 b7 |- m, @0 ~2 u3 v
- nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_PICKUP_DOOR_OPENED);2 R/ N$ q8 f+ ]% @! F" m1 s
- }6 [6 }8 \! |, g. N
- return 0;5 \' C8 }; F1 V9 ]. h
- }0 I3 \" ]6 F2 w
- case ON_OPEN_DOOR: {
' C" b* q4 `# [% }! @5 g - treenode agv = param(1);
, M) p8 R- ?3 T% }; q+ ^ - treenode elev = param(2);
7 Q0 B) z+ ?! C. y" r$ N6 | - int nextStep = param(4);
) J. y7 e$ w. f% `. c# k - // open the door based on the time to open the door, }. G8 o4 B' q& T' N0 s
- double openDoorTime = /** \nDoor Open Delay:*//***tag:DoorOpenTime*//**/5/**/;
- j/ |/ s q# X! A3 b - delayednodefunction(c, openDoorTime, elev, agv, nextStep);
`4 T8 o9 _/ I - return 0;9 I2 L' Y$ u7 V! S
- }/ @& y( [7 K( m. X# \! e- d* G
- case ON_CLOSE_DOOR: {4 q9 Y& I) H, G" N2 l1 M9 m
- treenode agv = param(1);
' F" R8 l* N! x1 g2 c1 p8 T - treenode elev = param(2);
4 t, v# Q) O$ B, _7 f9 u! Z2 ] - int nextStep = param(4);: _6 d6 _1 b+ M0 m# A
- // close the door base on the time to close the door# z1 j4 q ]. a5 U/ n* x& x! V
- double delayTime = /** \nDoor Close Delay:*//***tag:DoorCloseTime*//**/5/**/;
* c3 M6 N" s4 C, M) X8 H - delayednodefunction(c, delayTime, elev, agv, nextStep, param(5));1 k: \4 D6 s7 k# F) m
- return 0;0 z& l# d+ K+ g6 h) S+ Z
- }
( U+ s' m/ _* y6 Z0 q* } - case ON_PICKUP_DOOR_OPENED: {
% F2 W5 M6 l( A; q7 k - // the elevator door has been opened on the pickup floor
/ T: i/ r8 e+ K! W% m) W - treenode elev = param(1);1 f. Z& O( k5 I
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);% x: w& |* [" D7 u9 h/ B5 ?: }' X' V
- treenode entryCP = cp(agv);
, y8 v. p$ t7 W% T, s1 B5 B4 Q - treenode stateLabel = label(agv, AGV_LABEL_NAME);' e, f: U6 ?7 H! Q+ S- ]0 l( E
- treenode elevatorCP = tonode(get(node("ElevCP", stateLabel)));
7 {7 v( e- {' ^, J( k - treenode elevState = node("ElevState", stateLabel);
' N/ r; ^; s* g/ y6 Q' ?& L* n% n - // set the elevator state
$ |& m' {" c! U& A i: K4 g - set(elevState, ELEV_STATE_DOOR_OPENED);# `9 @& i5 e1 ]$ Z' a
- // if the agv is at the entry control point, move him to the elevator control point6 e1 D. m- B: v: C/ n, j. Z+ Z" B7 ~* H
- if (get(stateLabel) == AGV_STATE_AT_ENTRY_CP): X2 m/ s9 X2 H% L% g9 t
- agvredirect(agv, elevatorCP, REDIRECT_AND_WAIT);
: x! f0 |" \6 p W - return 0;- c# D% |5 S% z8 V1 U7 l Z/ v
- }. V% U1 W( m; P: d5 R5 x5 o6 X
- case ON_PICKUP_DOOR_CLOSED: {$ [. Z' j6 Y+ A% a F, G; q, m
- treenode elev = param(1);9 y! ^1 O, _, R: j I w
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);3 K# q/ Q: E) U" O7 ~7 y) v1 G0 d
- // assign the agv to "no control point"
4 ^) |( D$ N% P3 a6 R% N - agvreassigncp(agv, 0);
7 I/ X+ K7 Q" \; I - // move the agv into the elevator
% G- S" p" I! w5 @: z - moveobject(agv, elev);; ]- v2 _1 u; q: k# X, o) l
- setrot(agv, 0, 0, 0);
' N( J& J% k4 p- j$ r* d* D. R - // release the elevator to continue to the destination floor
% z) L+ T. L7 Z+ w$ v$ @" j- P8 P - freeoperators(elev, agv);4 b7 Q" o, H+ x+ `" N$ ]
- return 0;
& Q9 S' u! v0 b, }# q! \ - }% c( U, k, N; R
- case ON_ELEVATOR_DROPOFF_ARRIVAL: {; l% I" Y- h; [- e5 l7 d% \
- treenode elev = param(1);$ `/ S/ a) w; P, F
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);. p0 i% i4 p2 e+ M( R
- // when the elevator arrives at the destination floor
- j- L, q& |/ M: C- k' A - // move the agv back into the model
6 @/ W8 C( b$ L3 c2 P* V - moveobject(agv, model());
, h# I& {+ a3 s/ T) R4 c- P+ y - // reassign it to the destination floor control point- W: b! `7 b! p z
- agvreassigncp(agv, tonode(get(node("DestElevCP", label(agv, AGV_LABEL_NAME)))));* ` n2 y0 h& n6 G6 i+ _. i: {, \$ C
- // open the elevator door
: e4 L8 g3 O8 A9 l' W3 C$ ~) @ - nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_DROPOFF_DOOR_OPENED);# I9 {: l6 M0 w( M
- return 0;
3 b4 t! t* V) @5 @9 Y2 o - }
7 N1 E- Y( k9 z - case ON_DROPOFF_DOOR_OPENED: {
: C7 q- w/ X# y9 h - treenode elev = param(1);
. t; t* y; t7 u - treenode agv = param(2);
& t ~. P' x/ x1 Y - treenode agvLabel = label(agv, AGV_LABEL_NAME);
: Z3 E% G2 E9 B7 X - // once the elevator door is opened on the destination floor,
9 P* a' k5 Q0 j - // redirect the agv to the exit control point6 w+ i1 ^) P/ L3 z `
- agvredirect(agv, tonode(get(node("ExitCP", agvLabel))), REDIRECT_AND_WAIT);
, D) E5 d+ o' D* V# n9 Z - return 0;6 R# Q; |* y) @# h
- }
3 |, K+ s- c& C2 ~& X. a - case ON_DROPOFF_DOOR_CLOSED: {
8 u* \% Y" T# V0 Z! r - treenode elev = param(1);
/ C( M9 x+ X2 a" P& J - treenode agv = param(2);
( R2 O" A" f1 ~/ |; _ - int isAGVWaiting = param(4);
1 y( g3 M" T/ K% l$ y1 w - // once the door is closed at the destination floor,
* R T$ V' j9 ^6 l& t! H) h - // if the agv is waiting, then send him to the final destination
; O! p2 u8 u% |7 a9 D3 | - if (isAGVWaiting)
0 j) h7 a( @" s+ ~. }3 k" |6 `) ? - agvredirect(agv, gettaskinvolved(gettasksequence(elev, 0), 1, 2), REDIRECT_AS_FINAL);
) {3 A" ?( {0 t7 l$ |5 ? - // release the elevator to finish his task sequence" R2 T3 h$ ^4 U
- freeoperators(elev, agv);' K2 G, n; z% ?! v% Y
- return 0;% c/ d% u0 K3 X6 ]# N
- }
5 I8 c. v) u4 w/ N$ z& {$ ? - }8 F& X W `/ f2 Q5 X8 M: R
- } //******* PickOption End *******\\3 z( T$ b4 G) q3 m) H
7 I" w, U3 y% j$ [6 \' [1 L& c: }
复制代码
# V5 l! N: ~% c! P1 C6 |/ r i3 _
/ q% o6 u# I) i& \3 ]5 l
* ~! l* h4 m" a4 S1 Z5 g* t办法2:使用工艺流程模块完成 |
|