|
办法1:从2016版本里面复制相应的代码1 Y6 U; b- ]- _7 S
3 H4 p" E# I. l! W4 N: _; w9 u
具体代码如下:& X$ d" x$ t z! |
- treenode agv = param(1);
* [7 w" _& r) R9 o `* p6 F/ q - treenode currentCP = param(2);
, P- n* X$ w' j$ R - ! w3 J4 }- I4 n4 U) l7 S
- { //************* PickOption Start *************\\
0 P A5 Q. k% M9 H1 j6 { - /***popup:AGV_DivertToElevator*/
8 \8 o9 l, i4 S - /***tag:Description*//**Divert to Elevator*/
7 q8 N% U( ?8 e. R! j3 h0 v - ! r0 p6 }8 |$ t& Z8 O( J
- int operation = param(3);
# p" _8 W8 k3 Z% x% x - . n" L7 w1 D; R
- #define AGV_LABEL_NAME "fs_AGV_Elev_State"
9 _5 O- Q. w! p$ N$ {7 Y - if (operation == 0 && !objectexists(label(agv, AGV_LABEL_NAME))! h' w% i/ m& j3 A) u
- && (/** \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- m/ W, Q/ [ - // initial trigger execution
5 Z$ Z( x4 j/ x% r- a3 ^7 p# M O - #define ON_ELEVATOR_START 16 c; L) A7 z4 @' d* d
- #define ON_ELEVATOR_PICKUP_ARRIVAL 21 n+ C/ d- d7 K: M
- #define ON_ELEVATOR_DROPOFF_ARRIVAL 3
6 ?* A+ @$ ?3 Z& a - #define ON_AGV_AT_CP 4
; `* f( R9 }) p* E4 h) b - #define ON_BOTH_AT_PICKUP 5
7 d/ b9 g- ]0 y% d - #define ON_OPEN_DOOR 6; G7 i7 }" t6 a9 }
- #define ON_CLOSE_DOOR 7
9 b" r3 @9 i+ V1 _- B% Y - #define ON_PICKUP_DOOR_OPENED 84 Q+ B" k( N6 ~: w* u; G6 n
- #define ON_PICKUP_DOOR_CLOSED 9
3 r! l# Q0 T# T& g& R( O: h - #define ON_DROPOFF_DOOR_OPENED 10& M: m/ _1 X. g% c; T( Z. Y) ]
- #define ON_DROPOFF_DOOR_CLOSED 11 ]+ V5 ^4 s7 I8 W
- 9 [& S: S3 }8 ]9 _9 L1 h
- #define AGV_STATE_START 0) J7 M) [6 r' K- R
- #define AGV_STATE_AT_ENTRY_CP 1
/ r, B& i( w: n - #define AGV_STATE_AT_ELEV_CP 2; h+ ^' t2 C+ `( ^
- #define AGV_STATE_AT_EXIT_CP 3
5 R$ T9 _. ]% s5 F -
1 m. r3 I0 H8 N2 l7 \ - #define ELEV_STATE_NONE 0" n+ d. o _. C4 j# [5 P- r3 I
- #define ELEV_STATE_AT_PICKUP_FLOOR 1: ] `- f9 D b9 J
- #define ELEV_STATE_OPENING_DOOR 2. E! ~4 s0 i; n' |! ] c
- #define ELEV_STATE_DOOR_OPENED 3, g# e3 a% V: O& Y1 ^. I w4 F
; q3 q( ?& o% o% C6 A$ @! J2 b- & L) l3 N; _7 d. F( C U+ |
- treenode elevDisp = /** \nDispatcher: *//***tag:Dispatcher*//**/cpconnection(currentCP, "Elevators", 1)/**/;$ b& x" x; }* }" Y# k9 E
- #define elevator outobject(elevDisp, $iter(1))+ z# h$ q& p* Q/ F y
- 5 L# q: o C" w' o3 y* i. v
- if (!objectexists(elevDisp))& N0 k X6 u! b" j3 G! G
- return 0;
: K7 A% I E& x. v9 q( R
6 q5 S7 s1 C3 F4 F, Y! x- if (/** \nDo Search: *//***tag:DoSearch*//**/1/**/) {7 v2 R* o8 B, f# a; r6 W
- query(3 m. c. N* Q, m% ?
- /** \nFull Query: */' k$ r; B9 V; b0 W( M0 d ?2 s9 Z: c
- /***tag:FullQuery*//**/"SELECT $2 AS Elevator FROM $1 Elevators WHERE $3 ORDER BY $4 ASC LIMIT 1"/**/,
) k+ Q/ I" a+ z y: q - nrop(elevDisp),' u7 E( G, M. H b3 D4 }
- elevator
2 v9 k; d1 X; x - /** \nWhere*/
# i- u9 b+ Q0 R. S - /***tagex:WhereParams*/,/** \n*/ /**AND*/ /** */ /**/getstatenum(elevator) == STATE_IDLE /**/
$ b5 s0 R F; m - /***/
' B7 @1 T6 [3 a0 P: Q$ ^ - /** \nOrderBy*/
% d! @+ g7 A" P( |. Q9 I9 ~" A - /***tagex:OrderByParams*/,/** \n*/ /**/fabs(zloc(elevator) - zloc(agv))/**/ /**ASC*// U$ k, h! x$ k- |' x$ R( y
- /***/);
' `9 [" Z6 ?6 D! g9 U$ _& F) [6 ? - 7 y& l/ n" {, e7 e( J, ~- j' S
- if (getquerymatchcount() > 0)
3 w/ e" L) j7 a3 B0 k1 W7 w: }1 \ - elevDisp = getqueryvalue(1, 1);
4 E# E0 U1 @! p1 @2 k, J2 r - }, h+ P. U) a6 y7 X6 D: d& `
- if (!objectexists(elevDisp))+ g ]; T2 G9 P: O
- return 0;
% r3 P6 K, `0 v: r' I - treenode destCP = agvinfo(agv, AGV_DEST_CP);
. v$ V% b8 z, m! L, }# v. e
. b7 |. T ^8 b4 u- agvredirect(agv, /** \nDivert Point When None Available: *//***tag:WaitDivertPoint*//**/currentCP/**/, REDIRECT_AND_WAIT);8 Q. Y6 v/ k \
- % K- e/ h) s% O1 y8 X4 J
- // Create the task sequence for the elevator
3 u! C6 j" O* t# k% t& L - double destZ = zloc(destCP);
! Y2 N0 o- c5 H+ A: z. b3 m! W7 N - treenode ts = createemptytasksequence(elevDisp, 0, 0);8 B1 I8 Y; _* r
- inserttask(ts, TASKTYPE_TAG, agv, destCP);
' Q/ f3 Q+ R# s- o - // immediately when the elevator starts the task sequence, I call ON_ELEVATOR_START. M0 v2 g: N3 r; [0 @5 s
- inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_START, destZ);
; T- s# b0 k2 `" o7 g - // travel to the z location of the current control point
: X! u( L# D4 h+ G9 O, ], E - inserttask(ts, TASKTYPE_TRAVELTOLOC, 0, 0, 0, 0, zloc(currentCP));2 H" y5 B; t. ^4 n* B2 |" }
- // then call ON_ELEVATOR_PICKUP_ARRIVAL
- U4 p& D; F1 P6 {/ J$ T- P - inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_PICKUP_ARRIVAL);, X% |, z. ?1 X/ P6 O q8 e
- // then wait for the agv to get on
; u" ~, E; c$ D1 A( h% b1 B4 o* J - inserttask(ts, TASKTYPE_UTILIZE, agv);4 J: i: ~: M! J0 d# {
- // then travel to the destination z location2 i, p# J7 y8 ?2 Y: ?! j. k3 c/ @
- inserttask(ts, TASKTYPE_TRAVELTOLOC, 0, 0, 0, 0, destZ);( I6 x4 n/ g0 \3 i* s6 I
- // then call ON_ELEVATOR_DROPOFF_ARRIVAL
. c$ J( F9 q! {, X/ u0 U2 q - inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_DROPOFF_ARRIVAL);, `9 f6 s; j( H/ s& h7 ?, T. S4 V* H+ Z
- inserttask(ts, TASKTYPE_UTILIZE, agv);$ b( f0 ?- k0 N
- dispatchtasksequence(ts);
* Z0 P2 u5 o! m W7 W& K - } else switch (operation) {/ x5 a& d) D. [8 |! W: ~
- case ON_ELEVATOR_START: {5 a% W, d- j% h
- // this is fired when I get a valid elevator
) J( X) ^! D$ _9 G2 | - treenode elev = param(1);. O9 M' V6 I+ g% m8 h) S
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);
0 Z9 d. h0 s( E( s- W' W, _ - % \8 n: w5 t8 @- d! y
- // find the closest floor control point
5 E+ P- c2 R4 J8 H3 B - int floorCPCon = cpconnection(0, /** \nFloor Control Point Connection:*//***tag:FloorCPs*//**/"Destination"/**/, 0);0 D- D3 F$ g' v- r+ Z. d# G ?
- treenode curFloorCP = findmin(cpnumconnections(elev, floorCPCon), - K6 W4 O7 T I# E( m. E
- fabs(zloc(agv) - zloc(cpconnection(elev, floorCPCon, count))),
8 Q3 R ?4 h8 W. e! j - cpconnection(elev, floorCPCon, count));
. E8 D1 W: M7 U$ M! w3 T - // return if there is none4 D, h/ T. y$ ]3 p" V8 E9 ?- Q( l: z
- if (!objectexists(curFloorCP))! U% N' t3 u5 ~( e( K- i& I
- return 0;
8 W. p1 T: U; a$ N" w) M - 7 G3 W6 h L0 N1 P: o& O6 a |
- // get the entry control point4 S$ U- \5 b: _8 E
- treenode floorCP = curFloorCP;
+ R0 k9 s& a3 h9 r& ~ - treenode curFloorEntryCP = /** \nEntry Control Point: *//***tag:EntryCP*//**/cpconnection(floorCP, "EntryCP", 1)/**/;
# d" [9 }) V4 k+ D - if (!objectexists(curFloorEntryCP))# [+ r z ]2 ?5 e
- return 0;
4 K7 ?0 n6 a7 K( l/ f4 S+ t - treenode floorEntryCP = curFloorEntryCP;' ?# J- Z% }% ?- k* G, x/ f
- treenode curFloorElevCP = /** \nElevator Control Point: *//***tag:ElevCP*//**/floorCP/**/;0 [5 G* u+ q# i7 z4 }6 t3 g5 l
- if (!objectexists(curFloorElevCP)), t) V' B: I9 M" `+ q
- return 0;3 n1 g& Q1 U6 ^3 _5 S$ F' c
- & z& ^& f+ |# w# _- Q
- double destZ = param(4);
& v4 D% {7 ?. U; n$ j0 s4 o - // find the floor control point closest to the destination floor7 ?/ I: a) D8 T. H, ^, P1 F
- treenode destFloorCP = findmin(cpnumconnections(elev, floorCPCon), ! `) {+ r( c3 o. F( O5 A0 G
- fabs(destZ - zloc(cpconnection(elev, floorCPCon, count))),
8 k" Y8 [7 \' m( {* x& T) H% S' h - cpconnection(elev, floorCPCon, count));' [8 w1 d8 l5 R2 ~* J2 j4 |2 j
- / S3 M) _+ ]3 Y" j8 L- g) H
- floorCP = destFloorCP;
' |, t5 s, Z K+ M: U' n - treenode destFloorElevCP = /** \nDest Elevator Control Point: *//***tag:DestElevCP*//**/floorCP/**/;
' N3 R% P: u Q5 b, {" E1 n - if (!objectexists(destFloorElevCP))& r% i/ I: [+ N( v) O$ K( d) K
- return 0;
, o( P6 g, q, _ - // get the destination exit control point
/ I- O9 w+ Q" T; D8 P: p - treenode destExitCP = /** \nExit Control Point: *//***tag:ExitCP*//**/cpconnection(floorCP, "ExitCP", 1)/**/;6 @" r9 k# n( t+ x9 J
- if (!objectexists(destExitCP))5 d& g4 y4 G2 }! M8 Q
- return 0; \/ S* L! v. ~, y* ]
6 w" }* @3 V9 H, }- $ V2 l3 G% }0 I5 E/ H5 m
- // add a listener for the agv. This will call this nodefunction in the ON_AGV_AT_CP section whenever the - o% r5 A6 i# C# ^" G/ E! y
- // agv arrives at a node. I keep a state on the agv's state label, and then increment it each time* n4 X- @% K" h- h# A" `# G/ u7 f5 m
- // the listener is called so I know which control point he's at, i.e. entry, elev, or exit.# U# i( o/ E9 l* A" @7 k+ x$ s
- agvaddlistener(agv, c, AGV_LISTEN_ARRIVAL | AGV_LISTEN_INTERMEDIATE_DEST,
% z# d5 `; R$ G3 u6 M, p1 t - agv, elev, ON_AGV_AT_CP, AGV_LISTENER_PARAM_NODE);
+ ?; }: ]. n, b+ P9 y9 ?+ P -
( J4 f' @! g& p- I) A7 U( ]* X - // set the data on the state label + w" D. D# S( m/ @
- treenode stateLabel = assertlabel(agv, AGV_LABEL_NAME, DATATYPE_NUMBER);
& c4 k% E) x7 N8 j( v - switch_destroyonreset(stateLabel, 1);
. W/ l0 i f; q' r" O! s - set(stateLabel, AGV_STATE_START);
" Y4 `/ [ b7 W' s+ q" `8 h4 u - set(assertsubnode(stateLabel, "ElevState", DATATYPE_NUMBER), 0);
: v7 v! T5 X. L, }# { w - nodepoint(assertsubnode(stateLabel, "ElevCP", DATATYPE_COUPLING), curFloorElevCP);" T( d; v# l# V7 B# F
- nodepoint(assertsubnode(stateLabel, "DestElevCP", DATATYPE_COUPLING), destFloorElevCP);$ J. t4 n! U# [+ r- H" ~4 d! H" ~
- nodepoint(assertsubnode(stateLabel, "ExitCP", DATATYPE_COUPLING), destExitCP);( j) z# |2 Z7 N& N4 L
- agvredirect(agv, curFloorEntryCP, REDIRECT_AND_WAIT);
2 L# U! x3 }$ I: M4 y* |1 l& E - return 0;" z( e8 l. F! T/ y9 s' q
- }
' X7 M: G5 l, j - case ON_AGV_AT_CP: {
7 I- f: L5 k" A9 O! }( S - // this is fired by the agv listener every time the agv arrives at a node.7 K6 U( d5 a) }
- treenode agv = param(1);
; U. c% N8 k1 T' Z+ l$ [+ Z7 n- n - treenode elev = param(2);* ~" t; x6 A/ N K' n; Y% z
- treenode stateLabel = label(agv, AGV_LABEL_NAME);9 u2 K# G1 m1 i3 a1 r) O
- // I increment the state label, and then switch on it" N* f9 L, w' B0 s8 I- v
- inc(stateLabel, 1);
/ P3 C4 I7 G. d8 Z, E" b - switch (get(stateLabel)) {
9 {& x$ P6 e" h) L' t - case AGV_STATE_AT_ENTRY_CP: {
, R7 {6 b8 T, v - // the agv just arrived at the entry cp
8 U, E9 y" I2 J' S5 P/ d - // so, figure out where the elevator is.+ D$ B& I8 N1 D. ]6 t
- int elevState = get(node("ElevState", stateLabel));2 K* n# J4 T" `5 G" q4 R
- // if he's at the pickup floor with his door closed then open the door.0 B( V% j `! }
- if (elevState == ELEV_STATE_AT_PICKUP_FLOOR)- X1 `! Z+ q+ A7 ~9 d
- nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_PICKUP_DOOR_OPENED);
% J o9 l3 A$ B) U( T* C - else if (elevState == ELEV_STATE_DOOR_OPENED) {
7 a. ^! ~$ g& `) C4 t) d. B( V - // if his door is alread opened, then move the agv onto the elevator, i.e. to
3 O$ {! e' k1 d$ u4 a- e - // the elevator cp+ x5 Y! @( J& G, I; |8 ~' O
- treenode elevatorCP = tonode(get(node("ElevCP", stateLabel)));
: R+ ^& G7 h" j. X6 B: ]" ?# r - agvredirect(agv, elevatorCP, REDIRECT_AND_WAIT);
2 g4 I( p2 z7 m - }6 t* k' T9 z4 V+ u- J6 g
- break;
6 U; J% N4 m0 f, h' V/ X* l - }7 d0 P- I8 C1 Z8 ?# Y& u
- case AGV_STATE_AT_ELEV_CP: {
. R- O+ u: J9 U+ p - // once the agv is at the elevator cp, close the door+ G) q( [7 y3 U6 w* t* J0 X9 A
- nodefunction(c, agv, elev, ON_CLOSE_DOOR, ON_PICKUP_DOOR_CLOSED);3 g+ E( f! K R, Y; F! X
- break;
+ K! @/ M3 x/ W( ] - }
- j0 k$ f. Y6 Z$ X+ u. X: j - case AGV_STATE_AT_EXIT_CP: {
) ?5 S2 Y4 Q# ^: V" |( p# i - // the agv is at the exit cp
/ {+ C2 l' m4 _$ ]: ?4 F+ J - // destroy the listener node because I'm finished listening! X5 G4 J1 m( r9 m/ o& O' h; u' f
- treenode listenerNode = param(4);& S# c) T' ]9 _/ g! _
- destroyobject(listenerNode);0 m$ t$ g; o, k# ?
- int agvWait = /** \nWait On Door Close: *//***tag:WaitFinalDoorClose*//**/0/**/;1 k% R7 \& \, q$ P5 G- z% t) G/ v
- if (!agvWait) {; p$ V9 Y- S9 G/ c9 ?
- // if the agv is supposed to continue on, then tell him to go to his final destination
( |; @6 d# O& e6 T* S4 u* M) Q) l* t: e - treenode destCP = gettaskinvolved(gettasksequence(elev, 0), 1, 2);
) f5 J5 V$ x4 G7 U" P - agvredirect(agv, destCP, REDIRECT_AS_FINAL);/ J! Q( X" H0 G2 K) R( N
- }# Q$ m( o! O* Y; ^8 a0 I% O
- // close the door' [9 F, `9 R6 H4 R7 C
- nodefunction(c, agv, elev, ON_CLOSE_DOOR, ON_DROPOFF_DOOR_CLOSED, agvWait);
4 X' l) J; F3 L3 y" P) ^ - // and I'm finished with the state label so I can destroy it.
2 X" p' B9 ~, ?$ O$ N - destroyobject(stateLabel);" ]/ j. q& l* K% [* S
- break;
9 t0 ^7 ?/ w5 w v. g& ~$ b/ Z - }
y0 E* o1 Q3 J& U - }
) J; e1 j9 J! C; r" @1 m. r. D - return 0;" u; U- V l8 ]! c0 ? x
- }7 a; J8 r$ T9 K$ M
- case ON_ELEVATOR_PICKUP_ARRIVAL: {6 ^ V( o: c U7 f: ]
- // the elevator has arrived at the pick floor
: Q8 ]; @0 E3 \& g# j) { - treenode elev = param(1);
& Y' c+ R u3 O4 h; |. Q6 J - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);
8 @. U8 W5 x, V! S& l - treenode stateLabel = label(agv, AGV_LABEL_NAME);
, g! _% H, `1 a: k# R - treenode elevState = node("ElevState", stateLabel);
& H ]/ I+ ]9 e" r - // set the elevator state to at-pickup-floor' P4 t& X) Q' e* ^ ?( k
- set(elevState, ELEV_STATE_AT_PICKUP_FLOOR);
- ^6 ?6 I! Y) v7 _, k8 J6 ?, H - 4 f6 K& W) e( P# @$ I5 Z! k* P
- int openDoorImmediately = /** \nOpen Elevator Door Immediately: *//***tag:OpenDoorImmediate*//**/0/**/;
7 C$ l. {8 ~' a- E1 k+ ^5 k - , y& r! M7 R& c
- // if the agv is at the entry control point or I open the door immediately, then open it3 N( q) b% k9 z& h- h: o
- if (get(stateLabel) == AGV_STATE_AT_ENTRY_CP || openDoorImmediately) {1 z0 ]8 L2 z0 i# x% R
- set(elevState, ELEV_STATE_OPENING_DOOR);
9 L1 T' y$ l1 f/ v5 v9 q2 G S3 i - nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_PICKUP_DOOR_OPENED);0 |' R6 {' b8 A; I# [
- }, t( V2 j# ~) v+ k( t3 v
- return 0;6 V8 ?2 {$ r$ |2 [4 q
- }0 P1 u) |! P: P/ l
- case ON_OPEN_DOOR: {) |, j9 A! ^1 H; [4 L8 D5 S- e
- treenode agv = param(1);( q8 T2 C; ?7 G+ U; { ]+ l+ c1 ]
- treenode elev = param(2);" @: Z7 w- K) @0 w
- int nextStep = param(4);
+ m9 W9 B; B1 O/ F$ c( ~1 T) t - // open the door based on the time to open the door
9 G, g7 p* F0 g - double openDoorTime = /** \nDoor Open Delay:*//***tag:DoorOpenTime*//**/5/**/;6 G a d x' @$ L
- delayednodefunction(c, openDoorTime, elev, agv, nextStep);
: f, J! K# m$ z" B- _: Y - return 0;6 T, i: `1 z! K- b. a* N
- }& t. K. X# u9 `+ I
- case ON_CLOSE_DOOR: {
2 W( l/ h( o4 n2 D4 P! Y1 o0 z0 H - treenode agv = param(1);' x" X/ P/ a% A7 Z( c1 }
- treenode elev = param(2);
3 m4 R. n( K3 C/ d; u - int nextStep = param(4);1 Y# k, ~! Y( H) ?8 z7 z/ c
- // close the door base on the time to close the door
3 d% ?# _$ f4 |7 I+ i2 a" `. Q - double delayTime = /** \nDoor Close Delay:*//***tag:DoorCloseTime*//**/5/**/;
5 U" j3 u n" |% j* q2 ? - delayednodefunction(c, delayTime, elev, agv, nextStep, param(5));) k+ j8 _0 t$ m5 ?" t
- return 0;4 F+ Y$ |( f+ [# {% v6 Z9 K9 p
- }1 W- o9 z7 c7 ]9 k
- case ON_PICKUP_DOOR_OPENED: {0 |2 W- W" {! M: q% z2 m
- // the elevator door has been opened on the pickup floor
, l5 B; n# v# j. E- B" M - treenode elev = param(1);* E0 k+ \# `- N _( H O" W2 w
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);
& f. v! h: d3 o$ @% z - treenode entryCP = cp(agv);
) W! g1 f9 W- W; Q7 z. P( k - treenode stateLabel = label(agv, AGV_LABEL_NAME);
|; g, M& A5 R8 n% d8 t9 Q2 S9 ? - treenode elevatorCP = tonode(get(node("ElevCP", stateLabel)));
* ~% } A: @# f - treenode elevState = node("ElevState", stateLabel);! p( \' C4 N- ^2 k6 C: ?3 N
- // set the elevator state
& g+ _# H8 a6 k" _ - set(elevState, ELEV_STATE_DOOR_OPENED);& m' r* w' V( l
- // if the agv is at the entry control point, move him to the elevator control point
1 a% Y3 h/ ~$ C% N# ]$ ]3 U8 R - if (get(stateLabel) == AGV_STATE_AT_ENTRY_CP)3 K- @( [9 N& N. M' p; L) r
- agvredirect(agv, elevatorCP, REDIRECT_AND_WAIT);3 u5 G3 Y# P0 k- J
- return 0;
& Z' ]) A" p# N2 d! [ - }- }, {$ F0 v7 G, t
- case ON_PICKUP_DOOR_CLOSED: {, }2 g$ V9 E/ w8 V; }- G
- treenode elev = param(1);
" ^/ Z/ [: }. ~" S. G! A g - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);
* S; ?4 \# ^# h& O3 s6 ^) O - // assign the agv to "no control point"
# \- ]% M; y. J' U& Y4 W - agvreassigncp(agv, 0);; E, Z1 ^# z% U. H/ V t8 n
- // move the agv into the elevator$ ?0 l$ l( t1 t6 v
- moveobject(agv, elev);3 c; C/ G& z0 W3 u) ]' E$ z4 r* C
- setrot(agv, 0, 0, 0);7 {; u! a6 k, g( x A$ u
- // release the elevator to continue to the destination floor
4 a# o- T. n# M$ l - freeoperators(elev, agv);$ k( I8 t5 o6 A' E0 G9 `* p
- return 0;' T- |* a& Z- e' g
- }/ Q& B& p: e; X; l) I/ r e7 Z+ f9 I$ H
- case ON_ELEVATOR_DROPOFF_ARRIVAL: {* ?8 ?1 u p' N& {. q
- treenode elev = param(1);
# b3 p9 t# O" n2 l - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);; m( j- @( ]+ y2 W" A
- // when the elevator arrives at the destination floor) ~, k$ T; E( F, q. j1 K. M& E& L
- // move the agv back into the model
+ S& Y- i* L+ }- p$ W5 _ - moveobject(agv, model());
5 R1 m+ h- p+ m. K9 m; K. q! C- e4 k4 X - // reassign it to the destination floor control point$ t( q! x; i& a; G5 J; d
- agvreassigncp(agv, tonode(get(node("DestElevCP", label(agv, AGV_LABEL_NAME)))));
5 P& Z1 n0 j% P( q1 M - // open the elevator door
# f% I* B' }$ K - nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_DROPOFF_DOOR_OPENED);/ E% _& l2 G0 p6 w
- return 0;
t/ g) d3 x- b& V$ A7 Z- ? - }' N! q7 h8 [+ A' p4 W& }5 g
- case ON_DROPOFF_DOOR_OPENED: {
: i( W" ?* A% i+ V! L( Q6 B8 N - treenode elev = param(1);$ l, L R0 j7 i: R3 q
- treenode agv = param(2);
% i; t% I0 E+ R$ H! p& w+ v - treenode agvLabel = label(agv, AGV_LABEL_NAME);
1 v# N# b+ F6 `0 G& D/ e - // once the elevator door is opened on the destination floor,
9 Y- z; F/ b$ P" {. u5 p& A - // redirect the agv to the exit control point
, V( B1 L/ ^4 I3 _1 b: \7 _ - agvredirect(agv, tonode(get(node("ExitCP", agvLabel))), REDIRECT_AND_WAIT);
% ^! {# q1 E8 m9 R) d* M; F - return 0;% B% w- K' D [$ s& q+ V
- }1 ?& M5 c$ z% k6 s
- case ON_DROPOFF_DOOR_CLOSED: {7 O/ o! X; m5 T
- treenode elev = param(1);% t' m7 S# l7 G. Z
- treenode agv = param(2);
}8 v) B, M7 j" `% [% C - int isAGVWaiting = param(4);/ }% I1 i0 J$ e7 l% Z# X% x
- // once the door is closed at the destination floor, G9 f9 t2 A/ W* ]9 ], C/ X3 B
- // if the agv is waiting, then send him to the final destination
0 Y/ e; R( n8 e1 \9 G) ^ - if (isAGVWaiting)
6 E' E3 T- X4 T; t7 P0 @ - agvredirect(agv, gettaskinvolved(gettasksequence(elev, 0), 1, 2), REDIRECT_AS_FINAL);# p; o. S+ k* M: m
- // release the elevator to finish his task sequence
1 g: Z" G, Z [5 E) E( X - freeoperators(elev, agv);
/ H6 d( d2 G6 B+ P0 w - return 0;( U j9 n6 T# Q$ S( Z6 w
- }
% y* e" x9 W. t+ C: ~) a8 d - }
" J9 ?0 O. Y+ S8 N8 _) f% t; c - } //******* PickOption End *******\\3 W: Q a# t' U" a
7 r( Y( e" {# U' p, f
复制代码 # p. o4 Y, l; \- C. H! [
" n% h, v7 K# A4 q: A8 S( ^* J. y
2 U; f$ o7 j4 I办法2:使用工艺流程模块完成 |
|