关于在1512SP 的CPU中多次使用loop指令问题在1512SP的CPU中使用LOOP指令编写一个5组,每组由32个整数的的排序程序,我使用的方法是用LOOP指令进行循环冒泡的方法进行排序,每组使用两个LOOP指令实现一个组内32个数值进行大小排序,测试第一组正常,但是当测试第二组以后就出现了CPU报警:Buffer overflow for OB 91 events - Function will continue(system reaction),请教高手loop指令最多能使用多少个,使用时对CPU的扫描时间是否有影响?
--------超时会报超时故障的,而你的确是内存除了问题
--------------------Zane,您所提到的内存问题是因为1512sp属于小型PLC本身所带的内存容量过小造成的,还是因为设置问题,麻烦您帮忙指出非常感谢。
之前我联系了西门子技术支持, 1——他告知我loop指令嵌套过多已经溢出造成的,可以更换编程方法,不一定非要用loop指令进行排序,因为使用的是STL语言编程里面可用的指令少的可怜,没有高级指令可以使用,您知道有什么编程方法实现排序吗? 2——他建议我可以用315以上的中型CPU来实现此功能,因为整个项目全系使用1512SP的PLC系统无法更换成315所以此方法我无法接受。 您能给我一些建议吗?非常感谢。
-------- - CPU1512SP的性能应该不比CPU315差的
- LOOP指令是否支持嵌套?我很久远映像中S7-300中就不好使,这种双循环我从来不用系统指令比如FOR循环,LOOP循环的,只用跳转goto
- 程序结构是否规范?造成LOOP指令出错。
- 循环次数的确比较多的,你可以减少比较的数据,增加比较的组数,来验证一下究竟是循环超时还是循环嵌套溢出
- 楼主可以贴下你的程序
- ---------目前我已经实现一个数组的排序功能,程序是引用论坛里面冒泡法排序,功能也实现了,但是现在遇到的问题当我调用第二个数组同时进行排序时就出现上述的报错了,现在的问题是1组可以执行,但是当遇到两组以上同时执行排序功能就报错,我怀疑是不是在一个扫描周期内使用多次LOOP指令时导致,总的循环时间溢出,我也不想用LOOP指令,请问不用LOOP指令如何实现排序功能,仅仅使用跳转这个工作量太大了,对于10个数据以上的就无法操作了,而且STL语言指令非常的少,您有什么好的编程方法解决这个问题吗?
程序如下
// Start
A "DB_SortFunction".Control.Sort_Begin
JCN n500
L 8 //Total Floor
NEXT01 : T #t_Counter2
L 0
T #t_Test01
L 7
NEXT02 : T #t_Counter3
L #t_Test01
L 74
+I
SLW 3
T #t_Counter_test01
L #t_Test01
L 75
+I
SLW 3
T #t_Counter_test02
L #t_Test01
L 106
+I
SLW 3
T #t_Level_test01
L #t_Test01
L 107
+I
SLW 3
T #t_Level_test02
OPN #i_DB_No
L DBB [ #t_Counter_test01]
L DBB [ #t_Counter_test02]
<I
JCN n501
//Exchange sort number
OPN #i_DB_No
L DBB [ #t_Counter_test01]
T #t_temp1
L DBB [ #t_Counter_test02]
T DBB [ #t_Counter_test01]
L #t_temp1
T DBB [ #t_Counter_test02]
//Exchange level number
OPN #i_DB_No
L DBB [ #t_Level_test01]
T #t_temp2
L DBB [ #t_Level_test02]
T DBB [ #t_Level_test01]
L #t_temp2
T DBB [ #t_Level_test02]
n501: NOP 0
L #t_Test01
L 1
+I
T #t_Test01
L #t_Counter3
LOOP NEXT02
L #t_Counter2
LOOP NEXT01
SET
R "DB_SortFunction".Control.Sort_Begin
S "DB_SortFunction".Control.Sort_Begin_02
n500: NOP 0
---------楼主的程序不能满足多次调用的条件,多次调用的子程序中是不能出现全局变量的。
另外,楼主的指针应用也是比较另类的,可能问题就出在这里了。
--------此程序仅仅在测试阶段,所以没有封装,仅仅用于一组独立数据的排序功能,对于您提到的指针应用比较另类的说法,麻烦您详细指出问题点,非常感谢。
-------楼主试过将一组数据排序做成一个FB然后进行多次调用吗?或者可以试试SCL
L #i_DB_nr T #t_DB_nr //装载DB编号 OPN DB [#t_DB_nr] //打开DB块 L #i_start_no //装载起始地址指针 SLD 3 LAR1 //装载AR1指针 L #i_data_len //装载数据长度-1做为数据循环次数 L 1 -I M001: T #s_XH_nr L DBD [AR1,P#0.0] //装载DBD0 L DBD [AR1,P#4.0] //装载DBD4 >R //如果DBD0>DBD4则跳转到标签M002否则继续向下执行 JCN M002 L DBD [AR1,P#4.0] T #s_temp L DBD [AR1,P#0.0] T DBD [AR1,P#4.0] L #s_temp T DBD [AR1,P#0.0] //如果DBD0<DBD4则交换DBD0和DBD4的值 M002: +AR1 P#4.0 //指针偏移4个字节(1个双字) L #s_XH_nr LOOP M001 //装载循环次数,继续跳转到标签M001进行循环 这是我的冒泡排序程序
|