有些时候设备的I/O点编址不同,但逻辑程序是一样的,如简单的输送线或气动工作台等,是可以用同样的程序来处理,只是需要将I/O点重新分配,一般的方法是直接改程序,在程序中通过符号表等替换I/Q点,然后下载到PLC。也可以通过对I/Q点间接寻址来实现,将输入/输出点通过内部变量进行功能预定义,然后将功能定义通过间接寻址的方式和实际的I/Q点建立对应关系,在带上位机或HMI的系统中,在上位画面中修改间接寻址数据,实现I/Q点的定义分配。
一,对I点进行间接指定
通过间接寻址可以定位到IB的字节号,
如语句(1)
MOVD &IB0, VD0;
MOVB *VD0, MB0
上述两条语句,即将IB0传送到MB0中;
再多加一条语句 ,形成语句(2):
MOVD &IB0, VD0;
+D VD100,VD0;
MOVB *VD0, MB0
即可通过设置VD100的值,将任意IBxx传送到MB0中
上述只是完成了IB成字节的间接寻址,还不能指定到特定的位,如要完成对I2.3的寻址,先通过对IB2寻址,再找出字节中位3的状态。
在上面语句(2)的基础上,通过VD100=2,将IB2传送到MB0中,再将MB0右移3位,即将I2.3传送到了M0.0中,M0.0=I2.3
将移动的位数(N)变量化,如用字节右移的指令,形成语句(3)
MOVD &IB0, VD0;
+D VD100,VD0;
MOVB *VD0, MB0
SRB MB0 ,VB104
LD M0.0
=M10.0
如设置VD100=2, VB104=3, 则将I2.3的状态传送至M10.0,通过改变VD100和VB104的值,可以将任意I点的状态传动到M10.0中。
假如程序中M10.0指定了某一个外部点信号,如一个按钮或开关量传感器,不管开关量实际接在哪个I点上,通过上面的方式将开关量和M10.0建立映射关系。
在对位寻址时,有多种指令实现,如通过解码指令,将字中特定的位(0-7)置1,将结果字的低8位和MB0进行“与”运算,结果输出到M10.0
二,对Q点进行间接指定
处理方式和I点类似,先定位到QB字节
如语句(1)
MOVD &QB0, VD0;
+D VD100,VD0;
MOVB *VD0, MB0
将VD100指定的QB传送到MB0暂存
下一步,将M10.0的状态写入到MB指定的位(N:0~7)中,如可以通过循环移位指令实现。(对QB操作,除指定的位之外,要保护其他位不受影响)。
(1),将MB0循环右移N位,
(2),M10.0传送到M0.0,
(3) , 将MB0循环左移N位,
上述处理之后,MOVB MB0,*VD0,再将MB0回传到间接寻址的QB中。
上述过程的完整语句(3)
MOVD &QB0, VD0;
+D VD100,VD0;
MOVB *VD0, MB0
RRB MB0, VB104
LD M10.0
= M0.0
RLB MB0, VB104
MOVB MB0,*VD0
三,按上述方法写一个可供调用的子程序块
1,对I点的间接寻址
LB0 IN BYTE 指定IB字节号
LB1 IN BYTE 指定IB位号
S_bit:L2.0 OUT BOOL 输出到特定的位
程序功能:将 I (LB0 .LB1 ) 传送到 S_bit:L2.0
LDB> LB0, 31
OB> LB1, 7
CRET
LD Always_On:SM0.0
BTI LB0, LW4
ITD LW4, LD6
MOVB *LD6, LB3 //IB (LB0) 传到 LB3
LDB> LB1, 0
RRB LB3, LB1 //LB3 右移
LD L3.0
= #S_bit:L2.0 //点状态读出
2,对Q点的间接寻址
LB0 IN BYTE 指定IB字节号
LB1 IN BYTE 指定IB位号
S_bit:L2.0 IN BOOL 待输出的特定位状态
程序功能:将S_bit:L2.0 传送到 Q (LB0 .LB1 )
LDB> LB0, 31
OB> LB1, 7
CRET
LD Always_On:SM0.0
BTI LB0, LW4
ITD LW4, LD6
+D 16#01000000, LD6
MOVB *LD6, LB3 //QB (LB0)传至LB3
LDB> LB1, 0
RRB LB3, LB1 //循环右移
LD #S_bit:L2.0
= L3.0
LDB> LB1, 0
RLB LB3, LB1 //循环左移
LD Always_On:SM0.0
MOVB LB3, *LD6 //输出到QB
个人浅见,如有错漏,敬请斧正!
(完) |