程序员开发实例大全宝库

网站首页 > 编程文章 正文

西门子STL代码解读:ENCO代码块_西门子s-itr指令详解

zazugpt 2025-02-21 16:10:39 编程文章 21 ℃ 0 评论

今天我们来解读编码指令的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代码解读。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表