设为首页收藏本站

最大的系统仿真与系统优化公益交流社区

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15312|回复: 2

[求助] Automod Syntax 编译的一个问题

[复制链接]
发表于 2009-4-4 23:58:32 | 显示全部楼层 |阅读模式
5仿真币
想请版上的人帮我看看我这段code中的一个错误,我刚学Automod没多久,实在找不出错在什么地方了,谢谢# E* V4 V$ E/ p5 h; @1 G  H) b, @+ g

' N! R, k4 z* g我的问题是,在每个P_pick的process中的while循环内,总显示错误Expecting QueuePtr or Location, but found PathPtr. 在我定义所有的attribute的时候,从来没有定义过任何QueuePtr or location or PathPtr,为什么会出现这种错误呢。 我这里面A_picks是一个30x1的array的load attribute,我想用A_i这个load attribute来读取这个array中的数值,不知道会不会有什么不妥。
. j, r. u* E: n1 z: ]/ A# \, l, a- s8 F0 h
begin P_read arriving
* F3 e" m( l, O    while 1=1 do begin  M8 Q- c5 w, e( ?$ m
        read A_tote from "data.txt" with delimiter "\n"' ~. F# N. v) W% K, [1 k
        read A_time from "data.txt" with delimiter "\n"
& S" M5 V6 F' F$ u4 o% [: ?; B) w        read A_leave from "data.txt" with delimiter "\n"
1 A( V" X# ^2 i4 ^        read A_picks from "data.txt" with delimiter "\n"
( l  U' C! Q* Q  d5 V        set load type to A_tote* Q! E$ u9 w, j* g1 Y' G9 S7 [' r
        if A_tote="tote 1" then set A_induct to 1( y+ a3 |$ m/ {: b4 x% ]# x1 q
        else if A_tote="tote 2" then set A_induct to 2
' T7 L. G" T9 @0 \7 `            else set A_induct to 3    . l; A7 I3 _4 S6 B
        set A_i to 0
2 I3 W, u" I$ }, d        clone 1 load to P_induction
  D( p$ Y) S: [3 ^* d3 m        wait for A_time sec2 T  K- e( v# L* h; B: M
    end
0 o' e; s) }- w$ |/ cend0 c' Q' O( M1 n8 i3 ?

+ ^0 @- B5 x0 fbegin P_induction arriving/ k1 e* s  Y+ y) F1 ]/ o1 P: C
    if A_induct=1 then clone 1 load to P_pick1
% ]8 {" v5 q0 z) W    else if A_induct=2 then clone 1 load to P_pick2
$ Z2 c! G: p, _0 g! m9 B        else clone 1 load to P_pick3
, K3 `2 C3 f5 B! i+ ]$ r8 mend; F! ]7 K) _% S* M% ~

- Y  K( b! P6 V0 W8 dbegin P_pick1 arriving: U$ w* {3 d* I7 {- B# Q# j
    set A_i to 1! P0 s) N/ q% K5 l- U& T" Q$ I+ V
    move into Q_induct1
6 k  E* u% B" l    move into pickaisle.induct1
/ ]! H; Z+ t6 ^, N! ^/ k% R    while A_i<=30 do begin2 m4 n- ^& j0 T0 N
        travel to pickaisle.con(A_i)" W8 z0 `3 d: r# G: Z6 J+ U* s
        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
  h; k* f( I$ L$ \5 B* @3 H: R8 Q+ s        else wait for 10 sec
7 ~' v" [. ~( T$ ]) M9 \; g        if A_i=A_leave then send to die
+ x! V  y6 x! J0 ~- s' W& E        else inc A_i by 12 m& M1 M8 }3 E" b; ]" i& m' I. p
    end
+ x1 ^4 l9 i( y6 u& a5 [! f9 hend/ `3 R6 _7 r* I9 s
0 X# i4 P- N  Q. x! v
begin P_pick2 arriving8 t" J/ E6 C9 v  k9 p7 _+ h
    set A_i to 114 Z( K7 o) w& _! S* H* [3 b
    move into Q_induct2
% Q! T+ E1 J5 Y& o9 b* v  W+ ^3 i: d    move into pickaisle.induct2
; i; @; r: w/ [: K2 Z. K0 D/ y    while A_i<=30 do begin
5 O" R* o( o6 `/ E4 z: ^- }        travel to pickaisle.con(A_i)5 m& G' K# u, y0 V$ ^0 a" O5 c
        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
* I% m3 @3 O5 E* c8 J: {( I        else wait for 10 sec3 N7 A) W" ?; Y9 T
        if A_i=A_leave then send to die
$ z6 S+ J) r/ ~9 G2 B! I        else inc A_i by 1" u. X: P$ W% C3 |$ y+ P1 A2 e
    end) @, V* E9 Z* w) B$ m! A" `; f
end
% P7 a* u; c1 V0 {% |( h9 R: U. n, Q0 g4 e" o3 i5 e
begin P_pick3 arriving6 a+ L" R1 h$ Y6 E
    set A_i to 217 I" P3 ?$ V! t7 w  \+ [0 X3 o
    move into Q_induct3
1 Q, U( d1 D% X& A3 @    move into pickaisle.induct3
& A  u: s$ g+ Z8 i1 c1 x    while A_i<=30 do begin- @2 q0 d! P5 j5 ^4 Q
        travel to pickaisle.con(A_i)9 v2 T6 \/ E# r
        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec% `5 [3 y  [5 y: @
        else wait for 10 sec
2 s& \4 W) E% y8 S% s5 l6 ?        if A_i=A_leave then send to die' R1 i0 H$ L7 e8 h$ ?0 W
        else inc A_i by 1) \  Q( ~$ U& J8 c3 b' G
    end# e8 E9 F+ K. T
end

最佳答案

查看完整内容

pickaisle.induct1/2/3是个什么东东? move into后面,应该是一个station或control point,或者Queue/Container/Vehicle/Segment之类的东西。看你的报错信息,这个induct是个path么? AutoMod Editor的语法报错信息,有时候会指在下一行,必要的时候要把上下几行都看一下。 另外,你的几个P_pick是完全重复的,建议以如下方式修改,可以减少代码编写量: 1. 创建一个Process:名称为P_pick,number of Processes为3,其它按你的 ...
发表于 2009-4-4 23:58:33 | 显示全部楼层
pickaisle.induct1/2/3是个什么东东?1 w# w. K; U: d3 x
move into后面,应该是一个station或control point,或者Queue/Container/Vehicle/Segment之类的东西。看你的报错信息,这个induct是个path么?
: g7 f% Y# c% ]: c- J- U( X
' G- e5 n! L; |+ A! }8 PAutoMod Editor的语法报错信息,有时候会指在下一行,必要的时候要把上下几行都看一下。) P# N2 d! n. y7 Q
3 K/ V( l% f9 C' e( l( _8 l
另外,你的几个P_pick是完全重复的,建议以如下方式修改,可以减少代码编写量:
% C  a8 L  d( s' L" R# u1. 创建一个Process:名称为P_pick,number of Processes为3,其它按你的需要设置;删除那几个P_pick;
" A3 P' L- r7 n4 x+ \* U2. 创建一个Queue:名称为Q_induct,number of Queues为3,其他按你的需要设置并放置;删除那几个Q_induct;  j5 q" j" t4 X2 b# s+ ?
3. 以如下方式改写P_induction和几个P_pick的arriving procedure的代码:
5 {% l1 o! i4 M7 U7 jbegin P_induction arriving% R" r. \* L$ s6 g
    clone 1 load to P_pick(A_induct)! @/ Y4 @3 i. O5 O
end最大的系
4 K6 o' A5 d1 `9 A: \  l" h& O2 i
begin P_pick arriving+ d9 D* y) H0 j3 X3 L" ?0 e
    set A_i to procindex * 10 + 18 N8 p6 s6 T$ H" T$ T* e1 a2 E
    move into Q_induct(procindex)
: Y- ]! o& R  d) E1 S5 i    move into pickaisle.induct(procindex)$ |- n1 D9 q5 ^; y
    /*check the type of pickaisle.induct(i), for your last problem.*/
) M2 ?, i2 x* O) N! w; @+ a) z( l3 N4 }+ |" w! ?9 o9 y
    while A_i<=30 do begin; a% Q- ^7 {! g! t! K
        travel to pickaisle.con(A_i)
+ c# o* {8 M: p, i  }) M        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec, I# N7 k$ D  l
        else wait for 10 sec$ ?/ D. E0 b% i; s0 ^
        if A_i=A_leave then send to die5 T% m$ k; _  a) l* Q
        else inc A_i by 1# k4 f4 `, i+ c6 M
    end! C9 ~. N2 e$ @. c: q
end
4 y! p( T) g# }9 w5 T  x8 W; Z
" _/ e& i7 q" f9 ]* u其中的procindex为整形,代表当前process的序号。
0 k" d3 {" C5 \3 b" P3 Wstation和control point只要以数字结尾,都可以直接用作数组。如pickaisle.induct(procindex),当procindex为1的时候,和pickaisle.induct1是等同的。
发表于 2009-4-20 15:33:32 | 显示全部楼层
你的主要错误应该是在move into pickaisle.induct或者 travel to pickaisle.con这两个类型的语句中,因为你的编译说明的意思是类型混淆,你查一下报错的行数,应该就能找到问题,其他的问题慢慢调吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|SimulWay 道于仿真   

GMT+8, 2026-9-1 09:16 , Processed in 0.017011 second(s), 14 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表