今天我们来解读编码指令的STL源码,一直分不清编码和解码,做了个便于记忆的口诀“编成数,解成位”。以前也用SCL做过类似的功能,正好有朋友私信问我,就拿来解读一下。
源码
接口及源码
INPUT
#IN:DWORD
RETURN
#RET_VAL:INT
逐行解读
1、L 0
2、T #RET_VAL
ACCU1(累加器1)载入整数0
变量#RET_VAL(返回值)载入累加器1的值,也就是0
3、L #IN
4、<>D
5、JCN A001
累加器1载入输入的字型变量,原累加器1中的0载入累加器2。
比较累加器1和累加2中的值是否相等,如果不相等跳转到标签A001处继续执行,如果相等继续往后执行。
6、T #wrkVal
将累加器1的值传递给#wrkVal。也就是临时变量#wrkVal载入#IN的值。
7、A002: L #wrkVal
此处标签A002是代码循环执行跳转用的,载入临时变量#wrkVal的值。
8、SRD 1
9、JP A001
累加器1中的值右移1位,如果移除的位为1,则跳转到A001的位置,如果移除的位为0,则继续往后执行。
10、T #wrkVal
将累加器中执行右移之后的值,载入到临时变量#wrkVal中。
11、L #RET_VAL
12、L 1
13、+I
14、T #RET_VAL
15、JU A002
11-14行则将#RET_VAL的值,执行加1操作。每右移出1位是零就执行加1操作,依次来计算为1的最低位的位置。
跳转到第7行A002标签的位置,继续执行移出位检测。
16、A001: SET
17、SAVE
这两行的含义就是RLO置位,然后在将RLO位保存到BR位。简单来说就是BR位置1,使ENO输出。
流程图
整体理解
将输入的双字变量IN判断是不是0,如果是0就返回0,如果不是0就从低位开始数,碰到有是1的位就停止计数。说白了就是返回双字中为1的最低位。比如:
DWORD#16#0返回0
DWORD#16#1返回0
DWORD#16#10返回4
DWORD#16#100返回8
细心的朋友会发现0和1返回的都是0,没法进行区分。
我们可以对原程序稍加改动,ENO进行区分。修改后效果及STL代码如下:
如果大家有代码需要解读(代码低于60行),欢迎私信给我,我是山东王建设,专注于西门子STL代码解读。
本文暂时没有评论,来添加一个吧(●'◡'●)