位变量间接寻址(标准)实现方法

已锁定

yanxiao

版主

  • 帖子

    12146
  • 精华

    46
  • 被关注

    183

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

位变量间接寻址(标准)实现方法

702

4

2022-07-06 15:23:00

标题中把“标准”二字给括起来,是因为,所谓标准,是多方势力妥协下的产物,个体如果要定标准,则须有独步天下能服众人的影响力。本贴不在“标准”上做文章,就当是一个普通的实现方法。


Smart200不直接支持位的间接寻址,间接寻址由用户编程实现。


1、位地址的表示:

一般位地址表示成:AAAA.b,

其中AAAA是字节(BYTE)或字(WORD)的地址,b是字节或字内的位序号,最低有效位取0。

对于以字节(BYTE)为基本寻址单元的,b取值范围为0-7;

而对字(WORD)为基本寻址单元的,b取值范围为0-15。

对于Smart200,是字节为基本的寻址单元。


2、位地址的参数传递:

可以做成两个独立的参数AAAA和b,分别作为参数传递。

也可以合并成一个参数。

对于8位字节地址,使用8进制合并:8#AAAAb,

也就是原AAAA左移3位,空出的3个BIT位由b占居。

对于16位的字地址,使用16进制合并:16#AAAAb,

也就是原AAAA左移4位,空出的4个BIT位由b占居。

形成的AAAAb具有线性,可增可减,可四则运算。

传送到程序中后,可以进行反运算,分离出AAAA和b。


3、置位、复位、替换、检测

这前三个操作中,替换不是独立的,是用置位和复位实现的。

假设已知AAAA和b:

因为AAAA是字节或字地址,支持间址,所以,使用间址寻址定位到AAAA的变量值。

比如Smart200:AC1 = (&QB0 + AAAA),*AC1就间接寻址到Q区AAAA的变量值。

根据位序号b生成操作模板,以字节为例,b=3生成MASK=2#00001000。

在Smart200中,有现成的指令可用:

DECO b,AC0 // AC0中存放MASK

重点来了:

3.1 置位,使用或运算OR,例:

ORB MASK,*AC1 // 根据MASK置位目标*AC1

如:MASK=2#00001000,会把*AC1中的Bit3置位。

3.2 复位,使用与运算AND,例:

INVB MASK // MASK取反,XORB 16#FF,MASK可以达到同样的效果。

ANDB MASK,*AC1 // 根据MASK复位目标*AC1

如:MASK=2#00001000经反相后变成2#11110111,与运算会把Bit3复位。

3.3 替换,假如位D去替换指定的位

根据D的值,若D=0,执行3.2复位操作,若D=1,执行3.1置位操作。

3.4 检测位状态,使用AND指令

为避免对原始值的影响,运算之前,把目标值复制到临时变量,例:

MOVB *AC1,AC2 // 把*AC1值复制到临时变量AC2中

ANDB MASK,AC2 // 与运算,AC2==0,表示目标位=0,AC2<>0,表示目标位=1


位变量间接寻址(标准)实现方法 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有8941条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。