SCL编程实例100例-124-变量中位的正跳变计数
- 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. 在主程序 OBMain 中调用以上 FBBitRisEdgeCnt,其背景数据块命名为: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