发布于 2011-04-03 16:08:41
14楼
ORGANIZATION_BLOCK 主程序:OB1
TITLE=格雷码转换,单圈格雷码编码器,要做到类似多圈格雷码编码器的计数,也就是说当过圈时能正确的计数,例如:3,2,1,0-1,-2 253,254,255,256,257循环
// 1,编码器最高位必须使用支持上升沿和下降沿中断的端子,本例使用I0.0
// 2,本例为8位编码器,使用IB0通道,也可以使用其他通道
// 3,需要注意的是编码器的最高位对应的IO端子,不要出错
// 4,当PLC掉电时,MD0掉电保持,可以得到有限的数据准确性。因为如果编码器刚好在0或255位置时,可能不能 正确 的计数(因为不能准确的产生中断)
// 5,IB通道滤波时间0.2秒,以便及时的读取编码器数据
// 6,转换出来的数据到VB3,得到实际的数据时使用VD0,不需要I_D的转换
BEGIN
Network 1
// 初始化
LD SM0.1
CALL SBR1
Network 2 // 网络标题
// 1,格雷码转换
// 2,编码器位置计算
LD SM0.0
CALL SBR0
MOVD VD0, VD4
+D MD0, VD4
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK GRAY_BIN_B:SBR0
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD I0.0
= V3.7
Network 2
LD V3.7
AN I0.6
LDN V3.7
A I0.6
OLD
= V3.6
Network 3
LD V3.6
AN I0.5
LDN V3.6
A I0.5
OLD
= V3.5
Network 4
LD V3.5
AN I0.4
LDN V3.5
A I0.4
OLD
= V3.4
Network 5
LD V3.4
AN I0.3
LDN V3.4
A I0.3
OLD
= V3.3
Network 6
LD V3.3
AN I0.2
LDN V3.3
A I0.2
OLD
= V3.2
Network 7
LD V3.2
AN I0.1
LDN V3.2
A I0.1
OLD
= V3.1
Network 8
LD V3.1
AN I0.7
LDN V3.1
A I0.7
OLD
= V3.0
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK 初始化:SBR1
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD SM0.0
ATCH INT0, 0
AENO
ATCH INT1, 1
AENO
ENI
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_2:SBR2
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_3:SBR3
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK 上升沿中断:INT0
TITLE=中断程序注释
BEGIN
Network 1 // 网络标题
// 在上升沿中断里,如果第6位OFF则把原来的数据A加256=A
LDNI I0.6
+D 256, MD0
END_INTERRUPT_BLOCK
INTERRUPT_BLOCK 下降沿中断:INT1
TITLE=中断程序注释
BEGIN
Network 1 // 网络标题
// 在下降沿中断里,如果第6位OFF则把原来的数据A-减256=A
LDNI I0.6
-D 256, MD0
Network 2 // 网络标题
// 网络注释
END_INTERRUPT_BLOCK