设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14588|回复: 2

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

[复制链接]
发表于 2009-4-4 23:58:32 | 显示全部楼层 |阅读模式
5仿真币
想请版上的人帮我看看我这段code中的一个错误,我刚学Automod没多久,实在找不出错在什么地方了,谢谢8 B5 e/ b, \. Z" ~: b% ?; T

3 e9 A0 \5 k# e% I: K我的问题是,在每个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中的数值,不知道会不会有什么不妥。1 S( j1 ]2 W; Y& a6 _
. E% ~' u$ i& n* O& s6 S' K+ W
begin P_read arriving
: [9 ?/ g, J) h3 [- o0 F- q    while 1=1 do begin+ u9 ~$ @4 X, h' F0 B! S' t8 i
        read A_tote from "data.txt" with delimiter "\n"
7 J- m$ ]! \8 |# p: P& k        read A_time from "data.txt" with delimiter "\n"5 z# t' r, s$ y7 L- R3 B, Q5 m+ {$ |
        read A_leave from "data.txt" with delimiter "\n"  F0 y* H, N- _, X7 ^
        read A_picks from "data.txt" with delimiter "\n"
0 ~/ q' {/ j# v8 I        set load type to A_tote
4 Q' p$ x. r: T1 W) [- `        if A_tote="tote 1" then set A_induct to 1. B% U# }0 q% ^# \$ h
        else if A_tote="tote 2" then set A_induct to 2
, i8 m7 |$ ]1 }' W6 I/ _/ T            else set A_induct to 3   
, p0 b% J3 M/ b" {+ r/ }        set A_i to 02 O, h4 K4 I! f3 N' O
        clone 1 load to P_induction
( r/ |7 i+ T' }        wait for A_time sec6 `, l, R7 ~9 \% E2 J; J8 o: y1 l
    end; T5 ^. [, M' r" e: D. ^1 O" c
end$ z8 @. S  U! j
: X0 g8 G* S: s2 t% ?- N) ]
begin P_induction arriving$ e7 H2 {3 r  Q' o+ C6 @
    if A_induct=1 then clone 1 load to P_pick1
: e7 ^# N$ P4 q2 D! A    else if A_induct=2 then clone 1 load to P_pick2
4 q& |8 S2 Q# e7 v7 k1 I! @( o        else clone 1 load to P_pick3
9 \  t8 ?* j0 ^0 R% iend1 x+ u! w. R' ~; ~; `
( n9 Z1 o9 A: z2 Y- ~1 m
begin P_pick1 arriving
  X7 ]$ z" ~" e6 a! D  e) F* s    set A_i to 1
1 S: T% ~) w2 u    move into Q_induct19 N+ X0 F8 Q$ e
    move into pickaisle.induct1
9 ^$ q, Z9 D' A9 a) k5 b' ]( k: j    while A_i<=30 do begin
& W8 {, J- ?  Z- @, T3 A1 @4 U- }        travel to pickaisle.con(A_i)
4 e* C1 @5 Q4 B% w. S2 J        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
: X) v* H! ~# L# l* g        else wait for 10 sec
0 t+ l; l5 O+ N  ?" J        if A_i=A_leave then send to die
! y5 n1 f4 K$ f, d7 T/ W) F8 l        else inc A_i by 14 V6 F0 T9 T7 R* i1 C
    end( `. W" o7 \3 N$ v* a8 Y
end
- D* Y6 A2 X- S2 b  C  B
5 G/ B, \5 m. b6 x+ O' kbegin P_pick2 arriving
) _1 ?& {1 m6 @6 _    set A_i to 11
5 Y- g: R$ Z5 u  e4 c& i; J1 I6 {4 b    move into Q_induct2
; r4 Y8 T; a/ E2 |    move into pickaisle.induct24 \- F- I  y2 u" v1 Q
    while A_i<=30 do begin
1 k- J! v& b! z        travel to pickaisle.con(A_i)' O/ k9 W0 Q2 U
        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec6 U/ t% B0 B# e0 R* s; L
        else wait for 10 sec
' D" V: R  {7 u        if A_i=A_leave then send to die
* T' O9 z) R; s+ O% ]3 o! z        else inc A_i by 1
1 k3 v4 I0 O8 ]' a    end
0 ]% N3 ?3 I5 @- h5 v# vend' ~5 o' n( I! N: r  j5 f: H

! j, w3 @0 a/ y: S3 {- [. |$ wbegin P_pick3 arriving4 S) X, }7 C7 |8 s+ D: K: H3 o
    set A_i to 21
& s- x8 T8 t, ^+ ]  E    move into Q_induct3
7 R, Z( h6 r1 Q3 ], l    move into pickaisle.induct3
- p$ w  Z; a7 N8 m  F& D    while A_i<=30 do begin
' t* I) y$ W) g) W        travel to pickaisle.con(A_i)
, y# y% X* W0 Q# {0 C        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec" N% A: `, l; }4 I
        else wait for 10 sec
