这个代码块是跟前期解读的FIFO块配合使用,当时看到那个代码块,只有出队列的功能,今天找到这入队列的代码块,解读一下。当年这个代码我是抄到本子上,一行行在后面加注释的。
接口与源码
代码解读
1、L P##TABLE
2、LAR1
将指针的地址载入地址寄存器1,此时地址寄存器存储的是table的实参地址。
3、L W#16#0
4、L W [AR1,P#0.0]
5、==I
6、JZ IF01
判断指针第一个字是否为0(0则不是DB块,非零就是DB块编号),如果不是DB块则跳转到第9行标签处执行。
7、T #BLOCK_NO
8、OPN DB [#BLOCK_NO]
如果指针指向的是DB块,就打开DB块。
9、IF01: NOP 0
10、L D [AR1,P#2.0]
11、LAR1
将指针的后4个字节(就是1个跨区域的32位指针)载入累加器1,此时地址寄存器存储的是队列的存储空间。
12、L W [AR1,P#0.0] //队列的长度
13、L W [AR1,P#2.0] //当前队列存储的数量
14、>I
15、JCN FAIL
如果队列满了则跳转到29行位置,队列没满从16行继续执行。
16、L 1
17、+I
18、T W [AR1,P#2.0]
将当前队列的存储数量加1。
19、L 1
20、+I
21、SLD 4
存储数量加1左移4位,就是队列末尾位置跟队列开头位置的指针偏移。
22、TAR1
23、+D
24、LAR1
将地址寄存器1存储的指针位置定位到队列的末尾。
25、L #DATA
26、T W [AR1,P#0.0]
将INPUT接口区要加入队列的数值#DATA存入队列的末尾。
27、SET
28、JU SBR
29、FAIL: CLR
30、SBR: SAVE
27-30行处理程序块的ENO。
当队列满的时候从第29行执行,ENO位无输出。
当正常存入数值时,执行第27、28、30行,使能输出ENO。
总结:块需要在调用时应采用上升沿调用,将输入的值放到队列的最后位置,并将队列当前计数加1。队列的第一个位置(字)是队列的长度,第二个字是当前队列的长度,从第三个字开始存储数据。与这个指令配合使用的还有FIFO,LIFO指令。
如果大家有代码需要解读,欢迎私信给我,我是山东王建设,专注于西门子STL代码解读,期待您的收藏与关注。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/9908.html