|
办法1:从2016版本里面复制相应的代码
' n( q2 W1 K3 |
; \# w r- M1 ?2 ]具体代码如下:
0 \1 L' k+ I% Q: z- treenode agv = param(1);& _+ R$ M/ a2 Y7 p% q5 h+ J
- treenode currentCP = param(2);1 L. |& W, D. y( }& F
7 B, C4 n' f# M C- { //************* PickOption Start *************\\
C z! z8 r% l, j& \! D - /***popup:AGV_DivertToElevator*/" V: p3 G5 \8 ^ @ B
- /***tag:Description*//**Divert to Elevator*/) X; V) J$ p# j. W& B
- 7 H. R( c. {$ H9 E& E6 Z) T4 _" V
- int operation = param(3);
- N- _4 G: M Q- B% G* K& i
; ~! x8 _6 x, }! n h- #define AGV_LABEL_NAME "fs_AGV_Elev_State"
# u) f+ w8 j& g: V, z. e4 L7 J A" O6 b - if (operation == 0 && !objectexists(label(agv, AGV_LABEL_NAME))8 J% P4 b6 N7 s8 Z
- && (/** \nCondition: *//***tag:Condition*//**/fabs(zloc(currentCP) - zloc(agvinfo(agv, AGV_DEST_CP))) > zsize(agv)/**/)) { // if it's a pointer, then do the initial case) ]6 A8 W6 N# ~# @5 N( r( d
- // initial trigger execution
. V4 |! H( w: R1 W- s. S - #define ON_ELEVATOR_START 1% c! B3 t* l6 H. Z- M
- #define ON_ELEVATOR_PICKUP_ARRIVAL 2+ G: ~4 s, U# J% e; t: ]% M
- #define ON_ELEVATOR_DROPOFF_ARRIVAL 3
+ W8 `! a& a2 ~4 b( J - #define ON_AGV_AT_CP 4
( H( m* Y: q4 S- v! _; x - #define ON_BOTH_AT_PICKUP 5
! d5 T0 M! u. c' o2 t8 d - #define ON_OPEN_DOOR 6
1 s+ r0 O! c0 o" c/ \ - #define ON_CLOSE_DOOR 7
4 U/ B. @$ c0 F) J - #define ON_PICKUP_DOOR_OPENED 8
/ L& }- ` P. Z: n. \ - #define ON_PICKUP_DOOR_CLOSED 90 x/ `( L' _7 D) ?
- #define ON_DROPOFF_DOOR_OPENED 10
0 w: V$ T+ Q1 S! y, T; b - #define ON_DROPOFF_DOOR_CLOSED 117 _9 I9 [& p; V* u
- # z8 l2 g- s( u6 v8 o0 D6 |
- #define AGV_STATE_START 08 m: G- H0 X9 P: v& m8 a
- #define AGV_STATE_AT_ENTRY_CP 1 d0 [3 u+ J- ?) n* i: V% k
- #define AGV_STATE_AT_ELEV_CP 2, S" W! m$ \0 F
- #define AGV_STATE_AT_EXIT_CP 3* x$ e% O2 V; C1 N# p- {
- ( O7 m- j7 D" A; W% ?
- #define ELEV_STATE_NONE 0, z; n7 S% C y4 r$ W
- #define ELEV_STATE_AT_PICKUP_FLOOR 1) j4 M# m5 \8 g: v
- #define ELEV_STATE_OPENING_DOOR 2
- E( C5 r' w3 z* z2 F' m: r - #define ELEV_STATE_DOOR_OPENED 3
$ {& h- ~" c9 J; x - ( K J/ ~; A6 j# V N" n
3 f/ B8 O8 D/ B. s% P0 g- treenode elevDisp = /** \nDispatcher: *//***tag:Dispatcher*//**/cpconnection(currentCP, "Elevators", 1)/**/;( k& O5 V- C: K: _
- #define elevator outobject(elevDisp, $iter(1))7 S5 Q. ^% Q c' o! K9 L% m
- 2 T$ P# P8 m6 m
- if (!objectexists(elevDisp)); q8 X! I- c ]% n: T0 z2 u+ W
- return 0;
+ L( A$ h4 B$ [9 N! [, [
2 V/ }# X* f0 a" @5 t1 m, i4 ~- if (/** \nDo Search: *//***tag:DoSearch*//**/1/**/) {5 g8 @7 _! l5 N) V: e" T
- query(
0 k4 l+ I" s9 {$ B- } - /** \nFull Query: */8 W. P2 y( A# J I& [
- /***tag:FullQuery*//**/"SELECT $2 AS Elevator FROM $1 Elevators WHERE $3 ORDER BY $4 ASC LIMIT 1"/**/, }, \" n2 H: ~. o6 N1 t8 I: k8 {- _
- nrop(elevDisp),- g: V; s6 p& w8 y
- elevator" ]* n' n- j+ O; @6 P- H* e
- /** \nWhere*/1 H+ n: r2 k- h6 c; z6 C
- /***tagex:WhereParams*/,/** \n*/ /**AND*/ /** */ /**/getstatenum(elevator) == STATE_IDLE /**/
' U2 j: ~% ~( G8 Y - /***/9 z8 v6 r$ t& N* H1 a' I
- /** \nOrderBy*/
+ d+ r7 P6 O0 } - /***tagex:OrderByParams*/,/** \n*/ /**/fabs(zloc(elevator) - zloc(agv))/**/ /**ASC*/& F3 o9 Y( c# r2 {
- /***/);- E" Q& n( ]( [; \) r
, w$ j% _7 Y* Q* d8 d' O; O- if (getquerymatchcount() > 0)$ y# Q# l, _' T0 G; Q' ]
- elevDisp = getqueryvalue(1, 1);3 M' w/ m2 E7 v0 |8 T6 d6 E2 V
- }
6 K- b( F/ u: l7 {5 i - if (!objectexists(elevDisp)); s( [+ K2 g6 R3 k7 [, \6 k: z
- return 0;
0 B! G0 N$ l0 t, L3 m8 |$ D% w" e1 Q - treenode destCP = agvinfo(agv, AGV_DEST_CP);* }* b+ h; D% c2 W
- 6 G, R G& c+ l
- agvredirect(agv, /** \nDivert Point When None Available: *//***tag:WaitDivertPoint*//**/currentCP/**/, REDIRECT_AND_WAIT);
7 Q/ W( u1 i7 t8 {( o3 |7 s
' p: I& S0 `; g0 ?3 R7 ~- // Create the task sequence for the elevator+ p9 t8 Y1 H( B6 Y0 V
- double destZ = zloc(destCP);
# V' R6 A9 p8 E6 ~ - treenode ts = createemptytasksequence(elevDisp, 0, 0);9 g0 ^3 x1 w: I; A% K& N4 V Y
- inserttask(ts, TASKTYPE_TAG, agv, destCP);& z: k6 [) C( b' \* H
- // immediately when the elevator starts the task sequence, I call ON_ELEVATOR_START
# a, n* _1 K* e, V" {$ N% P8 o - inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_START, destZ);* Y) Z0 J/ j1 y y2 D% W5 [) X
- // travel to the z location of the current control point
2 a2 z/ w' @1 L# O4 s - inserttask(ts, TASKTYPE_TRAVELTOLOC, 0, 0, 0, 0, zloc(currentCP));
$ l5 R9 u5 ^; J- f: Y - // then call ON_ELEVATOR_PICKUP_ARRIVAL9 k+ R& D Z3 m' B$ i1 `5 U6 u& G
- inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_PICKUP_ARRIVAL);
8 U' r( F' O2 U! X2 S5 y - // then wait for the agv to get on
: _% o) N/ }3 Y9 } - inserttask(ts, TASKTYPE_UTILIZE, agv);
8 i v& q; {( ` n/ B5 J# O# m - // then travel to the destination z location
0 e/ X& G! q# E( C1 d- V! B0 Y - inserttask(ts, TASKTYPE_TRAVELTOLOC, 0, 0, 0, 0, destZ);* F5 u+ X+ |, J3 N# {6 U
- // then call ON_ELEVATOR_DROPOFF_ARRIVAL( a5 h2 U: h6 O3 ]$ K5 z: C. I' k
- inserttask(ts, TASKTYPE_NODEFUNCTION, c, 0, 0, ON_ELEVATOR_DROPOFF_ARRIVAL);
' m) Y" o, `: t) @( ` - inserttask(ts, TASKTYPE_UTILIZE, agv);
+ l, N7 ~% P* p" b - dispatchtasksequence(ts);
! W+ w3 m: r9 ~$ U - } else switch (operation) {
0 D0 j: Z* _; Y( M# X# w - case ON_ELEVATOR_START: {
6 o6 t( `1 K# a - // this is fired when I get a valid elevator4 U7 F- d$ H- a$ `% j* g
- treenode elev = param(1);
. d2 b6 j) c4 j: h1 p( K - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);
8 ^- x R+ @4 A* f n
P4 N) O3 H) @! J8 ~8 w9 A- // find the closest floor control point& j" r- N, l( [5 k1 h: G' i! E# k
- int floorCPCon = cpconnection(0, /** \nFloor Control Point Connection:*//***tag:FloorCPs*//**/"Destination"/**/, 0);: J; D+ H: w+ N. c
- treenode curFloorCP = findmin(cpnumconnections(elev, floorCPCon), 1 o; `+ d% _7 ?) q
- fabs(zloc(agv) - zloc(cpconnection(elev, floorCPCon, count))),6 T* g( L5 v! W- y; L- g1 ^
- cpconnection(elev, floorCPCon, count));
! v$ I& f# @* u& }0 {! s- { - // return if there is none$ @% D- r& W6 C8 u
- if (!objectexists(curFloorCP))2 K, `* ^6 ~. _
- return 0;* K0 V! n# f q8 U# [
- 6 ?4 _1 \+ ?5 y
- // get the entry control point+ @0 [4 @3 z2 U: g
- treenode floorCP = curFloorCP;# y! Z( a* f9 a) G; ?4 K% P; [
- treenode curFloorEntryCP = /** \nEntry Control Point: *//***tag:EntryCP*//**/cpconnection(floorCP, "EntryCP", 1)/**/;
' r' Y/ p2 z: |- z7 d. u8 w; N8 Y - if (!objectexists(curFloorEntryCP))& s- y. A, G2 _9 Q4 J/ E4 c1 m5 r
- return 0;0 ~2 a4 ^# X" h o3 U
- treenode floorEntryCP = curFloorEntryCP;
0 v9 Z# k! S+ N [2 E - treenode curFloorElevCP = /** \nElevator Control Point: *//***tag:ElevCP*//**/floorCP/**/;8 \) e% j. O/ @7 C
- if (!objectexists(curFloorElevCP))
( O0 P' i$ ~8 X; s; _; C - return 0;
\6 B- E% n' F4 ]+ ]- Y4 C* ~ - ! e( X7 m: q# b
- double destZ = param(4);: h' e, h) ?5 c! W, }$ T. |2 B
- // find the floor control point closest to the destination floor; ?. B' u4 I" L
- treenode destFloorCP = findmin(cpnumconnections(elev, floorCPCon),
H5 O4 a/ J' _: P3 X2 T - fabs(destZ - zloc(cpconnection(elev, floorCPCon, count))),
& [2 H8 H. D1 u9 m! W. L- m8 g - cpconnection(elev, floorCPCon, count));
9 M# e: e- f2 T/ F2 i - ' O/ S: h& m" R/ T; ]
- floorCP = destFloorCP;
5 r( p4 i& Z& ?2 {' \8 @1 K - treenode destFloorElevCP = /** \nDest Elevator Control Point: *//***tag:DestElevCP*//**/floorCP/**/;
3 t! j+ b- u7 u$ C t - if (!objectexists(destFloorElevCP))
5 X- E; F0 q4 @: ^2 k% @ - return 0;
/ ^, `; ^1 C l! D) ~ - // get the destination exit control point3 Z/ J8 Z/ o, q9 ~) x( n; `
- treenode destExitCP = /** \nExit Control Point: *//***tag:ExitCP*//**/cpconnection(floorCP, "ExitCP", 1)/**/;
! R8 i3 f2 P, R7 N - if (!objectexists(destExitCP)) A o6 Y w+ l0 \$ |$ k( K3 @; [$ N
- return 0;
, `9 c7 x% q2 e, \# A3 n& w- L0 I - ' `0 S- k% s2 B% J0 e- {
! A0 z/ U0 }, k) _- // add a listener for the agv. This will call this nodefunction in the ON_AGV_AT_CP section whenever the
8 U7 o# o! Y; ] - // agv arrives at a node. I keep a state on the agv's state label, and then increment it each time: v$ t9 G1 K, u7 V
- // the listener is called so I know which control point he's at, i.e. entry, elev, or exit.5 [! q' a7 q7 t2 {5 @' f" g( B9 z
- agvaddlistener(agv, c, AGV_LISTEN_ARRIVAL | AGV_LISTEN_INTERMEDIATE_DEST,
8 F. Z3 ]; X% j5 x1 r - agv, elev, ON_AGV_AT_CP, AGV_LISTENER_PARAM_NODE);
& k* ?( T# v% p) s7 _! r -
; P' x6 D l) v: V - // set the data on the state label 4 y" y1 E. h/ V0 E$ G. f) j2 Q/ ]+ z
- treenode stateLabel = assertlabel(agv, AGV_LABEL_NAME, DATATYPE_NUMBER);" U1 q) J# q4 U) E ^
- switch_destroyonreset(stateLabel, 1);+ E. _5 O, k; u8 |+ @1 e r
- set(stateLabel, AGV_STATE_START);
2 }, ~8 y# u b C& n - set(assertsubnode(stateLabel, "ElevState", DATATYPE_NUMBER), 0);
& R6 R9 N& Y; { - nodepoint(assertsubnode(stateLabel, "ElevCP", DATATYPE_COUPLING), curFloorElevCP);
/ a) ^8 |# L+ K% M - nodepoint(assertsubnode(stateLabel, "DestElevCP", DATATYPE_COUPLING), destFloorElevCP);* g6 @* ^9 T$ t6 c- S
- nodepoint(assertsubnode(stateLabel, "ExitCP", DATATYPE_COUPLING), destExitCP);
& p! z, I( ^4 A+ n$ x8 X2 g - agvredirect(agv, curFloorEntryCP, REDIRECT_AND_WAIT);1 |% ]3 W/ Z' g* s; X. w0 x
- return 0;/ i1 V$ \5 T, O. ?' i- u
- }/ r& ^; i5 W0 Q$ H
- case ON_AGV_AT_CP: {8 a: p2 r* r0 n; |! k8 B0 Q
- // this is fired by the agv listener every time the agv arrives at a node.
% m4 O% D e5 E# V" ?8 i: t- b - treenode agv = param(1);
' `& r# @" x* n - treenode elev = param(2);; p2 D1 m, J8 ?+ s
- treenode stateLabel = label(agv, AGV_LABEL_NAME);: ^& {) C- f$ i! n' o- h9 n# h9 `- \
- // I increment the state label, and then switch on it
& W _3 l/ G& e3 B9 X" N) [& E7 N - inc(stateLabel, 1);
& S, S2 y9 d4 n( Q! o5 C9 P - switch (get(stateLabel)) {
) Q6 l6 j$ X( k! Z - case AGV_STATE_AT_ENTRY_CP: {
( M& l# l, |" S* \ - // the agv just arrived at the entry cp
4 Z5 f/ `5 h* l* p7 G - // so, figure out where the elevator is.# m4 a: W V9 d2 I% r1 `
- int elevState = get(node("ElevState", stateLabel));, G1 ]1 d+ \3 i* ^0 T
- // if he's at the pickup floor with his door closed then open the door.
. e( |0 ?, j8 w0 w1 B - if (elevState == ELEV_STATE_AT_PICKUP_FLOOR)
" {; | X% Y$ x' I( |' U: u4 e7 o - nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_PICKUP_DOOR_OPENED);* I; H1 ^, D* G0 W$ V% K, W! _
- else if (elevState == ELEV_STATE_DOOR_OPENED) {
& C0 A3 B N( o$ \! U7 z" c9 S - // if his door is alread opened, then move the agv onto the elevator, i.e. to
! s- T2 {8 G1 f1 T - // the elevator cp9 }0 v# f& X' }
- treenode elevatorCP = tonode(get(node("ElevCP", stateLabel)));2 f" S/ w. u# N
- agvredirect(agv, elevatorCP, REDIRECT_AND_WAIT);3 P/ R3 ^, a, W, [
- }
* z/ b) o& H+ Q. `: u0 ] - break;! O7 P0 c) F1 w' z' L; C, o& e8 x
- }
" U5 c0 E) U) l% T# `: z0 W - case AGV_STATE_AT_ELEV_CP: {
! j/ c, S/ }6 i7 K* s# A& Q- j5 H - // once the agv is at the elevator cp, close the door
* |3 o7 t i/ b- p0 Q& L* H6 J" c - nodefunction(c, agv, elev, ON_CLOSE_DOOR, ON_PICKUP_DOOR_CLOSED);5 Y# D% f2 o @2 M2 N! K
- break;
# P! s. x, U: `8 x! N - }: n& q$ u: b3 C
- case AGV_STATE_AT_EXIT_CP: {; ~* @' @4 A; I: w" \0 m7 W
- // the agv is at the exit cp
( i. B; H& ?; l' q) m - // destroy the listener node because I'm finished listening: S# p! @) v7 n3 D/ R
- treenode listenerNode = param(4);# t+ ^; f* q! [' O* g( ]: K* z
- destroyobject(listenerNode);
1 ?' u0 h' J5 f. @9 u4 U6 W8 h - int agvWait = /** \nWait On Door Close: *//***tag:WaitFinalDoorClose*//**/0/**/;8 l8 P2 x+ o( H7 g5 C
- if (!agvWait) {+ E% ^ E) A# N
- // if the agv is supposed to continue on, then tell him to go to his final destination
! d$ A( ?$ [1 Q6 S2 i! Z) m" i4 ? - treenode destCP = gettaskinvolved(gettasksequence(elev, 0), 1, 2);3 {, w. j5 D+ t1 y$ I
- agvredirect(agv, destCP, REDIRECT_AS_FINAL);& t/ A P8 i$ P' k6 T
- }
) p/ u/ w' ^1 s, c - // close the door) f [$ M1 B' W1 ?+ s
- nodefunction(c, agv, elev, ON_CLOSE_DOOR, ON_DROPOFF_DOOR_CLOSED, agvWait);
9 h# o n3 f. [9 N' m* {- n' }* D - // and I'm finished with the state label so I can destroy it.
g4 o3 ^- ?5 k, \ - destroyobject(stateLabel);
- q. H! a' `" U/ V* A - break;
0 p- i! V8 B8 [! U. ?2 R - }
" G( F/ i6 E/ N# m) R( j - }4 i4 B' z& K* M: P. W2 G
- return 0;
% V: A4 e6 w I$ H; g - }
, J3 d( V2 C+ e" G: t C4 q - case ON_ELEVATOR_PICKUP_ARRIVAL: {
8 _. W4 ^; w) v0 a - // the elevator has arrived at the pick floor
6 N i' b, {' l6 g2 ^; w - treenode elev = param(1);
6 t, U& T4 b- p; Q# g. C! ? - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);# ~1 Z' v( N8 L* D8 g% Q0 |
- treenode stateLabel = label(agv, AGV_LABEL_NAME);, X# e3 _/ o% P
- treenode elevState = node("ElevState", stateLabel);/ }3 e; a1 o- B$ @8 W
- // set the elevator state to at-pickup-floor
& Y1 U4 Z" F/ |2 ?, F0 B* m7 ] - set(elevState, ELEV_STATE_AT_PICKUP_FLOOR);
6 ?5 b3 n& v% P7 O8 \' h - 4 ^# U. d/ U1 E
- int openDoorImmediately = /** \nOpen Elevator Door Immediately: *//***tag:OpenDoorImmediate*//**/0/**/;
2 n) Z `6 ^0 b. B- A - + i/ q' E- @. K2 i
- // if the agv is at the entry control point or I open the door immediately, then open it
1 f1 v3 }5 t, g1 k2 N! e+ v( T5 V( r - if (get(stateLabel) == AGV_STATE_AT_ENTRY_CP || openDoorImmediately) {
" ]/ V3 v$ Y+ i y ]; U5 J, z# ? - set(elevState, ELEV_STATE_OPENING_DOOR);# z6 [$ L. x' J6 {
- nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_PICKUP_DOOR_OPENED);
7 D& C5 U% p- I) y9 ~4 \ _) \ - }
: n9 H; I( ]& k/ h& K |7 V - return 0;; n$ p% @ E) l, R
- }
: X/ B; b4 h) C7 V- Q& I; S - case ON_OPEN_DOOR: {
; y. E9 M& b+ l1 x. X5 ]. ~ {3 g8 x - treenode agv = param(1);+ s' V* o& _* ~
- treenode elev = param(2);
; u. n7 C) \' f# t R+ ^( ^ - int nextStep = param(4);* T5 c7 x9 }, o/ G, l$ @: u
- // open the door based on the time to open the door
- }/ I1 y* B7 P. r9 u6 m# o% V9 Y, Q - double openDoorTime = /** \nDoor Open Delay:*//***tag:DoorOpenTime*//**/5/**/;
( x. r7 A+ w% H, H0 Q9 w, e4 M, ^: X - delayednodefunction(c, openDoorTime, elev, agv, nextStep);
9 m# g; w5 Z9 I( F, Y) _# K' \% q/ k) ] - return 0; r$ o0 o2 k9 b: n( y
- }, n8 ^& V0 @+ ?$ N8 V* ^* @$ w
- case ON_CLOSE_DOOR: {" E3 S% X( H U% s: M5 j3 i" P; D% p
- treenode agv = param(1);
4 F7 s$ T; l( y8 g- t% } - treenode elev = param(2);
& n+ i W- v4 V - int nextStep = param(4);. t9 U! v6 w0 z% w T P
- // close the door base on the time to close the door
& \: z4 ?; ]% r$ ~' ]( W8 X3 {+ ?- Q - double delayTime = /** \nDoor Close Delay:*//***tag:DoorCloseTime*//**/5/**/;
! W% k$ B3 \' l k, O/ l: O6 g - delayednodefunction(c, delayTime, elev, agv, nextStep, param(5));
/ h5 x0 S3 T) z- D3 E7 f) p0 F2 E& | - return 0;
/ a+ D8 ~% j* P/ x% ^; I& i2 f - }
( J( O# ]) y! i7 C/ z S - case ON_PICKUP_DOOR_OPENED: {
7 j6 U9 |( v9 b) m+ U1 z - // the elevator door has been opened on the pickup floor
% J& d& j0 ~' L: z" x3 R5 f" r5 W - treenode elev = param(1);3 Q; A1 X1 [ F" I& M8 T
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);
u! Z9 K" P# _/ P# d& { - treenode entryCP = cp(agv);2 B' j' ?! h9 Z% R7 N, ^ [+ i
- treenode stateLabel = label(agv, AGV_LABEL_NAME);; x# K0 p7 x) {, a w
- treenode elevatorCP = tonode(get(node("ElevCP", stateLabel)));
0 K9 _% s3 i2 p+ a/ n7 [ - treenode elevState = node("ElevState", stateLabel);% y- z* X. b4 l, u' B
- // set the elevator state1 C! G( F& _8 T- ~5 r. T* B% M2 c' ]
- set(elevState, ELEV_STATE_DOOR_OPENED);; ]% ]% Y" c& L$ p
- // if the agv is at the entry control point, move him to the elevator control point
: |2 ~) e5 w6 p+ w- l' ~ - if (get(stateLabel) == AGV_STATE_AT_ENTRY_CP)( ]3 g, I( g4 D! N6 B. j" E
- agvredirect(agv, elevatorCP, REDIRECT_AND_WAIT);
- Z" s' |" Q- T, c7 a6 M - return 0;: H% l3 d% a, w8 Z; b5 K! Y0 T
- }: t/ _6 g* p$ ]
- case ON_PICKUP_DOOR_CLOSED: {6 c+ k6 b1 P2 x3 u$ j2 Z* U9 K, T
- treenode elev = param(1);2 N8 c5 v' J" b: W7 H% g
- treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);! v S! u6 Z% b9 B8 L# j
- // assign the agv to "no control point"
3 B1 n6 @2 ?) o, N. e8 V - agvreassigncp(agv, 0);6 x! T0 Y# j E; T! `" E
- // move the agv into the elevator
, d$ a# Y( T- _$ r7 j/ T, o4 Y3 R - moveobject(agv, elev);5 ?* a* D* \ d5 _# W4 e- B
- setrot(agv, 0, 0, 0);* S# r4 g; B4 O- T) b# m% L1 R9 t
- // release the elevator to continue to the destination floor: p( D' ~) Y$ Z1 ?
- freeoperators(elev, agv);
! k, r0 f: X1 G6 @* D4 U, F - return 0;
+ `5 ]( T" R/ c& Y2 q( L - }
+ y6 L7 w6 \$ m% ] - case ON_ELEVATOR_DROPOFF_ARRIVAL: {; E% D5 @' J( k( ~! Q- {
- treenode elev = param(1);
+ D& [" M+ R9 C k5 V. V* g0 W& n$ \ - treenode agv = gettaskinvolved(gettasksequence(elev, 0), 1, 1);2 ?4 }# _/ {- ~* l/ E N
- // when the elevator arrives at the destination floor
. @8 @. x1 c+ c4 u0 U# g7 y - // move the agv back into the model% k6 h; u" P) z( V) ]
- moveobject(agv, model());7 Q' O% ~% D" w7 O9 Y. F* h4 L
- // reassign it to the destination floor control point
3 i9 N! S- z/ o% o/ `; s - agvreassigncp(agv, tonode(get(node("DestElevCP", label(agv, AGV_LABEL_NAME)))));3 Y9 z4 J) t, Y' w/ g0 V0 c r
- // open the elevator door$ t) }1 M Y0 V' g& ~" i
- nodefunction(c, agv, elev, ON_OPEN_DOOR, ON_DROPOFF_DOOR_OPENED); B/ a* f( s( b$ W
- return 0;
; M6 [) k8 y( v- ^8 u - }
6 z' V. I# [4 M# e - case ON_DROPOFF_DOOR_OPENED: {$ U& J% r( c+ p1 n
- treenode elev = param(1);
A/ t1 g4 M# v& t - treenode agv = param(2);
* b; v* I G4 G8 J8 O6 b- [' c: ] - treenode agvLabel = label(agv, AGV_LABEL_NAME);
% {+ ]5 f8 ?" J' n - // once the elevator door is opened on the destination floor, $ D, D( Q' D& V' ~
- // redirect the agv to the exit control point
) m7 G1 p3 G4 \. A i* V - agvredirect(agv, tonode(get(node("ExitCP", agvLabel))), REDIRECT_AND_WAIT);! y* r, b# q3 A1 s: k+ {
- return 0;) h- f0 t3 ~8 p/ u
- }# e2 r9 H% A: C! |$ }: k
- case ON_DROPOFF_DOOR_CLOSED: {) @+ P8 k$ r+ H& p
- treenode elev = param(1);/ J j* `1 B# ^
- treenode agv = param(2);; B8 X' L( q0 U9 w! e6 B- U
- int isAGVWaiting = param(4);
: k4 x' V: \- L# I: j - // once the door is closed at the destination floor,
1 I! z8 _$ N7 }0 Y0 V0 E8 @) C: X - // if the agv is waiting, then send him to the final destination- Q1 O M& G. ^* E) k. @
- if (isAGVWaiting)4 T/ P2 r4 B# C
- agvredirect(agv, gettaskinvolved(gettasksequence(elev, 0), 1, 2), REDIRECT_AS_FINAL);3 G& V# m9 Y, i& B# D& |5 X [* `
- // release the elevator to finish his task sequence+ h5 O; K% }9 J# s; g! E& I4 a8 T
- freeoperators(elev, agv);; C( i' C$ k- n7 Z: N5 h- x
- return 0; q$ P! I# T* ~! m2 }. F0 _$ z
- }
7 o" c0 R% c) Q: L) S N - }7 W( Y0 J* m" h8 _0 i
- } //******* PickOption End *******\\/ X/ A8 H* P6 V3 ~% d* w
- & T0 m* Z" S" G& k; w
复制代码
t$ B" p" c' R# q* ?9 z$ h( q" s
: _- S4 N* G0 A B办法2:使用工艺流程模块完成 |
|