请高手解释一下这段程序原理

L     P##DATA_FIELD              
      LAR1  
      L     B [AR1,P#1.0]               
      JL    ERR0                        
      JU    ERR0                        
      JU    ERR0                        
      JU    BYT0                        
ERR0: L     W#16#8080                   
      JU    ERR3                        
BYT0: L     W [AR1,P#2.0]               
      L     50                          
      <I    
      JC    ERR4

      L     P##LIST_SLAVES_NOT_PRESENT  
      LAR1  
      L     B [AR1,P#1.0]               
      JL    ERR1
      JU    ERR1                        
      JU    BOL1                        
      JU    BYT1                        
      JU    ERR1                        
      JU    WRD1                        
      JU    ERR1                        
      JU    DWD1                        
ERR1: L     W#16#8080                   
      JU    ERR3 
      程序截取一段,DATA_FIELD在程序入口幅值P#DB140.DBX0.0,#LIST_SLAVES_NOT_PRESENT赋值为P#DB140.DBX 52.0  DWORD 4,DB140定义见截图,
1: L     P##DATA_FIELD ,为什么有两个#号?不是很理解?
2:请高手解答一下这条指令 L     B [AR1,P#1.0] 什么原理,为什么地址寄存器加1后可以判断是否是byte的类型,不知道我理解的对不对?那么这个B是什么意思,同样下面那个 L     W [AR1,P#2.0] ,跟50也就是数组的长度是什么关系呢?

图片说明:

请高手解释一下这段程序原理   

最佳答案

1: L     P##DATA_FIELD ,为什么有两个#号?不是很理解?
#data_field是你定义的IN变量,前面加p#就是取这个变量(ANY类型)的首地址,例如输入变量为p#db1.dbx2.0 byte 4,那么得到的结果就是db1.dbx2.0。
2:请高手解答一下这条指令 L     B [AR1,P#1.0] 什么原理,为什么地址寄存器加1后可以判断是否是byte的类型,不知道我理解的对不对?那么这个B是什么意思,同样下面那个 L     W [AR1,P#2.0] ,跟50也就是数组的长度是什么关系呢?
这个你必须先了解ANY数据类型的格式。ANY总共10个字节,第1字节S7 PLC固定是10,第2个字节代表数据类型,其中02表示BYTE,因此你的程序里就是判断这个字节的数据是不是2。第3,4个字节是数据长度,第5,6个字节是DB块号,第7,8,9,10个字节是首地址(双字指针格式)。
3.B和W其实就是字节和字,只不过存储区是由AR1决定的,因为你前面AR1取的是输入的首地址,因此W[AR1,P#2.0]其实就是ANY的第3,4个字节,保存的是数据长度。

提问者对于答案的评价:
谢谢,对any数据不是很懂,

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc236197.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月1日 下午3:36
下一篇 2018年12月1日 下午3:36

相关推荐