菜鸟:
刚开始用STL编程,想实现的功能是:I0.0到I99.7 to DB36.DBX0.0复制到DB36.DBX99.7,M1000.0到M1099.7 to DB36.DBX100.0复制到DB36.DBX199.7。请问下面的程序有问题吗?
Network1:
OPN "REG_AREA_6_1" //打开DB36
LAR1 P#0.0 //初始化地址寄存器1
L 50 //循环次数(数据个数)
NEXT: T LW 20 //存储当前的循环次数
L IW [AR1,P#0.0] //装载当前IW地址里面的数据到ACCU1(从IW0开始)
CAW //反转ACCU 1-L 中的字节顺序
T DBW [AR1,P#0.0] //将当前ACCU1地址里面的数据写到DB36当前的地址里面
+AR1 P#2.0 //地址寄存器1的内容加P#2.0,相当于PIW的地址递增一个字
L LW 20 //装载当前循环次数
LOOP NEXT //循环次数减一,跳转到NEXT标签,当循环次数减至0,离开循环,往下执行
Network2:
OPN "REG_AREA_6_1" //打开DB36
LAR1 P#1000.0 //初始化地址寄存器1
LAR2 P#100.0
L 50 //循环次数(数据个数)
NEX1: T LW 30 //存储当前的循环次数
L MW [AR1,P#0.0] //装载当前IW地址里面的数据到ACCU1(从MW1000开始)
T DBW [AR2,P#0.0] //将当前ACCU1地址里面的数据写到DB36当前的地址里面
+AR1 P#2.0 //地址寄存器1的内容加P#2.0,相当于PIW的地址递增一个字
+AR2 P#2.0
L LW 30 //装载当前循环次数
LOOP NEX1 //循环次数减一,跳转到NEXT标签,当循环次数减至0,离开循环,往下执行
侠士:
我觉得楼主可以尝试SFC20,没有必要做成这个样子吧
菜鸟:
因为我程序里有两组冗余PLC互传数据的程序,要用到大量的M地址,大概要占用MW1000-MW1998。而且像上面这样的移动数据的程序只是其中一段,像这样的程序也是大量的,怕M地址不够,而且想学习下STL语言,所以编了下,不知道对不对,请指正。
而且有的需要高低字节互换一下,SFC20没法做啊!
请问有人能知道一下吗?
侠士:
你的代码没有问题,但可以做的更精细些。比如:Network1已经打开了DB36,Network2不需要重复操作了;Network2不需要高低字节交换,100个字节刚好25个双字,用双字来操作,循环25次,可以提高代码的执行效率。
可以用块拷贝指令啊