设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12133|回复: 2

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

[复制链接]
发表于 2009-4-4 23:58:32 | 显示全部楼层 |阅读模式
5仿真币
想请版上的人帮我看看我这段code中的一个错误,我刚学Automod没多久,实在找不出错在什么地方了,谢谢% Z2 D- V5 |" s6 `$ ^: u4 p
! Y: J; H- H; v$ m+ _' p, O! T0 ^
我的问题是,在每个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中的数值,不知道会不会有什么不妥。
3 J1 R. h' V+ b- E  C6 _0 {, s2 @, H! a8 f9 X2 l  M# W$ O" G3 L+ @
begin P_read arriving
! e) N# e, f; A) ]; z% }) f4 L: O    while 1=1 do begin& _  {/ j4 n' i/ f; R
        read A_tote from "data.txt" with delimiter "\n"% H5 U6 n( G; X* z7 C- T9 C5 `
        read A_time from "data.txt" with delimiter "\n"1 I' N$ V" E! ^/ U
        read A_leave from "data.txt" with delimiter "\n"
% N9 N7 Q( B+ y! C! _1 b        read A_picks from "data.txt" with delimiter "\n") m4 {# k4 v) s2 v3 w
        set load type to A_tote
8 D- i' W- G" k, X        if A_tote="tote 1" then set A_induct to 1
8 a# t4 V; J$ v2 N8 Q0 A1 s# A        else if A_tote="tote 2" then set A_induct to 2
3 a4 ], |5 B1 R( Z9 N- o0 ^  _            else set A_induct to 3   
: ^6 ]0 `0 P' }& h" L/ \; {( v) C' M# k        set A_i to 0
  J. Z+ |1 q/ N        clone 1 load to P_induction
! c( u+ ^% d% q2 O# P% i        wait for A_time sec
+ X3 e- n# P1 O# S  {    end
9 M( t% v- B8 c. M% L: }end. ]8 @; U# y: h9 W  x
& D& f6 g8 u( V
begin P_induction arriving5 c% _) o  T: _: e
    if A_induct=1 then clone 1 load to P_pick1& v2 U% p4 D6 W1 o6 B3 |7 O- F+ W# X
    else if A_induct=2 then clone 1 load to P_pick2/ r3 ]1 g) S0 {. t; {
        else clone 1 load to P_pick39 |- T7 _  A1 a+ p$ i
end6 Q# A0 `. P1 C3 w

6 a; C% [! u2 f1 v3 x) Hbegin P_pick1 arriving2 q) l3 o3 Y- ?, [
    set A_i to 1
7 t( F& _* |& B' f; {2 R. O    move into Q_induct12 N2 Q9 v% o! M0 t
    move into pickaisle.induct1' ~6 g2 K3 t3 N
    while A_i<=30 do begin
$ x# x3 ?. }. [        travel to pickaisle.con(A_i)
3 W  [2 h2 ^5 B+ \+ Y1 ^) J0 \! j        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
% z0 j4 L# `) D) u5 ~/ b* q        else wait for 10 sec) ~2 R; \0 \' Q
        if A_i=A_leave then send to die
; t% `; Y- A0 v# k, [1 s/ p2 n        else inc A_i by 1& v- b7 X" n6 t) \
    end; W/ m0 T: q% f3 }
end& E$ v- p9 V8 f4 y, P, ]

, ?; B  F" J6 ?0 |7 W: R5 @/ Lbegin P_pick2 arriving
  Z- b0 D7 f1 r0 _6 V! n7 ]    set A_i to 11& n9 c$ e7 A, x( K5 j
    move into Q_induct2
! R3 _7 {1 w* A6 ~. n8 p    move into pickaisle.induct2; V& S7 ?' G" U. k; J5 o9 r3 ?( S
    while A_i<=30 do begin
; }5 o' G3 H' H. f; w+ ~        travel to pickaisle.con(A_i)) F6 Y/ W- k" H' c
        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec0 |$ |) N) T5 N7 G1 j
        else wait for 10 sec8 b- u% q0 S$ w( D  g+ C8 O6 ~. I: S
        if A_i=A_leave then send to die5 f+ e8 V+ Z0 @6 q. g
        else inc A_i by 1
& e7 C+ O/ T& t. k5 j* ?, h    end
" q6 J9 \2 p! Qend6 y6 t6 m/ O7 i( r9 n+ M" I( o

1 J( P3 i/ ?, p, Dbegin P_pick3 arriving- R: P& u! k9 s/ |- A' @3 ?
    set A_i to 211 O1 }; p" ^0 J0 a
    move into Q_induct3
& x( {. W4 C  ]6 K* r, e6 N    move into pickaisle.induct3
0 N8 \% M: P% n    while A_i<=30 do begin
8 k; g& i6 }8 h- A9 i- ]/ o3 e        travel to pickaisle.con(A_i)
7 r7 y+ s8 c6 t( N, f6 Z+ k$ [" z) L0 l        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
0 n0 B0 {/ m- F7 l        else wait for 10 sec: T5 {' S& c1 z& R' J, p
        if A_i=A_leave then send to die; e& S0 C, R9 r9 D
        else inc A_i by 1* E1 d6 j7 b, Y& y/ P0 A
    end1 I4 h6 S4 ^( B3 l0 ^5 l+ S3 O
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是个什么东东?
- h3 i1 \; ~; f& _move into后面,应该是一个station或control point,或者Queue/Container/Vehicle/Segment之类的东西。看你的报错信息,这个induct是个path么?
7 G0 O! K4 R, v3 K1 A2 y' g9 z* B* R: M! m6 T
AutoMod Editor的语法报错信息,有时候会指在下一行,必要的时候要把上下几行都看一下。+ B+ e0 ?2 ]% G# a
3 h/ q% @  i/ l! v
另外,你的几个P_pick是完全重复的,建议以如下方式修改,可以减少代码编写量:
/ c. B" |1 c7 {8 H3 S2 _1. 创建一个Process:名称为P_pick,number of Processes为3,其它按你的需要设置;删除那几个P_pick;
! P3 }; I* z1 d6 Z5 n2. 创建一个Queue:名称为Q_induct,number of Queues为3,其他按你的需要设置并放置;删除那几个Q_induct;+ l1 j! p2 d2 V/ b: C9 Q0 p
3. 以如下方式改写P_induction和几个P_pick的arriving procedure的代码:/ O) H* q9 s+ g3 E
begin P_induction arriving: a  W8 k( u; q( c  z
    clone 1 load to P_pick(A_induct)5 O9 e9 Q& t) D" k( A. F
end最大的系% j* {+ S% G. C* d0 q7 @% O

. w0 b$ L5 X3 ^/ x' Nbegin P_pick arriving
. t6 T" x) a* D3 h; \    set A_i to procindex * 10 + 1
7 U) R  o6 z# _    move into Q_induct(procindex)2 G: e$ z0 ?/ q9 @9 o1 \
    move into pickaisle.induct(procindex)
+ U7 @/ z; U) y  k) E    /*check the type of pickaisle.induct(i), for your last problem.*/" c3 j. ]) `( }. c" V
3 w7 O# _6 n$ k# ^  C
    while A_i<=30 do begin
0 V" h- K1 l/ [  D* X        travel to pickaisle.con(A_i)! i4 h3 r3 d6 M) r$ @3 ^7 a
        if A_picks(A_i)<5 then wait for 5*A_picks(A_i) sec
; ^( Y& s% O1 q2 B        else wait for 10 sec
9 w+ h, N, f3 x; ^        if A_i=A_leave then send to die
7 g& b/ L: `% P8 q" b% Z( |        else inc A_i by 1
+ T/ B1 d( Q2 t7 h5 s8 s% u    end) j/ Z8 W( ~; H: v& Q/ i" o6 P
end
' c( P1 P, h/ Q6 u$ P8 }$ D  s$ m8 T% G: g* p! U9 D6 i
其中的procindex为整形,代表当前process的序号。- A. G' m. `2 v
station和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, 2025-12-30 09:25 , Processed in 0.014484 second(s), 14 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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