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