恭喜,你发布的帖子
发布于 2016-11-10 13:51:52
5楼
艾侠:请帮我看看我的程序错在哪里,程序报错CPU停止,但程序应该是已经正确执行了。程序在FC1内, DB1,DB2,DB3三个any类型;DB1在输入参数,DB2,DB3在输入/输出参数。其余都是临时变量,都是整形类。DB1存放1,2....20,共20个INT,程序执行后DB2内存放2,4...20,10个数,DB3存放1,3...19,10个数。程序应该是执行了,但CPU是报错的。不明白是啥原因,哪位大侠有时间帮我看看,谢谢
FC1 内程序:
L P##getw //IN参数any类型 取数
LAR1
L W [AR1,P#4.0]
T #db_no //取出DB号
L W [AR1,P#2.0]
T #length //取出长度
L D [AR1,P#6.0]
LAR1
next: OPN DB [#db_no]
L W [AR1,P#0.0]
T #ini_w //得到数据区第一个字
......................................................................
L #ini_w
L W#16#1
AW
L W#16#0
==I
JCN a00 //逻辑结果为0即奇数时跳转
L #ini_w
T #even //偶数放even
...........................................................................
L P##even_db
LAR2
L W [AR2,P#4.0] //取出DB号
T #evendb_no
L D [AR2,P#6.0] //数据地址
LAR2
L #evenposi //填放的位置,数据字
SLD 3
+AR2
OPN DB [#evendb_no] //打开DB块
L #even //存放偶数
T W [AR2,P#0.0]
L #evenposi
L 2
+I
T #evenposi //每次后移2字节
+AR1 P#2.0
L #length
LOOP next
JU d00
..................................................................................
a00: L #ini_w
T #odd //是奇数转放odd
L P##odd_db //out参数any类型
LAR2
L W [AR2,P#4.0]
T #odddb_no //取出DB号
L D [AR2,P#6.0]
LAR2 //ar2存放首地址
L #oddposi //首字左移3位作地址
SLD 3
+AR2
OPN DB [#odddb_no] //打开DB块
L #odd
T W [AR2,P#0.0] //填放数据
L #oddposi
L 2
+I
T #oddposi
+AR1 P#2.0
L #length
LOOP next
......................................................................................
d00: BE
另外:艾侠的程序,这里不是太懂“
L 0
T #TEMP14
CALL "FILL"
BVAL :=#TEMP14
RET_VAL:=#TEMP10
BLK :=#TEMP12
CALL "FILL"
BVAL :=#TEMP14
RET_VAL:=#TEMP11
BLK :=#TEMP13
TEMP12,TEMP13赋初值0,程序里用在哪里了?还请明示,谢谢!
首先,我觉得程序写的有点乱,最好不要这么写,为什么不把提取DB号,地址,数据长度这些问题,在执行奇偶数之前就做好呢?第二,CPU报警的问题是loop 在不同的位置却到同一个next,不妨先删除一个loop看看,是否还有CPU停机的问题。
关于:
L 0
T #TEMP14
CALL "FILL"
BVAL :=#TEMP14
RET_VAL:=#TEMP10
BLK :=#TEMP12 是一个ANY指针对应奇数的DB块
CALL "FILL"
BVAL :=#TEMP14
RET_VAL:=#TEMP11
BLK :=#TEMP13 是一个ANY指针对应偶数的DB块
具体的用法可以看SFC21的功能,就是一个清零的作用,这样当初始数据发生变化后,之前判断的数据就会被清除,不会留下痕迹。
强烈建议:读取ANY指针信息的步骤在之前就做好,并命名好临时变量的名称,方便查看程序。
请填写推广理由:
分享
只看
楼主