" u/ `' q' _) k6 d$ H; x        if A_i=A_leave then send to die
* G1 f9 N' b% H! L2 a7 b! L* i8 v# W        else inc A_i by 1
1 l  z+ W8 d9 Y% E( E+ [* o8 {$ K; G    end" e% K8 w5 O& s$ j0 @- p2 o: ?1 `
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是个什么东东?; w* Q4 t  a9 d5 X3 v5 B
move into后面,应该是一个station或control point,或者Queue/Container/Vehicle/Segment之类的东西。看你的报错信息,这个induct是个path么?2 q9 M, i# C9 {8 o7 b; b/ X

; H; `* \1 f, N/ C0 e7 eAutoMod Editor的语法报错信息,有时候会指在下一行,必要的时候要把上下几行都看一下。
0 K3 v( Y( h! v+ F2 d4 N. P: x, E+ G' q& G  [; S2 u/ m0 ^0 `5 p: w
另外,你的几个P_pick是完全重复的,建议以如下方式修改,可以减少代码编写量:# ?) t% }8 z& R+ Q
1. 创建一个Process:名称为P_pick,number of Processes为3,其它按你的需要设置;删除那几个P_pick;% y; v1 Y; O$ f) y0 Z0 g
2. 创建一个Queue:名称为Q_induct,number of Queues为3,其他按你的需要设置并放置;删除那几个Q_induct;9 }' F& W% F/ K8 u% e; j
3. 以如下方式改写P_induction和几个P_pick的arriving procedure的代码:
/ ?4 U7 A, A1 w- i" qbegin P_induction arriving
; \) p* j" q& Q- y" I8 w    clone 1 load to P_pick(A_induct)
- C6 q4 x0 X" _% M) dend最大的系
$ |; Q3 a/ p5 u5 j: Q' y8 f7 @7 b% M2 _, n  D( V
begin P_pick arriving
) I9 o) t  {3 n* K    set A_i to procindex * 10 + 1, |; x: `- N2 T2 y# X" p
    move into Q_induct(procindex)0 Z9 c. U+ O7 ^2 i. n
    move into pickaisle.induct(procindex)
8 w" `" F$ ^0 H# u    /*check the type of pickaisle.induct(i), for your last problem.*/
! p9 T5 @" Q# z, O: j" |# |0 f$ d! `* R7 P% z! p, T
    while A_i<=30 do begin' W) l7 E7 }# W7 D8 Y0 r- {
        travel to pickaisle.con(A_i)
3 g0 J( x9 D  u7 r( `        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
9 ?; x* z* {" e( ?6 Y% [        else wait for 10 sec" A* i5 e8 T2 q; a
        if A_i=A_leave then send to die5 [* P# ]( J3 ~) L9 e: Z
        else inc A_i by 1# d, {. `! F, y  k8 ^% i
    end
4 q9 }  N, g5 t& z7 x" d, y- gend
; x* H8 O9 a' I5 w& r) s- Q9 Z% s- x9 r% M- z5 g
其中的procindex为整形,代表当前process的序号。
0 u& |- f. \6 _1 U3 D# c+ z' ustation和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-7-18 01:35 , Processed in 0.013347 second(s), 14 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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