设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14284|回复: 2

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

[复制链接]
发表于 2009-4-4 23:58:32 | 显示全部楼层 |阅读模式
5仿真币
想请版上的人帮我看看我这段code中的一个错误,我刚学Automod没多久,实在找不出错在什么地方了,谢谢# l  v7 Z& E  [3 v0 c
" t8 b( o  r7 j% j9 Q; k' y6 ~; }
我的问题是,在每个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中的数值,不知道会不会有什么不妥。
: ]& g9 N; e' n& c  u% U, o4 s7 Y  i# A  w, A0 b/ u( n7 p
begin P_read arriving! {; q# t+ Q6 z* A" E8 `
    while 1=1 do begin
$ f% f- R6 v7 G, T' f% U        read A_tote from "data.txt" with delimiter "\n"
  {; H  y9 x4 v0 P4 ^+ A        read A_time from "data.txt" with delimiter "\n") ~2 T) K, O7 t; a# d6 i- s
        read A_leave from "data.txt" with delimiter "\n"
5 g; C% B" b( E1 h" Z+ \        read A_picks from "data.txt" with delimiter "\n"8 M; A! N! r% ?9 d# t/ o
        set load type to A_tote
3 W+ j' {( G/ i$ C        if A_tote="tote 1" then set A_induct to 1
# e5 [: B) N) l/ n0 o( w! ]1 `        else if A_tote="tote 2" then set A_induct to 24 J3 a8 T3 b  u! L, v% c, T  \) H# s
            else set A_induct to 3      K9 Z2 Q# S0 t. I
        set A_i to 0
