A #glass_id_auto //手动=1
// A "横向打开到位"
// A "纵向打开到位1"
// A "纵向打开到位2"
// A "玻璃到位检测(顶柱)"
JC nt31
NOP 0
O "cnt_read_ok" //编码器数据稳定,可以开始检测
// O "T 允许玻璃识别延时"
// O "M 3工位自动涂胶准备好"
A "对工工位支撑柱玻璃在位"
JCN nt6
SET
R #start_timer
L 0
T #loop_cnt
nxt3: NOP 0
OPN DB [#ProductDBTmp]
L #loop_cnt
L 34
*I
SLW 3
LAR1
L DBD [AR1,P#20.0]
L DBW [AR1,P#28.0]
+D
T #cnt2_cmp_up
L DBD [AR1,P#20.0]
L DBW [AR1,P#28.0]
-D
T #cnt2_cmp_down
L DBD [AR1,P#24.0]
L DBW [AR1,P#28.0]
+D
T #cnt1_cmp_up
L DBD [AR1,P#24.0]
L DBW [AR1,P#28.0]
-D
T #cnt1_cmp_down
A(
L #cntv2_act
// L "TP_cntv2_save"
L #cnt2_cmp_down
>=D
)
A(
L #cntv2_act
// L "TP_cntv2_save"
L #cnt2_cmp_up
<=D
)
A(
L #cntv1_act
// L "TP_cntv1_save"
L #cnt1_cmp_down
>=D
)
A(
L #cntv1_act
// L "TP_cntv1_save"
L #cnt1_cmp_up
<=D
)
JCN nt30
L #loop_cnt
L 1
+I
OPN DB [#AssignDBTmp]
T DBB 13
L DB32.DBB 13
T #glass_type
JU nt3
nt30: L #loop_cnt
L 1
+I
T #loop_cnt
L 16
<I
JC nxt3
L 0
T #glass_type
T DBB 13
S "对中工位玻璃判别失败"
R "对中工位玻璃判别完成"
JU nt6
//由于和客户沟通后决定,不需要做在自动情况下的自动取消涂胶工艺,故取消下列功能
// OPN DB [#AssignDBTmp]
// A DBX 8.2 //取消涂胶?
// JCN n301 //否
// L 100 //是,将取消涂胶编号100发给机器人,任务100为空操作,只
// T #glass_type
// T DBB 13
//n301: NOP 0 //强制涂胶,等待转换到涂胶手动选择
// L 0
// T #glass_type
// T DBB 13
// JU nt6
//nt31: NOP 0
nt31: NOP 0 //手动选择玻璃型号
OPN DB [#AssignDBTmp]
A DBX 23.4
A "对中横向对中汽缸原位"
A "对中纵向对中1汽缸原位"
A "对中纵向对中2汽缸原位"
A "对中吸盘升降汽缸1上升位"
A "对中吸盘升降汽缸2上升位"
A "对中工位真空吸附完成"
JCN nt3
L DBB 12
T #glass_type
T DBB 13
nt3: NOP 0
S "对中工位玻璃判别完成"
R "对中工位玻璃判别失败"
nt6: NOP 0
这个语句表从nxt3开始的程序不知道如何理解,什么左移三位,变量指针加AR1,麻烦高手指点下该语句表如何理解。不甚感激。
最佳答案
这个语句表从nxt3开始的程序不知道如何理解,什么左移三位,变量指针加AR1,麻烦高手指点下该语句表如何理解?
1、首先了解双字指针:
当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是:
其0-2bit,指定bit位,3-18bit指定byte字节。其第31bit固定为0。
AR:
0000 0000 0000 0BBB BBBB BBBB BBBB B*
例如:当AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),实际上就是等于26.4。
2、为什么左移三位?
据上述双字指针的格式,将一个32位整形数据转为双字指针,即字节指针,将这个个32位整形数据左移3位(即乘8)就是字节指针。例如:
L #L100 //装入32为整形数据100
SLD 3 //左移3位(即乘8)
T LD0 //LD0得到P#100.0的指针常数。
3、楼主的程序:
nxt3: NOP 0
OPN DB [#ProductDBTmp] //打开用#ProductDBTmp表示数据块号之DB。
L #loop_cnt
L 34
*I
SLW 3 // #loop_cntch乘以34的结果,再左移3位(即乘8),形成字节指针。
LAR1 //将上述运算结果装入指针AR1。
L DBD [AR1,P#20.0]//取指针AR1加上偏移量20.0为地址的那个DBD中的数据。
L DBW [AR1,P#28.0]//取指针AR1加上偏移量28.0为地址的那个DBW中的数据。
+D // 将上述两者相加
T #cnt2_cmp_up//将上述两者相加存入 #cnt2_cmp_up中。
4、建议楼主系统看看下述两个文档,就全明白了:
、见《关于S7-300和S7-400指针寻址的说明与例程(更新版)(2008.03.04) 》下载:
http://www.ad.siemens.com.cn/download/searchResult.aspx?searchText=F0215
、详见《step7编程之地址概念详解》连接:
http://www.plc365.com/jishu/57.html
提问者对于答案的评价:
谢谢你的回答,很有帮助
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc243956.html