[西门子] S7-200smart 对I/Q点的间接寻址

[复制链接]
查看93612 | 回复0 | 2024-3-20 19:41:18 | 显示全部楼层 |阅读模式
有些时候设备的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



个人浅见,如有错漏,敬请斧正!

(完)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则