谁能够把这注解一下,给大家分享一下,谢谢了
LAR1 P##SOURCE
L B#16#10
T LB [AR1,P#0.0]
L B#16#2
T LB [AR1,P#1.0]
L #LENG
T LW [AR1,P#2.0]
L #SOU_DB
T LW [AR1,P#4.0]
L P#DBX 0.0
T LD [AR1,P#6.0]
LAR1 P##DEST
L B#16#10
T LB [AR1,P#0.0]
L B#16#2
T LB [AR1,P#1.0]
L #LENG
T LW [AR1,P#2.0]
L #DES_DB
T LW [AR1,P#4.0]
L P#DBX 0.0
T LD [AR1,P#6.0]
CALL "BLKMOV"
SRCBLK := #SOURCE
RET_VAL := MW 0
DSTBLK := #DEST
注解:
L B#16#10
T LB [AR1,P#0.0]
装载语法标示(ID)并且传送给ANY指针
L B#16#2
T LB [AR1,P#1.0]
装载数据类型字节并传送给ANY指针
L #LENG
T LW [AR1,P#2.0]
装载字节传送给ANY指针(字节长度由LENG变量指定)
L #SOU_DB
T LW [AR1,P#4.0]
L P#DBX 0.0
T LD [AR1,P#6.0]
指定数据块号为SOU_DB,起始地址为DBX0.0
下面为目标地址ANY指针,含义与源地址ANY指针相同。
因为SFC20的INPUT,OUT端的数据类型都是ANY指针,所以必须按照ANY指针格式处理。
在此给你作了解释,亿万电器论坛和中华工控网上你发的帖子就不再做重复解释了。
LAR1 P##TEMP5
L B#16#10
T LB [AR1,P#0.0]
L B#16#2
T LB [AR1,P#1.0]
L #IN4
T LW [AR1,P#2.0]
L #IN0
T LW [AR1,P#4.0]
L W#16#84
T LB [AR1,P#6.0]
L W#16#0
T LB [AR1,P#7.0]
L #IN1
SLW 3
T LW [AR1,P#8.0]
LAR1 P##TEMP6
L B#16#10
T LB [AR1,P#0.0]
L B#16#2
T LB [AR1,P#1.0]
L #IN4
T LW [AR1,P#2.0]
L #IN2
T LW [AR1,P#4.0]
L W#16#84
T LB [AR1,P#6.0]
L W#16#0
T LB [AR1,P#7.0]
L #IN3
SLW 3
T LW [AR1,P#8.0]
CALL "BLKMOV"
SRCBLK :=#TEMP5
RET_VAL:=#TEMP7
DSTBLK :=#TEMP6
注释:
temp5和temp6是ANY指针变量,整个程序的主要部分就是构建一个完整的ANY指针,以temp5为例:
LAR1 P##TEMP5 //将TEMP5的指针存放在地址寄存器1里
L B#16#10
T LB [AR1,P#0.0] //写入ANY指针的第一个字节B#16#10
L B#16#2
T LB [AR1,P#1.0] //写入ANY指针的第二个字节B#16#2,表示数据的读取以字节位单位
L #IN4
T LW [AR1,P#2.0] //写入ANY指针的第二个字 数据的长度
L #IN0
T LW [AR1,P#4.0] //写入ANY指针的第三个字节 DB块号
//
L W#16#84
T LB [AR1,P#6.0]
L W#16#0
T LB [AR1,P#7.0]
//以上这个部分改成如下比较好
L W#16#84
T LW [AR1,P#6.0] //表示数据的类型是DB块数据
L #IN1
SLW 3 //左移动三位的目的是,IN1输入的是起始字节的号,而地址指针里处理字节地址外,还有位地址,而左移动三位后相当于乘以8,这样就得到了字节的地址
T LW [AR1,P#8.0] //对ANY指针的最后一个双字进行赋值,表示的是数据的地址,
整个程序的意思就是根据输入的变量IN0---IN4,将一个DB块的数据拷贝到另外一个DB块里,
IN0和IN1对应的是来源的数据,IN2和IN3对应的是目标的数据,IN4是数据的长度,两者是一样的。
ANY 指针定义的存储区如果不在过程映像区,则不能使用 SFC20 进行复制,首先,必须将位于过程映像之外的输入数据按照连续顺序复制到全局数据块中,然后再使用 SFC20 将数据从全局数据块 (数据源) 复制到目标数据区 (输出、标记、数据块),不能使用ANY 指针直接访问外设地址区如“P#PE300.0 BYTE 16”。
下图示例了如何将数据从外设地址区PEW300 复制到 DB5 数据块。
注意:
在上述示例中使用 SFC20 (BLKMOV) 要占用CPU大量循环时间,因此这也涉及到CPU装载存储区的使用问题。在这种情况下使用装载和传送指令比较好例如
L PEW 300
T DB5.DBW0
间接寻址的示例程序如下:
文件"PAE.zip"包含使用间接寻找访问PQ数据区的示例程序,对输出模块是只写操作,对输入模块为只读操作,文件"PAE.zip"包含两个STL源文件。
你好!
使用说明!
SRCBLK INPUT ANY I、Q、M、D、L 指定要复制的存储区(源区域)。不允许指定STRING类型的数组。
RET_VAL OUTPUT INT I、Q、M、D、L 在功能执行时如有故障发生,此参数值中包含故障代码。
DSTBLK OUTPUT ANY I、Q、M、D、L 指定要将数据复制到的存储区(目标区域)。不允许指定STRING类型的数组。
注意源区域与目标区域一定不可以交叉。如果指定的目标区域大于源区域,此功能只将源区域中包含的数据复制到目标区域。如果指定的目标区域(DSTBLK参数)小于源区域(SRCBLK参数),则功能仅复制所能写入到目标区域的尽可能多的数据。如果实际存在的目标区域或源区域小于源区域或目标区域的存储区的参数集大小(SRCBLK、DSTBLK参数),则数据将不传送。如果ANY指针(源或目标)是布尔类型,则指定的长度必须是8的倍数;否则SFC将不能执行。源或目标参数(或二者都)的数据类型也可以为STRING。如果源为字符串,将只复制该字符串的当前字符。如果源和目标为字符串,则复制字符数目的当前长度将被写入。 如果要复制包括最大长度和实际长度的字符串,可如下操作:创建自己在SRCBLK和DSTBLK参数中使用的ANY指针请使用BYTE数据类型完成此操作。
特性:如果用SFC 20 BLKMOV将未链接的数据块复制并装载到RAM (例如,通过编程设备),SFC将被延时多达几毫秒。这会导致一个长的OB循环时间,可能会使循环监控报警。所以应避免在CPU通过SFC 20 复制块时装载这类块。
看指令相应帮助文件就清楚了!
L W#16#3230 // Load ASCII first and second value of the year ‘20‘ (for 2000 year)
T LW 26 // Save in temporary ASCII array
L P#0.0 // Load start address
LAR1 // Save this address in address register 1
L 0 // Load start address
SLD 3