[西门子] SCL编程实例100例-124-变量中位的正跳变计数

[复制链接]
查看98 | 回复0 | 昨天 07:54 | 显示全部楼层 |阅读模式
>

- 1 - 问题描述



输入一个双整型数据(32 位),记录数据中发生正跳变(上升沿)的位的个数。


图 1 正跳变计数


- 2 - 算法分析



定义一个和输入数据长度一样的掩码变量,通过 FOR 循环语句对掩码变量进行循环移位,用得到的移位结果和输入数据做与运算,比较两个相邻扫描周期的与运算结果,即可得到输入数据的位的正跳变(上升沿)个数。


- 3 - 实验环境



硬件:

CPU 1214C DC/DC/DC。


图 2 PLC 硬件

软件:

TIA Portal V16 Upd6。

S7-PLCSIM V16。


- 4 - 程序设计



添加功能块 FB。

命名为:BitRisEdgeCnt。

1. 定义接口变量。


图 3 定义接口变量

定义输入变量 status,数据类型为双整型,作为待记录的位的正跳变的输入数据;

定义输出变量 risEdgeCnt,数据类型为整型,作为位的正跳变计数的输出;

定义静态变量 statMask,数据类型为双整型,作为判断位的正跳变的掩码;

定义静态变量 statStatusLast,数据类型为双整型,作为输入变量 status 的上个扫描周期的中间变量;

定义静态变量 statRisEdgeCnt,数据类型为整型,作为记录位的正跳变计数的中间变量;

定义静态变量 statRisEdgeCntLast,数据类型为整型,作为记录位的正跳变计数的上个扫描周期的中间变量;

定义临时变量 tempI,数据类型为整型,作为循环语句的循环变量。

为掩码变量 statMask 设置了默认起始值 16#1。

2. 编写算法代码。


图 4 编写功能块

以上代码可以实现对双整型数的 32 个位的正跳变(上升沿)的计数,使用掩码移位和输入变量做与运算,然后比较相邻两个扫描周期的与运算结果。对以上代码稍做改动也可以得到位的负跳变(下降沿)的计数。

3. 创建一个全局数据块。命名为:GdbBitRisEdgeCnt,作为以上 FB BitRisEdgeCnt 的实参。


图 5 全局数据块

4. 在主程序 OB Main 中调用以上 FB BitRisEdgeCnt,其背景数据块命名为:InstBitRisEdgeCnt,配置实参。


图 6 功能块调用

- 5 - 功能测试



在 TIA Portal 中仿真启动 PLC。

修改变量 status 的值,从 16#0000 0000 修改为 16# 1010 1111,共有 6 个位正跳变,记录结果为 6。

图 7 测试案例 1

修改变量 status 的值,从 16#1010 1111 修改为 16# 1111 0000,共有 4 个位负跳变和 2 个位正跳变,记录结果为 2。


图 8 测试案例 2




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

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

本版积分规则