L MW 700
L 1
+I
T MW 700
TAR2 #TEMP_AR2
L 8
T #TEMP_STEP
A #dir
JCN JP01
L -8
T #TEMP_STEP
JP01: AN #dir
= #TEMP1
JC EXIT
L P##src
LAR1
L 0
L W [AR1,P#0.0]
==I
JZ IF01
T #BLOCK_NO
OPN DB [#BLOCK_NO]
IF01: NOP 0
L D [AR1,P#2.0]
LAR1
L #num
T #TEMP_NUM
L 0
==I
JZ EXIT
L #len
T #TEMP_LEN
L 0
==I
JZ EXIT
L P##dest
LAR2
L 0
L W [AR2,P#0.0]
==I
JZ IF05
T #BLOCK_NO
OPN DI [#BLOCK_NO]
L DW#16#5000000
L D [AR2,P#2.0]
OD
JU IF06
IF05: L D [AR2,P#2.0]
IF06: LAR2
A #TEMP1
JC EXIT
L #offset
L 4095
>=I
TAK
JCN JP10
TAK
-I
L 32760
+AR2
TAK
JP10: L 8
*D
+AR2
L #TEMP_NUM
L00P: T #TEMP_NUM
L #len
L00B: T #TEMP_LEN
L B [AR1,P#0.0]
T B [AR2,P#0.0]
L #TEMP_STEP
+AR1
+AR2
L #TEMP_LEN
LOOP L00B
L #TEMP_NUM
LOOP L00P
EXIT: SET
JU SBR
CLR
SBR: SAVE
LAR2 #TEMP_AR2
问题补充:
谢谢,你的问答,这是一个实现数据块内部移动,一次移动七组数据,分别为一个字符串型,一个字符型,五个实型。七个组数据总长为34。一开始的累加和 L DW#16#5000000
L 32760、 L 4095、这些常数和16#5000000
这些看的不太明白是什么意思?最好请大侠给个详细一点的解释,或者给我发一个实现数据内部移动的讲解实例。谢谢!
最佳答案
程序太长了,只能简单的说一下,其他的还得你自己去琢磨:
16#5000000和下面一个数OD的目的就是把这个数的第24和26位强制为1
4095(16#FFF)在你程序中也就是个偏移地址比较值,超过它就减去它。
32760=4095*8表达成32位指针格式就是p#4095.0
把下面这段程序给你注释一下,便于你理解:
L #offset
L 4095
>=I
TAK //ACCU1= #offset,ACCU2= 4095
JCN JP10
TAK //ACCU1= 4095,ACCU2= #offset
-I //ACCU1=#offset-4095
L 32760 //ACCU1=32760=p#4095.0;ACCU2=#offset-4095
+AR2 //AR2=AR2+P#4095.0
TAK //ACCU1=#offset-4095,ACCU2=32760
JP10: L 8
*D //如果 #offset>=4095,此处是(#offset-4095)*8;如果小于4095,此处是(#offset)*8
+AR2 //AR2=AR2+P#(#offset-4095).0或者AR2=AR2+P#(#offset).0
提问者对于答案的评价:
谢谢,你的回答!
专家置评
已阅,最佳答案正确。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc247520.html