设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13942|回复: 2

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

[复制链接]
发表于 2009-4-4 23:58:32 | 显示全部楼层 |阅读模式
5仿真币
想请版上的人帮我看看我这段code中的一个错误,我刚学Automod没多久,实在找不出错在什么地方了,谢谢
5 k( \: C) y1 O6 [) H6 O2 K* m: b  z0 U1 t3 y, T+ M
我的问题是,在每个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中的数值,不知道会不会有什么不妥。
9 }) h1 z0 t% w- p, {: H, R' h
9 T3 V/ J0 d0 D7 e6 b  Ibegin P_read arriving  Q9 t4 K. @! ?6 N
    while 1=1 do begin
) u6 r) S9 `9 r4 b& W" C. z( P9 W6 I        read A_tote from "data.txt" with delimiter "\n"
6 Y' M/ Q4 h1 @        read A_time from "data.txt" with delimiter "\n"5 }/ O& j# T7 i7 d
        read A_leave from "data.txt" with delimiter "\n"
0 U$ Y* H4 |6 u. e        read A_picks from "data.txt" with delimiter "\n"
# o5 X6 q  v- W& u        set load type to A_tote- j1 |, ]! D5 h
        if A_tote="tote 1" then set A_induct to 1
. P4 f! Q9 |% f        else if A_tote="tote 2" then set A_induct to 2# a$ ]+ I  s8 ^
            else set A_induct to 3      K( ?, y2 `) H0 L' l
        set A_i to 0( H5 \; p$ I6 G& T- U# D% h
        clone 1 load to P_induction" H" F3 j* N# o7 X3 {) [
        wait for A_time sec$ Y+ X4 h% Q  ~- I) h8 i
    end