" i/ Z+ I( c2 p& B9 X( B' i        clone 1 load to P_induction
: y8 c+ A' r6 `$ H        wait for A_time sec
5 i! k5 c* O! j5 [0 Z9 h0 M/ X    end
0 w. a7 e, |' Send# Y+ R7 @" _6 |. u! @( r/ z8 _
/ @( q' w5 ]' A, y3 v$ ]
begin P_induction arriving
. l( c6 c/ J4 c# r0 p    if A_induct=1 then clone 1 load to P_pick10 n1 k6 {/ W8 h: A3 k3 a
    else if A_induct=2 then clone 1 load to P_pick2" U) q! s4 `$ Q1 [+ O6 S
        else clone 1 load to P_pick3: f/ F/ \# f! R( z" ~4 f9 r7 G
end- |. m; z' [6 \% m- y- d" ~! k

7 H$ M. f; i4 j3 y7 W2 |begin P_pick1 arriving5 G2 y/ m/ ?$ X' d: q
    set A_i to 1
/ o# F  ?  B% Z6 p& @    move into Q_induct1
1 ~/ W8 m& Z- ~9 G5 e3 s7 B" R    move into pickaisle.induct1
! D9 M) W# x( i- h4 z+ T; X" @    while A_i<=30 do begin
, a# B  o9 M: y        travel to pickaisle.con(A_i)
0 N. \/ w; E% @; B        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec8 O4 Z. z. Y& U4 h; `
        else wait for 10 sec- K- R2 _1 q5 F% E
        if A_i=A_leave then send to die
1 u4 _3 ~$ u5 n0 r2 V+ _; Z2 S        else inc A_i by 1( c+ f2 x( m( s# V% P
    end- S7 D( `3 r% x7 D
end
: q1 P- }/ n- d( D3 j( m# \6 F( p, U: z( d1 W' ^7 j1 N8 f
begin P_pick2 arriving
% }( N4 n. w5 K( Y2 K! _) J  y4 K" c. b    set A_i to 11; m; ?& g6 N1 O( Q% {
    move into Q_induct29 s0 h5 N& E+ O: l: D; \
    move into pickaisle.induct2+ J; n$ M# a2 V- x! I# K
    while A_i<=30 do begin
* L% j& r2 A( x# e        travel to pickaisle.con(A_i)
' e9 b5 v! k8 \9 n; `        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
% D/ l9 P; n3 T        else wait for 10 sec: a+ @; W8 q: b) M
        if A_i=A_leave then send to die: ]8 x( ?# H& j* Y( L
        else inc A_i by 1- p  @. h" v) y# t$ u% a
    end; I9 d5 n1 v& L; Y
end4 g: {* h0 B) ]/ x9 M
, I4 W- W; q0 J4 {  V# d
begin P_pick3 arriving
% U4 v9 N$ V: }- W    set A_i to 21
: O; h* s- O+ v" c    move into Q_induct3
; d/ P( f. ~$ p" B9 u    move into pickaisle.induct3
2 {- ?+ B5 U" H/ {    while A_i<=30 do begin  n2 C7 n3 ?$ U" S
        travel to pickaisle.con(A_i)
. D* v6 T2 K- T        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
9 p+ ]/ \3 \7 B! l4 q! U0 F/ [        else wait for 10 sec
5 }+ j0 U; W7 H$ Q7 T        if A_i=A_leave then send to die
7 U/ M1 J" K# B0 [, m        else inc A_i by 1
% W; |# C5 X' ^6 v$ m' Z' S+ X    end( b3 _5 [; o: i, y+ a
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是个什么东东?
$ X5 N- W0 S0 p& @move into后面,应该是一个station或control point,或者Queue/Container/Vehicle/Segment之类的东西。看你的报错信息,这个induct是个path么?
8 r# U# t5 P9 W2 n. T+ ^  i
- \5 ?6 |; k- |1 W- v8 C; l  o9 wAutoMod Editor的语法报错信息,有时候会指在下一行,必要的时候要把上下几行都看一下。5 T7 ^2 b0 E$ S& }! i0 m+ L( `
5 T- k3 B  H. T# _- ^" K% N% ]# S
另外,你的几个P_pick是完全重复的,建议以如下方式修改,可以减少代码编写量:
7 y$ b% ]8 l# ^) i0 o6 |; B# Q  u1. 创建一个Process:名称为P_pick,number of Processes为3,其它按你的需要设置;删除那几个P_pick;9 b* }8 S! O7 l; [, t% F* [) M
2. 创建一个Queue:名称为Q_induct,number of Queues为3,其他按你的需要设置并放置;删除那几个Q_induct;
# ^  }4 G/ H. l. ], o8 X3. 以如下方式改写P_induction和几个P_pick的arriving procedure的代码:
5 k) t( y* D+ J4 mbegin P_induction arriving# G; s: v, _5 h' e# I* k
    clone 1 load to P_pick(A_induct)$ i( r& `) s" M* l3 A# L5 c8 Y5 f% @
end最大的系& e' a! k5 s- }2 h
. b) E3 r5 V- f9 Q4 [+ \% [: v
begin P_pick arriving
+ k# B: m' ]4 `- s  G% E! s    set A_i to procindex * 10 + 1' t2 ?1 J: }" M" G2 c
    move into Q_induct(procindex)
$ d0 G: i# ]) u% H" D    move into pickaisle.induct(procindex)
; Q) P. j. K* r    /*check the type of pickaisle.induct(i), for your last problem.*/1 H& o6 [' N. z3 Q2 T  ?9 I- ], ~
. E7 N! Z5 _7 _4 W9 S) Q5 r' C) e
    while A_i<=30 do begin4 v/ _9 Z; y, a' G# l; e' H7 _! ?
        travel to pickaisle.con(A_i)
) C, S5 e2 {& F- C8 g. l& O        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec& H# y1 b. E5 F: u5 Z% g$ l
        else wait for 10 sec- w) e1 C% I( @; T* n. F$ ?
        if A_i=A_leave then send to die" Q9 W) `. d0 x( L* h1 b3 R
        else inc A_i by 14 p0 N  O  o' u$ Y
    end
: g8 @) @) S+ L5 i( O( g" aend0 P4 L$ a0 W) y
9 s% f! ?: {+ Y7 T/ y; j
其中的procindex为整形,代表当前process的序号。
( W1 o6 V* D  tstation和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-6-28 06:02 , Processed in 0.014509 second(s), 14 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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