! Z- b' S+ o7 h5 J6 J# Wend2 y5 L# h: R1 D6 X, ^/ o6 C
. ~5 W+ f7 ~% j1 `! u* O% J
begin P_induction arriving
4 [1 x% L3 Y* C5 Z# M& f& p    if A_induct=1 then clone 1 load to P_pick1
5 a* Z" J/ @" X    else if A_induct=2 then clone 1 load to P_pick2
! F5 k, F% B* A2 ]) q3 T0 ~        else clone 1 load to P_pick38 k' t) X1 K) n1 [$ w
end
) A/ u- n/ i4 z4 L0 J* W) i+ B( t2 e& Q5 u: {
begin P_pick1 arriving
2 S, F9 C7 n% J' ]9 @+ F6 D    set A_i to 1
. r/ g6 R( _4 ?" n0 p  E, U! h$ A( i    move into Q_induct1
" Y, s( F. _% m; S    move into pickaisle.induct1% U2 U! {  a% ~/ H$ l  i% z3 M
    while A_i<=30 do begin
# R" ?1 k- y: J/ q  o        travel to pickaisle.con(A_i)
* A0 ?, G" i' L        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec' E$ }; b8 _5 L& o
        else wait for 10 sec
! I, H% J" N8 V0 n& F: j        if A_i=A_leave then send to die  u+ K4 \. W8 E$ S" Y3 e- ?
        else inc A_i by 1
: N5 J! C+ q3 W2 B) R    end: I5 H3 N0 j6 a) t9 m
end. f7 d( U7 @) f2 K, w; a& a7 R; v2 }

" y" E' L3 Q9 b$ Xbegin P_pick2 arriving5 |+ D  c- m3 B
    set A_i to 11
: n/ K7 E% ~8 y& ]  W# p, ^    move into Q_induct2
: {9 ?3 ]9 O' b1 H    move into pickaisle.induct2
" [* Y8 X  I# P. L4 h1 m    while A_i<=30 do begin4 Q: q# h5 ?- w7 W
        travel to pickaisle.con(A_i)4 {- j2 B( U# h6 f: |+ y% y3 e5 P, ?
        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
3 M/ g. K' Q/ o5 }- c' L1 x/ M- E        else wait for 10 sec7 t% ]& l5 ^) H1 ~: ]7 E# A
        if A_i=A_leave then send to die) }3 r2 n- `8 e6 Y% j9 {; w# K
        else inc A_i by 1
/ @4 c4 |# L# \0 B$ ~    end8 }6 X8 u. L1 ^% R
end
/ m) C& p( [; }9 B* N1 Y0 f, x
, P3 {3 z9 d% \0 D8 ebegin P_pick3 arriving' T' @' J5 b, H
    set A_i to 21: L" O' P0 ?* F/ V2 }
    move into Q_induct3
% z7 T- D6 p; r' w0 e    move into pickaisle.induct3
: y) _$ j0 ~8 y7 n, j7 E    while A_i<=30 do begin0 j4 c) A0 {$ f+ Q% Y
        travel to pickaisle.con(A_i)
1 Q4 O! N7 y$ Y* R& t* r4 o        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
( O: t: h4 b; l" @6 c, d& {        else wait for 10 sec' i+ B6 r9 o9 ]9 c
        if A_i=A_leave then send to die
8 M$ Z" b7 p3 M, ~        else inc A_i by 10 X; A4 v! X! D# U+ B  T
    end
. M. _2 d( J  R$ Dend

最佳答案

查看完整内容

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是个什么东东?: q9 e5 C) Z  Z0 K' g! m5 ^
move into后面,应该是一个station或control point,或者Queue/Container/Vehicle/Segment之类的东西。看你的报错信息,这个induct是个path么?
0 Z% E$ ]/ N% o1 M5 Y4 h
# c8 R& |6 x! H+ x: K7 V! b6 ^AutoMod Editor的语法报错信息,有时候会指在下一行,必要的时候要把上下几行都看一下。4 o. P0 }* w0 s5 p' {

4 H' j. I2 ~, U; e另外,你的几个P_pick是完全重复的,建议以如下方式修改,可以减少代码编写量:  q, `. n( M- V7 v2 M
1. 创建一个Process:名称为P_pick,number of Processes为3,其它按你的需要设置;删除那几个P_pick;4 r/ b# X0 ~: r1 t/ J
2. 创建一个Queue:名称为Q_induct,number of Queues为3,其他按你的需要设置并放置;删除那几个Q_induct;
7 P* ]' ]+ b7 S3. 以如下方式改写P_induction和几个P_pick的arriving procedure的代码:
  d3 H/ U% w4 z) @$ R) Z( @begin P_induction arriving
1 m  C# T4 ^) j# t* ?9 A8 Q. u0 k& A: m    clone 1 load to P_pick(A_induct)0 F; R; a$ c6 P# M) K& u: C
end最大的系. i# A7 c: f! Z! _! j
: }& u! q2 v& ]( w
begin P_pick arriving
6 e1 M2 T5 a5 o! u    set A_i to procindex * 10 + 1
3 l3 O$ t- i! m& o    move into Q_induct(procindex)
5 E" b& T6 M9 f    move into pickaisle.induct(procindex)( \: f/ t5 b7 ^& h- _8 ^" q
    /*check the type of pickaisle.induct(i), for your last problem.*/
# H0 [% n! n; k9 D6 P. S4 m
) H: Y$ }/ L: G! [    while A_i<=30 do begin) ?6 {, V2 [. V- Q: r9 }. U3 f$ ^, p' H
        travel to pickaisle.con(A_i)
: f) A) E. Z$ J* C0 x7 X; ~        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec: c4 v+ q, X4 N' I; e, l
        else wait for 10 sec
( r, r2 x4 U. N* P        if A_i=A_leave then send to die
1 e" x/ l5 P. K; d, K        else inc A_i by 1
& S+ S; B1 J+ l0 s. C( B7 X    end
6 p* L% H. L3 J: r+ Wend& Y7 N. L  i- U3 S' n! {
  ^( W6 L$ [! C: z: w7 O
其中的procindex为整形,代表当前process的序号。
& h' H( s7 |; K, k  d. a- y5 x' pstation和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-5-21 19:04 , Processed in 0.019249 second(s), 14 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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